Kippenhok deur

De regels van arduinoforum.nl
Berichten: 19
Geregistreerd: 01 Feb 2017, 14:03

Kippenhok deur

Berichtdoor Gregoryvl » 22 Mei 2020, 21:48

Hoi,

Ik probeer een deurtje van een kippenhok automatisch te laten sluiten als het donker is en weer te openen in de ochtend.
Niet erg complex dacht ik...

Omdat ik Arduino's programmeren niet heel vaak doe, bouw ik mijn code stap voor stap op met telkens een test tussendoor.

Ik krijg het voor elkaar wanneer het donker is en de deur is open, dat de Arduino de deur sluit, op slot doet en een rode LED doet branden.
zet ik exact dezelfde, maar dan omgekeerd, code erbij voor "Dag", gebeurt er niets?!?

Nu ben ik al enkele dagen aan het sukkelen en kom hier niet uit.
In het tekenprogramma was geen Adafruit motorshield L293D te bespeuren. Ik heb daarom een ander gebruikt ter illustratie. De servo is aangesloten op servo_1.

Wie O wie ziet wat er fout gaat?

Alvast bedankt!!!
Code: Alles selecteren
//MOTOR
#include <AFMotor.h> //Library voor motorshield
AF_DCMotor motor(3);

//Motorshield gebruikt pin 4, 5, 6 en 10 volgens interneten eigen ondervinding

//SERVO
#define SERVO1_PWM 10
#include <Servo.h>
Servo servo_1;




void setup() {

 //BASIC SETUP
Serial.begin(9600);




//MOTOR
 // motorspeed tussen 200 - 255
  motor.setSpeed(255);
  motor.run(RELEASE);
  digitalWrite(13, LOW);
  digitalWrite(7, LOW);
  digitalWrite(12, LOW);
 

//SERVO
servo_1.attach(SERVO1_PWM);


pinMode(2, INPUT); // Hand of AUTO 1 is auto, 0 is Handmatig
pinMode(1, INPUT); // Hand deur openen 1 is open, 0 is sluiten
pinMode(12, OUTPUT); // GROEN deur dicht
pinMode(13, OUTPUT); // ORANJE deur travelling
pinMode(7, OUTPUT); // ROOD deur open
pinMode(9, INPUT_PULLUP); // Micrswitch Deur open
pinMode(11, INPUT_PULLUP); //Microswitch Deur dicht

}

void loop() {
int LDR_pin = analogRead(A0);
int Nacht = LDR_pin < 5;
int Dag = LDR_pin > 10;


Serial.println(LDR_pin);
  Serial.print("Deur dicht =  ");
  Serial.println(digitalRead(11));
  Serial.print("Deur open =   ");
  Serial.println(digitalRead(9) );
  delay(1000);
  //////////////////////////////////////////////////////
 //                     AUTOMATISCH                  //
//////////////////////////////////////////////////////

// Nachtscene
if ((Nacht) && (digitalRead(9) == HIGH)){  //Donker en deur is open

 motor.run(BACKWARD);
  Serial.println("Deur gaat dicht");}
 
if ((digitalRead(11) == HIGH)) {  //deur is dicht
    motor.run(RELEASE);                      // Motor stop
    delay(2000);
    if (digitalRead(11) == HIGH){  //Deur is dicht
    servo_1.write(70);       
   } }   // Slot gaat dicht 

 
// Dagscene
 if ((Dag) && (digitalRead(11) == HIGH)){  //dag en deur is dicht
 servo_1.write(20);
  delay(000);
    //motor.setSpeed(255);
  motor.run(FORWARD);
  Serial.println("Deur gaat open");}
 
if ((digitalRead(9) == HIGH)) {  //deur is open
   motor.run(RELEASE);                      // Motor stop
   
 
 
 
 
 
 
 
 if ((digitalRead(11) == HIGH)){ // deur is dicht LED ROOD
    digitalWrite(12, LOW); // groen
    digitalWrite(13, LOW);  //blauw
    digitalWrite(7, HIGH);} //rood
 
if ((digitalRead(9) == HIGH)){   // deur is open LED Groen
   digitalWrite(12, HIGH); // groen
    digitalWrite(13, LOW);  //blauw
    digitalWrite(7, LOW);} //rood

   


 

  ////////////////////////////////////////////////////
 //                      HANDMATIG                 //
////////////////////////////////////////////////////



  ///////////////////////////////////////////////////
 //                     ALGEMEEN                  //
///////////////////////////////////////////////////

}}
 // if ((digitalRead(12) == LOW) && (digitalRead(7) == LOW)){  // Deur travelling
  //digitalWrite(6, HIGH);
