De plantbutler: Offline code
Benodigdheden
Om deze opdracht uit te voeren heb je volgende zaken nodig:
- een microcontrollerplatform met wificonnectiviteit dat gebruik kan maken van Arduino IoT Cloud (app);
- een computer;
- een smartphone;
- een breadboard;
- een servomotor;
- een rietje;
- een houten stokje;
- knutselmateriaal, elastiekjes/plakband;
- een bokaal met water;
- jouw plantje;
- 3 weerstanden (2 x 220 Ohm, 1 x 10 kOhm);
- schakeldraad.
Hier vind je een overzicht van de borden die compatibel zijn met Arduino IoT Cloud.
Let op, ze communiceren niet allemaal via wifi. Wij gebruiken in dit voorbeeld wifi.
Microcontrollerplatformen die hier op dit moment aan voldoen zijn: MKR 1000 WiFi, Nano 33 IoT, MKR WiFi 1010 en de volgende apparaten van derden: ESP32, ESP8266.
Heb je niet de juiste Arduino? Geen probleem, je kan het offline gedeelte, het vormgeven van de code, met eender welke Arduino uitvoeren. Het online gedeelte waarin je vanop afstand via Arduino IoT Cloud je systeem aanstuurt moet je dan overslaan.
Opdracht
Schrijf een programma dat je toelaat om:
de vochtigheid van je plant na te gaan en indien de grond te droog wordt, water te geven via een servomotor met rietje.
Een servomotor bevat een gelijkstroommotor en nog meerdere extra componenten wat voor extra functionaliteit zorgt.
Gelijkstroommotor versus servomotor
Beide zijn elektromotoren; elektriciteit wordt omgezet in een mechanische beweging.
Bij een gelijkstroommotor (ook wel DC-motor genaamd) kan je 2 dingen bepalen: in welke richting de as draait (wijzerzin of tegenwijzerzin) en hoe snel de as ronddraait (indien we de spanning over de motor kunnen
regelen).
Een servomotor bestaat uit een gelijkstroommotor, aangevuld met elektronica (feedbacksensoren). Hierdoor kunnen we veel preciezer tewerkgaan. We kunnen namelijk de servomotor een exact aantal graden laten draaien, en
daar halt houden, of veel gecontroleerder de as van deze motor laten ronddraaien.
Opdracht 1
Wij herformuleerden de opdracht zo specifiek mogelijk, zodat die klaar is om gecodeerd te worden.
Om de code vorm te geven splitsen we ze eerst op in kleinere te programmeren delen, in dit geval:
- de vochtigheidsmeter
- het bewateringssysteem
Zo kunnen we eerst elk onderdeel afzonderlijk uitdenken en testen vooraleer we alles samenvoegen. Dit opsplitsen noemen we 'decompositie'.
Het is één van de 4 begrippen binnen het computationeel denken.
Vochtigheidsmeter
Voor de plantbutler bouwen we onze eigen sensor, een vochtigheidsmeter. Doorloop onderstaande presentatie om hem te bouwen.
Heb je er zelf één liggen? Vergelijk die dan met deze DIY-versie! Tonen de data een gelijkaardige trend?
Uitwerking, deel 1a
Doorloop onderstaande presentatie om de code voor de vochtigheidsmeter offline vorm te geven.
Bewatering
Uitwerking, deel 1b
Doorloop onderstaande presentatie om de code voor het aansturen van met bewateringssysteem met servomotor, offline, vorm te geven.
Samengevoegd
We voegen nu de twee stukken code bij elkaar.
Open de code van één van de onderdelen in je Arduinosoftware en voeg de delen code van het andere deel op de juiste plaats in.
Ga na of alle variabelen gedefinieerd zijn en er geen fouten in de code staan, de verifieerbutton in je software helpt je daarbij.
Vochtigheidsmeter
// Declaratie en initialisatie
// Hier worden de constanten en variabelen die in het programma voorkomen gedefinieerd.
// Constanten veranderen niet. Een voorbeeld hiervan zijn de PIN-nummers.
const int vochtigheidsmeterPin = A1;
// Variabelen kunnen wel van waarden veranderen.
int vochtigheid = 0; // variabele om het resultaat van de vochtigheid in op te slaan.
// Setup
// Hier worden de instellingen bij de start van het programma ingesteld.
void setup() {
pinMode(vochtigheidsmeterPin, INPUT);
Serial.begin(9600);
}
// Loop
// De loop bevat de belangrijkste code en wordt onophoudelijk doorlopen.
void loop() {
vochtigheid = gemiddelde_vochtigheid(); // Sla de uitkomst van de functie die de gemiddelde vochtigheid berekent op in de variabele vochtigheid.
Serial.println(vochtigheid);
delay(5000);
}
// Functies
// Hier worden functies die nodig zijn in de loop geschreven.
int gemiddelde_vochtigheid() {
// Maak een gemiddelde van 10 metingen om een stabiele waarde te bekomen.
int statusVochtigheid = 0;
for (int i = 0; i < 10; i++) {
statusVochtigheid = statusVochtigheid + analogRead(vochtigheidsmeterPin);
delay(100);
}
return statusVochtigheid / 10;
}
Bewateringssysteem
// Declaratie en initialisatie
// Hier worden de constanten en variabelen die in het programma voorkomen gedefinieerd.
#include <Servo.h>; // importeer de servo-bibliotheek
Servo myServo; // Creeër een servo-object om de servo-motor te kunnen aansturen.
// Variabelen kunnen wel van waarden veranderen.
int drempelwaarde = 1000; // Een vochtigheid boven deze waarde is te droog.
int vochtigheid = 1100; // Waarde van de vochtigheidsmeter, die we hier zelf instellen om te testen.
// Setup
// Hier worden de instellingen bij de start van het programma ingesteld.
void setup() {
myServo.attach(2);
}
// Loop
// De loop bevat de belangrijkste code en wordt onophoudelijk doorlopen.
void loop() {
if (vochtigheid > drempelwaarde) { // Als de plant te droog is, moet er bewaterd worden.
// Laat de servomotor kantelen:
myServo.write(100);
delay(3000);
myServo.write(100);
delay(3000);
}
else { // Als de plant niet te droog is, behouden we de motor in de startpositie.
myServo.write(0);
delay(6000);
}
}
Lijkt je code op deze oplossing? We hebben nog een delay verwijderd om de code wat vlotter te laten lopen.
Oplossing
#include <Servo.h>;
Servo myServo;
const int vochtigheidsmeterPin = A1;
int drempelwaarde = 1000;
int vochtigheid = 0;
void setup() {
myServo.attach(2);
pinMode(vochtigheidsmeterPin, INPUT);
Serial.begin(9600);
}
void loop() {
vochtigheid = gemiddelde_vochtigheid();
Serial.println(vochtigheid);
if (vochtigheid > drempelwaarde) {
myServo.write(100);
delay(3000);
myServo.write(100);
delay(3000);
}
else {
myServo.write(0);
delay(6000);
}
}
int gemiddelde_vochtigheid() {
int statusVochtigheid = 0;
for (int i = 0; i < 10; i++) {
statusVochtigheid = statusVochtigheid + analogRead(vochtigheidsmeterPin);
delay(100);
}
return statusVochtigheid / 10;
}
Bouw de schakeling
Je kan gemakkelijk de werking van de servomotor testen door de geleidingsdraden aan de lucht bloot te stellen. Wil je de motor doen stoppen, hou de draden dan tegen elkaar of verbind ze met elkaar in je breadboard.