Vraag over eerste project; huisdiervoermachine

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)

Volgens mij moet het ontbijt als volgt:

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
    int gevoerd = 0;                // we hebben nog niets gegeven
    while (gevoerd <= dosering) {    // blijven klapperen to we voldoende hebben gegeven

        Serial.println("Ontbijt wordt geserveerd");
        //
        // voeren
        //
        for (angle = 0; angle < 180; angle++) // Servo draait van 0 naar 180 graden
        {
            myServo.write(angle);
            Alarm.delay(15);
        }
        //
        // terug
        //
        for (angle = 180; angle > 0; angle--) // Servo draait van 180 naar 0 graden
        {
            myServo.write(angle);
            Alarm.delay(15);
            teller++;
        }
        //
        // verhoog gevoerd totaal
        //
        gevoerd = gevoerd + inhoud;
    }
}

Beste Nico,

Bedankt voor je antwoord. Vanavond ga ik dit testen!
Ik laat het weten.

Groeten,

Gert

Euch ....
Het ontbijt is smorgens he .... hoe kan je dat s'avonds testen? :o

Jantje:
Euch ....
Het ontbijt is smorgens he .... hoe kan je dat s'avonds testen? :o

Jij zit ook wel lekker bij les heh :slight_smile: heldere geest :slight_smile:

Jantje:
Euch ....
Het ontbijt is smorgens he .... hoe kan je dat s'avonds testen? :o

Enkel als je nachtdienst hebt Jantje :wink:

Het is gelukt!

De 'While' functie heb ik vooraf wel geprobeerd, maar blijkbaar niet goed genoeg.
Dank voor de support!

Ik heb de hardware nu besteld, en ik ga ook een begin maken met het fysieke gedeelte.

Groeten,

Gert