Bijlagen
Kippenkot.jpg
Kippenkot.jpg (159.38 KiB) 1483 keer bekeken

Advertisement

Berichten: 3174
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Kippenhok deur

Berichtdoor shooter » 22 Mei 2020, 22:00

ik zie delay 000 staan dat is erg kort.
en haal je programma eens door ctrl T dan staat alles in lijn ik denk dat je een {} vergeten bent.
het is of dag of het is nacht en wat als het ertussen is?
paul deelen
shooter@home.nl

Berichten: 19
Geregistreerd: 01 Feb 2017, 14:03

Re: Kippenhok deur

Berichtdoor Gregoryvl » 24 Mei 2020, 14:25

Bedankt voor de tip!

Kort na mijn bovenstaande post werkt de code ?!? Erg typisch...

Nu merk ik, wanneer ik de LED indicatie wil laten werken, de code vastloopt. Ik vermoed dat 1 van deze pins worden gebruikt door het motorshield.

Nu nog proberen handmatige bediening werkend te krijgen...

Code: Alles selecteren
//MOTOR
#include <AFMotor.h> //Library voor motorshield
AF_DCMotor motor(3);

//Motorshield gebruikt pin 4, 5, 6 en 10

//SERVO
#define SERVO1_PWM 10
#include <Servo.h>
Servo servo_1;

//SWITCHES




void setup() {

  //BASIC SETUP
  Serial.begin(9600);

  //MOTOR
  // motorspeed tussen 200 - 255
  motor.setSpeed(255);
  servo_1.write(20);
  motor.run(RELEASE);
  digitalWrite(13, LOW);
  digitalWrite(7, LOW);
  digitalWrite(12, LOW);


  //SERVO
  servo_1.attach(SERVO1_PWM);


  pinMode(2, INPUT); // Hand of AUTO
  pinMode(3, INPUT); // Hand deur sluiten
  pinMode(1, INPUT); // Hand deur openen
  pinMode(12, OUTPUT); // GROEN deur dicht
  pinMode(13, OUTPUT); // ORANJE deur travelling
  pinMode(7, OUTPUT); // ROOD deur open
  pinMode(9, INPUT_PULLUP); // Micrswitch Deur open
  pinMode(11, INPUT_PULLUP); //Microswitch Deur dicht

}

void loop() {

  int LDR_pin = analogRead(A0);
  int Nacht = LDR_pin < 5;
  int Dag = LDR_pin > 10;

  Serial.println(LDR_pin);
  Serial.print("Deur dicht =  ");
  Serial.println(digitalRead(11));
  Serial.print("Deur open =   ");
  Serial.println(digitalRead(9));
  //Serial.print("Handmatig =   ");
  //Serial.println( digitalRead(2));
  delay(1000);

  //////////////////////////////////////////////////////
  //                     AUTOMATISCH                  //
  //////////////////////////////////////////////////////

  // Nachtscene
  if ((Nacht) && (digitalRead(9) == HIGH)) { //Donker en deur is open

    motor.run(BACKWARD);
    Serial.println("#Nacht");
    Serial.println("Deur gaat dicht");
  }

  if ((Nacht) && (digitalRead(11) == HIGH)) {  //deur is dicht
    motor.run(RELEASE);    // Motor stop
    delay(2000);
    servo_1.write(70);
  }


  //Dagscene
  if ((Dag) && (digitalRead(11) == HIGH)) {     //dag en deur is dicht
    servo_1.write(20);
    delay(2000);
    motor.run(FORWARD);
    Serial.println("#Dag");
    Serial.println("Deur gaat open");
  }

  if ((Dag) && (digitalRead(9) == HIGH)) {
    motor.run(RELEASE);
  }

  // if (digitalRead(9) == HIGH)  { //deur open, LED groen
  //   digitalWrite(12, HIGH);
  //   digitalWrite(13, LOW);
  //   digitalWrite(7, LOW);}

  // if (digitalRead(11) == HIGH ) { // deur dicht, LED rood
  //  digitalWrite(12, LOW);
  //  digitalWrite(13, LOW);
  //  digitalWrite(7, HIGH);}

}



////////////////////////////////////////////////////
//                      HANDMATIG                 //
////////////////////////////////////////////////////




Gebruikers-avatar
Berichten: 2538
Geregistreerd: 06 Aug 2016, 01:03

Re: Kippenhok deur

Berichtdoor Koepel » 24 Mei 2020, 19:28

Weet je hoe oud dat motor shield is ? Dat was een van de eerste dingen die Adafruit maakte.
Adafruit "ancient" V1 Motor shield: https://learn.adafruit.com/adafruit-motor-shield/overview.

Het gebruikt bijna alle pinnen.

In combinatie met een Arduino Uno ?

