Beste allemaal,
Op vakantie verveel ik me altijd kapot, dus afgelopen jaar heb ik voorzorgsmaatregelen getroffen en me voorgenomen om op vakantie te beginnen met het leren van Arduino.
Ik heb het hele beginnersboek doorgewerkt en alle opdrachten gemaakt.
Afgelopen week kwam ik met een idee voor een eerste 'echt' project.
Ik wil een installatie maken die mijn katten elke ochtend en elke avond een bepaalde hoeveelheid eten geeft.
Een servo draait een soort bakje; bij 0 graden vult hij en bij 180 graden leegt hij het.
De inhoud van het bakje is voor wat betreft volume gelijk, maar bij afwijkend voer kan de inhoud in grammen verschillen.
Ik heb uit vele google-zoektochten steeds plukjes code gevonden, maar ik loop toch vast.
Zoals jullie in de code zien gebruik ik time.alarms. Om half 7 in de ochtend draait de servo langzaam van 0 naar 180, en dan van 180 terug naar 0. Dit werkt naar behoren; eenmalig.
Ik wil dit zo vaak uitvoeren totdat de gewenste hoeveelheid voer is gegeven.
Natuurlijk kan ik de 'sweep' van de servo gewoon net zo lang knippen en plakken totdat hij het vaak genoeg doet, maar zo leer ik het nooit.
Tot dusver heb ik de heen-en-weer geprobeerd in een andere "for" loop te krijgen, maar het lijkt alsof je geen for in een for mag gebruiken. Ook heb ik 'while' geprobeerd, en zelfs 'if'.
Ik krijg deze routine niet goed voor elkaar.
Uiteindelijk moet hij bij het avondeten hetzelfde doen, maar die is nu nog leeg.
Kunnen jullie me helpen hoe ik dit het beste voor elkaar krijg?
Bij voorbaat dank!
Gert
/*
* Kattenvoersysteem moet om half 8 in de ochtend en 5 uur in de middag voer geven
* Er zijn standaard twee voermomenten op een dag.
* De ingestelde hoeveelheid voer "dosering" is per voermoment.
* De inhoud is de inhoud van de pendelbak per rotatie.
*/
#include <Time.h>
#include <TimeAlarms.h>
#include <Servo.h> // geeft aan dat er een servo gebruikt wordt.
Servo myServo; // naamgeving van de servo.
int angle;
const int inhoud = 9; // is de hoeveelheid gram brokjes per rotatie
const int dosering = 75; // is de gewenste hoeveelheid gram per voermoment.
int teller = 0;
void setup()
{
myServo.attach(9); // Servo verbonden met pin 9
myServo.write(0); // Servo staat bij aanvang op 0 graden
Serial.begin(9600);
setTime(7,29,55,11,1,16); // Zet de tijd op zaterdag 07:29:55 1 november 2016
// Nu volgen de instellingen voor de voertijdstippen
Alarm.alarmRepeat(7,30,0, Ontbijt); // 07:30 elke dag
Alarm.alarmRepeat(17,00,0, Avondeten); // 17:00 elke dag
}
void loop()
{
digitalClockDisplay();
Alarm.delay(1000); // Laat elke seconde een verandering zien
} // op de seriële monitor
// Acties als gevolg van een getriggerd alarm
void Ontbijt()
{
// for (teller = 0; teller < dosering; teller+=inhoud}
// hier wil ik regelen dat de servo net zo lang heen en weer gaat totdat de teller(= n*inhoud) de dosering overstijgt)
// in dit voorbeeld is dat dan bij 10x; 9*9=81 > 75
{
Serial.println("Ontbijt wordt geserveerd");
for(angle = 0; angle < 180; angle++) // Servo draait van 0 naar 180 graden
{
myServo.write(angle);
Alarm.delay(15);
}
for(angle = 180; angle > 0; angle--) // Servo draait van 180 naar 0 graden
{
myServo.write(angle);
Alarm.delay(15);
teller++;
}
}}
void Avondeten()
{
Serial.println("Middageten wordt geserveerd");
myServo.write(179); //Draait de servo naar 179 graden
Alarm.delay(2000); //Wacht 2 seconden zonder de klok te verstoren
myServo.write(0); //Draait de servo terug naar 0 graden
Alarm.delay(2000);
}
void digitalClockDisplay()
{
// Geeft aan hoe de tijd op de seriële monitor wordt weergegeven
Serial.print(hour()); // uur:
printDigits(minute()); // minuut:
printDigits(second()); // seconde:
Serial.println();
}
void printDigits(int digits)
{
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
Versie_2-met_berekeningen.ino (2.81 KB)