Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Slimme Kruidenbak Eco-systeem: Alexa-ingeschakelde Indoor Tuin Kit

Onderdelen en Benodigdheden

Amazon Alexa Echo Dot 1
Arduino UNO 1
Espressif ESP8266 ESP-01 1
Arduino Proto Shield 1
Arduino 4 Relais Shield 1
Aqua Pomp 2
Plantengroeilamp 1
220V DC Voeding 1
12V DC Voeding 1
USB Voeding + Kabel 1
Luchtslang 1
Draadjes (generic) 1

Apps en Online Diensten

  • Arduino IDE
  • Amazon Alexa Skills Kit
  • Amazon Web Services AWS Lambda
  • PHP Web Server

Over dit Project

Omdat mijn planten altijd lieden van te veel of te weinig water en ik graag veel kruiden in mijn gerechten gebruik, besloot ik een aangepast irrigatiesysteem te bouwen. De kruidenbak moet configureerbaar zijn en automatisch of handmatig werken. Een webinterface stelt instellingen in en toont vochtigheid in een grafiek. De laatste stap was spraakbesturing via Amazon Alexa voor vochtigheidsopvraging, lamp aan/uit en irrigatie-start als automatisering uitstaat.

Ik begon met de technische kant en kocht een Arduino. Na enkele tutorials beheerste ik de software en besturing. Ik bestelde een WiFi-controller, vochtigheidssensoren, pompen, een plantengroeilamp en benodigde hardware (relais shield om lamp- en pompstromkringen van de Arduino te scheiden, draden en beukenhout voor de frame). De Arduino-code is in deze tutorial; de website/API-code niet (tenzij de vraag erg groot is).

Stap 1: Vochtigheidssensor

De eerste mijlpaal was vochtigheid uitlezen met de Arduino. De YL-69 sensor is eenvoudig aan te sluiten: VCC aan een GPIO-pin (bijv. pin 6), GND aan GND, A0 aan een analoge pin (bijv. A1).

byte vccPin = 6;
byte dataPin = A1;

void setup() {
  pinMode(vccPin, OUTPUT);
  digitalWrite(vccPin, LOW);
  Serial.begin(9600);
  while (!Serial);
}

int readHumidity() {
  digitalWrite(vccPin, HIGH);
  delay(500); // test hoe lang vooraf voeden nodig is
  int value = analogRead(dataPin);
  digitalWrite(vccPin, LOW);
  return 1023 - value;
}

void loop() {
  Serial.print("Vochtigheidsniveau (0-1023): ");
  Serial.println(readHumidity());
  delay(10000);
}

Stap 2: Relais voor Pompen en Lamp

Volgende stap: een 4-relais shield voor scheiding van de stroombanen. Arduino draait op 5V, pompen op 12V, lamp op 230V. De shield verbindt met 5V en GND van de Arduino. Elk relais heeft een GPIO-pin om in/uit te schakelen. Een jumper voor VCC JC naar VCC op de shield, of een extra batterij (beter, maar nog niet geïmplementeerd).

Belangrijk: mijn shield schakelt "Aan" met "LOW" op de pin. Zodra de pin als OUTPUT gedefinieerd is, wordt hij actief. In code moet je altijd naar INPUT en LOW schakelen om het relais uit te zetten. Standaard zijn Arduino-pinnen INPUT en LOW.

byte pump1 = 11;
byte pump2 = 10;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  pinMode(pump1, OUTPUT);
  digitalWrite(pump2, LOW);
}

void loop() {
  digitalWrite(pump1, HIGH); // pomp1 uit
  pinMode(pump2, INPUT);     // pomp2 uit
  delay(1000);
  digitalWrite(pump1, LOW);  // pomp1 aan
  pinMode(pump2, OUTPUT);    // pomp2 aan
  delay(1000);
}

Stap 3: WiFi met ESP-01

De ESP8266 ESP-01 met de Arduino verbinden voor WiFi was het lastigste deel. Het kostte uren om het werkend te krijgen.

ESP-aansluiting: VCC=3.3V, GND=GND, CH_PD=3.3V, TX=Pin 2, RX=Pin 3. Voor productiegebruik: gebruik een level converter 5V→3.3V voor pin 2 en 3. Bij mij werkte het zonder.