Dan zijn pinnen A0 tot en met A5 nog vrij. Die kun je ook als digitale pinnen gebruiken.
Dus ook de I2C bus op A4 en A5 is nog vrij.

Dan blijven verder nog pin 2 en 13 over. Pin 13 is verbonden met het ledje op het Uno board, maar je kunt pin 13 ook voor iets anders gebruiken (als je een versie 'R3' hebt van het Uno board dan heeft pin 13 geen beperkingen).

Dus 6 pinnen die je nu gebruikt voor schakelaars of leds zul je moeten verplaatsen.

Berichten: 3174
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Kippenhok deur

Berichtdoor shooter » 24 Mei 2020, 19:57

je geeft zelf aan dat pin 10 gebruikt wordt door de motorshield en een regel eronder ook door de servo dat gaat het dus niet worden, de servo moet trouwens wel op een PWM uitgang ivm de timing.
paul deelen
shooter@home.nl

Berichten: 19
Geregistreerd: 01 Feb 2017, 14:03

Re: Kippenhok deur

Berichtdoor Gregoryvl » 28 Mei 2020, 21:36

Hoi,

De kippendeur werkt redelijk. Enkel wil ik, paralel aan de code, dat heel regelmatig de eind switches worden gecontroleerd.
Dit omdat soms, de deur niet op tijd stopt en de motor zichzelf vast trekt.

Ik las op internet dat je dit met de millis() functie kan doen.
De millis functie word gebruikt wanneer de deur travelled, dus pin 9 en 11 LOW zijn. Op de interface lees ik af dat de millis functie getriggered is.
Wanneer dan pin 9 of 11 HIGH wordt, moet de motor stoppen. Dat gebeurt dus niet...

Kan iemand me bijsturen, aub?

De millis staan net onder de start van void loop in de code.

Code: Alles selecteren
//MOTOR
#include <AFMotor.h> //Library voor motorshield
AF_DCMotor motor(3);

//Motorshield gebruikt pin 4, 5, 6, 7 en 10

//SERVO
#define SERVO1_PWM 10
#include <Servo.h>
Servo servo_1;

//Timing
const unsigned long interval = 100;
unsigned long previousTime = 0;




void setup() {

  //BASIC SETUP
  Serial.begin(9600);

  //MOTOR
  // motorspeed tussen 200 - 255
  motor.setSpeed(255);
  servo_1.write(115);
  motor.run(RELEASE);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);


  //SERVO
  servo_1.attach(SERVO1_PWM);


  pinMode(3, INPUT_PULLUP); // Hand of AUTO
  pinMode(2, INPUT_PULLUP); // Hand deur sluiten
  pinMode(A3, OUTPUT); // GROEN deur dicht
  pinMode(A2, OUTPUT); // ORANJE deur travelling
  pinMode(A1, OUTPUT); // ROOD deur open
  pinMode(9, INPUT_PULLUP); // Micrswitch Deur open
  pinMode(11, INPUT_PULLUP); //Microswitch Deur dicht

}