De ESP-01 is een aparte microcontroller. Voor communicatie met de Arduino: seriële communicatie. Arduino UNO gebruikt standaard pin 0/1 voor RX/TX, maar die dienen voor USB debugging. Dus SoftwareSerial.h gebruiken met eigen pinnen.

#include <SoftwareSerial.h>
SoftwareSerial espSerial(3,2); // RX, TX

void setup() {
  Serial.begin(9600);
  espSerial.begin(115200); // later 9600 na AT+UART_DEF=9600,8,1,0,0
  while (!Serial);
}

void loop() {
  if (espSerial.available()) Serial.write(espSerial.read());
  if (Serial.available()) espSerial.write(Serial.read());
}

Met bovenstaande script kun je AT-commando's in de seriële monitor typen en resultaten zien. Seriële communicatie is foutgevoelig, dus baudrate verlaagd van 115200 naar 9600.

Het script gebruikt HTTP 1.0 (bij HTTP 1.1 zitten bytes in het antwoord). Let op regelafbreking na AT+CIPSEND, anders byte-verzendfout.

Stap 4: De Houten Bak

Het frame was ontworpen om alle elektronica en drie supermarktkruidenpotten te bevatten. Afmetingen gemeten, posities gestructureerd. Vier vochtigheidssensoren, twee pompen, Arduino + shield, 4-relais shield, USB-plug en draden moeten passen. Gemaakt van beukenhout voor sterkte en waterbestendigheid zonder extra lak.

De gaten gezaagd met decupaagzaag op eigen gemaakte zaagtafel. Plantenhouders in de gaten gelijmd met lijmpistool. Zijkanten met houtlijm (D3 voor waterbestendigheid). Geen schroeven of nagels behalve voor de bodemplaat.

Alle circuits, draden en waterbuizen in de bak, sensoren en buizen naar extern waterreservoir uitgehaald. Voordat de bak dichtging, schoteltjes toegevoegd om waterdruk te voorkomen en elektronica te beschermen.

Stap 5: De Website/API

De API en website zijn gebaseerd op jQuery, Bootstrap, X-editable (inline AJAX formulieren) en Chart.js (vochtigheidsgrafiek), gecodeerd in PHP. Op de website kun je instellingen voor de Arduino definiëren (sensorpinnen, controle-interval, pompen per plant, VCC-pinnen, licht VCC-pin) en de huidige vochtigheid + grafiek bekijken.

Configuratie wordt via JSON aan de Arduino geleverd. Na opstarten en op interval controleert de kruidenbak op nieuwe instellingen. Voor JSON-parsing op Arduino: ArduinoJson bibliotheek. Voor polling-interval: StensTimer bibliotheek.

Stap 6: Alexa Integratie

De website biedt een API voor Alexa-communicatie. Het fungeert als hub: ontvangt JSON van Alexa, vertaalt naar custom JSON voor Arduino (bijv. lamp aan, plant 1 besproeien). De Arduino polled voor nieuwe acties en voert ze uit.

Omdat spraakopdrachten meer zijn dan aan/uit, implementeerde ik een Alexa Skill (geen Smart Home). AWS Lambda stuurt de request JSON naar mijn API, die de intents parseert.

var https = require('https');
exports.handler = (event, context, callback) => {
  var postData = JSON.stringify(event);
  var options = {
    host: '<MIJN-SERVER>',
    path: '<MIJN-API-PAD>',
    port: 443,
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Content-Length': postData.length,
    }
  };
  var postRequest = https.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
      console.log('Response: ' + chunk);
      callback(null, JSON.parse(chunk));
    });
  });
  postRequest.write(postData);
  postRequest.end();
};

Een uittreksel van de gebruikte intents:

  • ReadHumidityIntent "Hoe gaan mijn planten"
  • ReadHumidityIntent "Hoe gaat mijn {plantNaam}"
  • IrrigatePlantIntent "Besproei mijn planten"
  • IrrigatePlantIntent "Besproei mijn {plantNaam} voor {duurSeconden} seconden"
  • SwitchIntent "Schakel de lamp {staat}"
  • ReadIrrigateIntent "Welke planten hebben water nodig"
  • ReadLastIrrigationIntent "Wanneer was de laatste besproeiing van mijn {plantNaam}"

Locale-ondersteuning voor Duits en Engels toegevoegd.

Het Resultaat

Een houten bak voor supermarktkruidenpotten, met waterbuizen en vochtigheidssensoren in de aarde en buizen in een extern waterreservoir. Met Alexa-integratie:

  • "Alexa, vraag kruidenbak hoe mijn planten zijn" – Antwoord: "Plant 1 is goed, Plant 2 is droog, ..."
  • "Alexa, zeg kruidenbak mijn basilicum 5 seconden te besproeien" – Antwoord: "Basilicum wordt 5 seconden besproeid"
  • "Alexa, vraag kruidenbak welke planten irrigatie nodig hebben" – Antwoord: "Plant 1 is droog, Plant 3 is droog, ..."
  • "Alexa, vraag kruidenbak wanneer de laatste besproeiing was van mijn basilicum" – Antwoord: "Laatste besproeiing van basilicum was 36u geleden"
  • "Alexa, zeg kruidenbak de lamp aan te zetten" – Antwoord: "Plantengroeilamp ingeschakeld"

Geplande Functies

  • Energiespaarmodus voor Arduino-broncode
  • Externe Arduino Nano's met draadloze communicatie (2,4 GHz) voor vochtigheidsmeting van andere planten in huis (bak is WiFi-hub) – alleen op batterijen
  • API uitbreiden voor meerdere kruidenbak-instanties, voor vrienden
  • Knop op de bak voor irrigatie en lamp zonder website of Alexa
  • Afbeeldingen in Alexa-skill respons (kaart)

Update 23-03-2018

Twee nieuwe intents toegevoegd, belangrijk voor geplande externe Arduino Nano's die alleen vochtigheid loggen:

  • Welke planten zijn droog
  • Wanneer was de laatste besproeiing

Code

De complete code bestaat uit meerdere bestanden:

  • EcoActionBuffer.h / .cpp
  • Plant.h / .cpp
  • WhiteWalnut.ino (hoofdsketch)
  • WhiteWalnutApi.h / .cpp

De volledige broncode is te vinden in de originele tutorial. Belangrijkste componenten:

  • EcoActionBuffer: beheert acties van de API-stack (lezen, verwerken, timer-callbacks)
  • Plant: vertegenwoordigt een plant met vochtigheidssensor, controle-interval, API-update
  • WhiteWalnutApi: WiFi-verbinding (ESP-01), HTTP-verzoeken, JSON-parsing met ArduinoJson, actie-ontvangst/-verzending
  • Hoofdsketch: initialiseert 4 planten (LINKS, MIDDEN, RECHTS, EXTERN), WiFi, timers voor periodieke API-update en actie-opvraging

Schema's

  • Communicatie- en interface diagram
  • Alle geïmplementeerde intents voor Alexa (meertalig)
  • Alexa JSON parsing instap

Productieproces

  1. Web-gestuurd DMX-verlichtingssysteem – Arduino Master Controller
  2. Bluetooth-gecontroleerde Arduino Spybot bouwen
  3. SERENA: Een Aangepast Arduino Mega 2560 Alarmsysteem Met TFT LCD Touchscreen
  4. Compact Weerstation: Arduino Nano & ESP8266 Met BMP280 Barometrische Sensor & OLED/Nokia LCD Display
  5. Slimme Kelder Ventilatiesysteem: Arduino-gestuurde Vochtcontrole
  6. Real-time RFID aanwezigheidssysteem met Arduino en Google Sheets
  7. Draadloze Arduino Programmeer Shield met HC-05 Bluetooth – Geen USB Nodig
  8. Geavanceerd Arduino Botsingswaarschuwingsysteem – Visuele & Audio Alerts voor Voertuigveiligheid
  9. Hoogwaardige 2,8″ TFT Shield voor Arduino Nano – 320×240 SPI Display
  10. Nixie-buisschild NCS314 voor Arduino UNO/MEGA – Compatibel met IN‑14/IN‑12
  11. Arduino-gestuurde GrowBox-controller – Open-source firmware & hardwarehandleiding