void loop() {
  int LDR_pin = analogRead(A0);
  int Nacht = LDR_pin < 20;
  int Dag = LDR_pin > 20;
  unsigned long currentTime = millis();

  if ((currentTime - previousTime >= interval) && (digitalRead(9) == LOW) && (digitalRead(11) == LOW)) {
    Serial.println("millis functie getriggered");
    previousTime = currentTime;
    if ((digitalRead(9) == HIGH) || (digitalRead(11) == HIGH)) {
      motor.run(RELEASE);
      Serial.println( "Motor gestopt");


    }
  }


  Serial.println(LDR_pin);
  Serial.print("Deur dicht =  ");
  Serial.println(digitalRead(11));
  Serial.print("Deur open =   ");
  Serial.println(digitalRead(9));
  Serial.print("Handmatig =   ");
  Serial.println( digitalRead(3));
  delay(1000);

  //////////////////////////////////////////////////////
  //                     AUTOMATISCH                  //
  //////////////////////////////////////////////////////

  // Nachtscene
  if ((Nacht) && (digitalRead(9) == HIGH) && (digitalRead(3) == LOW)) { //Donker en deur is open

    motor.run(BACKWARD);
    Serial.println(" #Nacht");
    Serial.println("Deur gaat dicht");
  }

  if ((Nacht) && (digitalRead(11) == HIGH) && (digitalRead(3) == LOW)) { //deur is dicht en in AUTO mode
    motor.run(RELEASE);    // Motor stop
    delay(2000);
    servo_1.write(45); //slot dicht
  }



  //Dagscene
  if ((Dag) && (digitalRead(11) == HIGH) && (digitalRead(3) == LOW)) { //dag en deur is dicht
    servo_1.write(115); //slot open
    delay(2000);
    motor.run(FORWARD);
    Serial.println("#Dag");
    Serial.println("Deur gaat open");
  }

  //if ((Dag) && (digitalRead(9) == HIGH) && (digitalRead(3) == LOW)) {
  // motor.run(RELEASE);    // Motor stop}

  if ((interval) && digitalRead(9) == HIGH)  { //deur open, LED groen

    digitalWrite(A2, HIGH);
    digitalWrite(A1, LOW);
    digitalWrite(A3, LOW);
  }

  if ((interval) && digitalRead(11) == HIGH ) { // deur dicht, LED rood

    digitalWrite(A3, LOW);
    digitalWrite(A2, LOW);
    digitalWrite(A1, HIGH);
  }




  if ((digitalRead(11) == LOW) && (digitalRead(9) == LOW) ) { // deurtravel tricolor
    digitalWrite(A3, LOW);
    digitalWrite(A2, LOW);
    digitalWrite(A1, HIGH);
    delay(1000);
    digitalWrite(A3, LOW);
    digitalWrite(A2, HIGH);
    digitalWrite(A1, LOW);
    delay(1000);
    digitalWrite(A3, HIGH);
    digitalWrite(A2, LOW);
    digitalWrite(A1, LOW);
    delay(1000);
    digitalWrite(A3, LOW);
    digitalWrite(A2, LOW);
    digitalWrite(A1, LOW);
  }


  ////////////////////////////////////////////////////
  //                      HANDMATIG                 //
  ////////////////////////////////////////////////////

  if ((digitalRead(3) == HIGH) && (digitalRead(2) == HIGH)) {
    servo_1.write(115);
    motor.run(FORWARD);
    Serial.println("handmatig open");
    if (digitalRead(9) == HIGH) {
      motor.run(RELEASE);
    }

  }


  if ((digitalRead(3) == HIGH) && (digitalRead(2) == LOW)) {
    motor.run(BACKWARD);
    Serial.println("handmatig sluiten");
    if (digitalRead(11) == HIGH) {
      motor.run(RELEASE);
    }

  }



  ///////////////////////////////////////////////////
  //                     ALGEMEEN                  //
  ///////////////////////////////////////////////////
}

Gebruikers-avatar
Berichten: 2538
Geregistreerd: 06 Aug 2016, 01:03

Re: Kippenhok deur

Berichtdoor Koepel » 29 Mei 2020, 08:41

Pin 3 is het PWM signaal om de snelheid van de 'B' zijde motors te regelen.
Pin 11 is het PWM signaal om de snelheid van de 'A' zijde motors te regelen.

Pin 9 en 10 zijn alleen verbonden met de connectors voor de servo motors.
Dus als je een servo motor gebruikt op SERVO1 (pin 10) en niet op SERVO2 (pin 9), dan zou je pin 9 kunnen gebruiken.

Het schema staat hier: https://github.com/adafruit/Adafruit_Motor-Shield-v1/blob/master/mshieldv12schem.png.

Dit begrijp ik niet:
//Motorshield gebruikt pin 4, 5, 6, 7 en 10

Heb je dat ergens gevonden ?
Kun je dat wijzigen naar dit:
Code: Alles selecteren
// Het "ancient" motor shield gebruikt de pinnen: 3,4,5,6,7,8,9,10,11,12
// Pin 9 en 10 zijn voor de servo motoren.
// Die kunnen gebruiken worden als die pin niet voor een servo motor gebruikt wordt.
// Pin 0 en 1 van de Arduino worden gebruikt voor de seriele monitor en voor het uploaden van een sketch.
// Dan blijven alleen pin 2 en 13 en A0 ... A5 over.

Berichten: 19
Geregistreerd: 01 Feb 2017, 14:03

Re: Kippenhok deur

Berichtdoor Gregoryvl » 29 Mei 2020, 22:24

Hoi,

Ik heb die pins bepaald dmv trial en error. Dit koste behoorlijk wat tijd, elke keer als de motor niet meer werd aangedreven, heb ik pins uit de code gehaald en zo ontdekt dat de motor weer aangestuurd kon worden. Vervolgens genoteerd in de code.

Ik heb trouwens een V2 (https://cdn-learn.adafruit.com/downloads/pdf/adafruit-motor-shield-v2-for-arduino.pdf).
Volgens deze handleiding is A4 en A5 ook in gebruik...

Eigenlijk werkt alles zoals ik het wil. Als de eind stops getriggered worden zie ik dat meteen terug via de interface, enkel het stopcommando "motor.run(RELEASE)" laat soms te lang op zich wachten en trekt de motor zich vast.

Terug naar Forum regels

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten