Arduino bringt Sketch durcheinander

Hallo zusammen,

ich habe einen Arduino Nano v3 in einen kleinen Spielzeug-Rettungswagen eingebaut. Er ist mit einem Türkontaktschalter verbunden. Prinzipiell öffnet man die Tür, dann schaltet der Arduino ein Voicemodul (klemmt am 5V Pol und ist ne separate Steuerung) ein und steuert dann die Blinklichter nach etwa 10 Sekunden an.

Problem ist, dass der Arduino da offensichtlich ab und zu was durcheiander bringt.

Manchmal schaltet er die Blinklichter direkt von Beginn an dazu, dafür schaltet er dann das Voicemodul (5V) bereits nach 20 Sekunden ab (was er eigentlich nicht tun sollte).

Andere male "vergisst" er wie der bei den Blinklichtern zwischen "High" und "Low" hin und her schalten muss. Heißt die LEDs leuchten dann einfach dauerhaft.

Manchmal schaltet er das Voicemodul ein, aber das Blaulicht überhaupt nicht.

Und wieder andere Male funktioniert dann alles genau so wie es soll.

Ich weiß nicht mehr genau was ich tun soll. Hab den Arduino auch schon gegen einen anderen getauscht, weil ich hier mehrere rumliegen hatte. Ergebnis ist das gleiche...

Hier der Sketch:

int zeit;

void setup() {

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

  pinMode(6, OUTPUT);
  
  //Einmalige Ansteuerung des Audiomoldules:
  digitalWrite(6, HIGH);
  delay(25000);
  zeit = millis();

}


void loop() {
  digitalWrite(2, HIGH);  
  delay(20);             
  digitalWrite(5, HIGH);   
  delay(20);             
  digitalWrite(2, LOW);    
  delay(70);             
  digitalWrite(5, LOW);    
  delay(70);             
  digitalWrite(2, HIGH);   
  delay(10);
  digitalWrite(5, HIGH);
  delay(10);
  digitalWrite(4, HIGH);
  delay(10); 
  digitalWrite(5, LOW);
  delay(10);             
  digitalWrite(2, LOW);   
  delay(20);
  digitalWrite(4, LOW);
  delay(100);             
  digitalWrite(3, HIGH);  
  delay(20);             
  digitalWrite(4, HIGH);  
  delay(20);              
  digitalWrite(3, LOW);   
  delay(70);              
  digitalWrite(4, LOW);   
  delay(70);              
  digitalWrite(3, HIGH);   
  delay(20);             
  digitalWrite(3, LOW);   
  delay(120);



   //überprüft ob ausgeschaltet wird
   int deltazeit = millis() - zeit;
   if (deltazeit > 20000){
     digitalWrite(6, LOW);
   }              
}

Hat jemand ne Idee an was das liegen könnte?

Der Nano hängt übrigens an einem 9V-Block...

Vielen Dank schon mal!

Also der Arduino bringt nichts durcheinander, höchstens Du.

Beim ich weiß nicht, was Dein Soundmodul an Strom braucht, aber 9V Blockbatterien sind die denkbar ungünstigsten Energiequellen.
Es könnte also durchaus sein, dass die Spannung kurzzeitig zusammenbricht und der Arduino neu startet.
Es könnte auch sein, dass Dein Audiomodul mehr als 20 mA zieht und damit den Pin 6 überlastet.

Da fehlen zur Bewertung einfach noch Infos von Dir. Am Besten ein Link zum Audiomodul und eine Schaltung (Bleistift genügt) des Aufbaus.

Gruß Tommy

Tommy56:
Also der Arduino bringt nichts durcheinander, höchstens Du.

Beim ich weiß nicht, was Dein Soundmodul an Strom braucht, aber 9V Blockbatterien sind die denkbar ungünstigsten Energiequellen.
Es könnte also durchaus sein, dass die Spannung kurzzeitig zusammenbricht und der Arduino neu startet.
Es könnte auch sein, dass Dein Audiomodul mehr als 20 mA zieht und damit den Pin 6 überlastet.

Das Voicemodul habe ich fertig als Bauteil bestellt. Da wurde noch ein Relais als “Schaltverstärker” eingebaut, damit es zuverlässig schalten kann, auch wenn es mehr als 20mA werden. Das kam bereits fertig verbaut.

Tommy56:
Da fehlen zur Bewertung einfach noch Infos von Dir. Am Besten ein Link zum Audiomodul und eine Schaltung (Bleistift genügt) des Aufbaus.

Gruß Tommy

Das Voicemodul ist von www.voicemodul.de
mo1 oder mo2 (also gleich auf der ersten Seite die oberen beiden)
Sind beides die gleichen, nur einmal mit Taster und einmal mit Lichtsteuerung.

Grüße

Wo ist die Schaltung?

Gruß Tommy

Tommy56: Wo ist die Schaltung?

Gruß Tommy

Ich habe dazu keine Schaltung. Lediglich das, was auf der Webseite ist. Aber ich hab bei der Bestellung angegeben, dass es am 5V Pin hängt und der max mit 20mA belastet werden kann. Deswegen wurde es mittels Relais wohl schaltverstärkt und funktioniert auch die meiste Zeit wirklich problemlos. Nur manchmal passieren eben die oben genannten Fehler.... wirkt wie Zufallsprinzip.

Also deiner Vermutung nach liegt's am Voicemodul, das zu viel Spannung zieht?

Wenn du sagst 9V-Blocks sind schlechte Stromquellen - Welche wäre denn besser? Und vor allem - Was würde das ändern?

Also wenn Du nicht mal in der Lage bist aufzumalen, wie [u]Du[/u] die beiden Teile verkabelt hast, dann wird das wohl kaum etwas mit sinvoller Hilfe werden. Da musst Du schon etwas unterstützen. Wir können nicht auf Deinen Basteltisch schauen.

Gruß Tommy

Tommy56: Also wenn Du nicht mal in der Lage bist aufzumalen, wie [u]Du[/u] die beiden Teile verkabelt hast, dann wird das wohl kaum etwas mit sinvoller Hilfe werden. Da musst Du schon etwas unterstützen. Wir können nicht auf Deinen Basteltisch schauen.

Gruß Tommy

Achso wie das Modul am Arduino hängt?

Naja +5V und GND, Pin D6 zum Relais.

das int zeit; zeit = millis(); int deltazeit = millis() - zeit; ergibt ständig Überläufe, die solltest du lieber als unsigned long deklarieren.

ardubu: das int zeit; zeit = millis(); int deltazeit = millis() - zeit; ergibt ständig Überläufe, die solltest du lieber als unsigned long deklarieren.

Das musst du mir erklären...

Also die millis komplett raus? Bzw. kannst du das konkretisieren?

Sorry wenn die Frage irgendwie doof ist, aber das war mein erstes Arduino-Projekt, ich bin da noch nicht wirklich fit, sondern taste mich noch ran...

int geht von -32767 bis 32767 millis ist die Zeit seit einschalten des µC in Millisekunden also hast du nach ca. 32 Sekunden deinen ersten Überlauf.

mache aus int zeit; zeit = millis(); int deltazeit = millis() - zeit; lieber uint32_t zeit; zeit = millis(); uint32_t deltazeit = millis() - zeit; uint32_t geht bis 4294967295, somit kommt der Überlauf erst nach ca, 49 Tagen.

ardubu: somit kommt der Überlauf erst nach ca, 49 Tagen.

Und dieser Überlauf kann derartige Probleme verursachen?

Stelle Dir mal vor, die Variable könnte von -10 bis +9 speichern. Jetzt hast Du +9 drin und addierst 1 auf. Dann hast Du -10! Das bringt Deine Logik garantiert durcheinander.

Gruß Tommy

Okay, also wenn ich das richtig verstanden habe, dann muss ich den Sketch wie folgt editieren, um den Überlauf zu verhindern:

uint32_t zeit;

void setup() {

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

  pinMode(6, OUTPUT);
  
  //Einmalige Ansteuerung des Audiomoldules:
  digitalWrite(6, HIGH);
  delay(25000);
  zeit = millis();

}


void loop() {
  digitalWrite(2, HIGH);  
  delay(20);             
  digitalWrite(5, HIGH);   
  delay(20);             
  digitalWrite(2, LOW);    
  delay(70);             
  digitalWrite(5, LOW);    
  delay(70);             
  digitalWrite(2, HIGH);   
  delay(10);
  digitalWrite(5, HIGH);
  delay(10);
  digitalWrite(4, HIGH);
  delay(10); 
  digitalWrite(5, LOW);
  delay(10);             
  digitalWrite(2, LOW);   
  delay(20);
  digitalWrite(4, LOW);
  delay(100);             
  digitalWrite(3, HIGH);  
  delay(20);             
  digitalWrite(4, HIGH);  
  delay(20);              
  digitalWrite(3, LOW);   
  delay(70);              
  digitalWrite(4, LOW);   
  delay(70);              
  digitalWrite(3, HIGH);   
  delay(20);             
  digitalWrite(3, LOW);   
  delay(120);



   //überprüft ob ausgeschaltet wird
   uint32_t deltazeit = millis() - zeit;
   if (deltazeit > 20000){
     digitalWrite(6, LOW);
   }              
}

Korrekt?

Sieht so aus. Warum probierst Du es nicht.

Gruß Tommy

bierhahn: Okay, also wenn ich das richtig verstanden habe, dann muss ich den Sketch wie folgt editieren, um den Überlauf zu verhindern:

uint32_t zeit;

void setup() {

  pinMode(2, OUTPUT);   pinMode(3, OUTPUT);   pinMode(4, OUTPUT);   pinMode(5, OUTPUT);

  pinMode(6, OUTPUT);     //Einmalige Ansteuerung des Audiomoldules:   digitalWrite(6, HIGH);   delay(25000);   zeit = millis();

}

void loop() {   digitalWrite(2, HIGH);    delay(20);           
  digitalWrite(5, HIGH); 
  delay(20);           
  digitalWrite(2, LOW);      delay(70);           
  digitalWrite(5, LOW);      delay(70);           
  digitalWrite(2, HIGH); 
  delay(10);   digitalWrite(5, HIGH);   delay(10);   digitalWrite(4, HIGH);   delay(10);   digitalWrite(5, LOW);   delay(10);           
  digitalWrite(2, LOW); 
  delay(20);   digitalWrite(4, LOW);   delay(100);           
  digitalWrite(3, HIGH);    delay(20);           
  digitalWrite(4, HIGH);    delay(20);                digitalWrite(3, LOW); 
  delay(70);                digitalWrite(4, LOW); 
  delay(70);                digitalWrite(3, HIGH); 
  delay(20);           
  digitalWrite(3, LOW); 
  delay(120);

  //überprüft ob ausgeschaltet wird   uint32_t deltazeit = millis() - zeit;   if (deltazeit > 20000){     digitalWrite(6, LOW);   }              }




Korrekt?

ja aber: Ich weiß nicht ob der Sketch das macht was du dir vorstellst. Wie wird der Nano mit Strom versorgt? Über den Türkontakt?

Wenn der Nano Strom bekommt, wird das Audiomudul eingeschaltet, dann wird 25 Sek. gewartet, dann blinken die Led's und nach weiteren 650 ms wird das Audiomodul abgeschaltet und bleibt bis zur nächsten Stromunterbrechung aus und die Led's blinken munter weiter.

ardubu: ja aber: Ich weiß nicht ob der Sketch das macht was du dir vorstellst. Wie wird der Nano mit Strom versorgt? Über den Türkontakt?

Wenn der Nano Strom bekommt, wird das Audiomudul eingeschaltet, dann wird 25 Sek. gewartet, dann blinken die Led's und nach weiteren 650 ms wird das Audiomodul abgeschaltet und bleibt bis zur nächsten Stromunterbrechung aus und die Led's blinken munter weiter.

Ja, der Türkontakt öffnet und der Arduino kriegt Saft... Das, was du beschrieben hast, ist genau das, was er machen soll....

Habe den Sketch geupdated... Dennoch nach wie vor das gleiche "durcheinanderbringen"

ich habe ein paar Serial.print Anweisungen eingebaut, damit kannst du im seriellen Monitor sehen wo es hängt.

uint32_t zeit;

void setup() {

  Serial.begin(115200);
  Serial.println("Setup");
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

  pinMode(6, OUTPUT);
  Serial.println("Audiomodul ein");

  //Einmalige Ansteuerung des Audiomoldules:
  digitalWrite(6, HIGH);
  delay(25000);
  zeit = millis();

}


void loop() {
  Serial.println("Loop");
  digitalWrite(2, HIGH); 
  delay(20);             
  digitalWrite(5, HIGH);   
  delay(20);             
  digitalWrite(2, LOW);   
  delay(70);             
  digitalWrite(5, LOW);   
  delay(70);             
  digitalWrite(2, HIGH);   
  delay(10);
  digitalWrite(5, HIGH);
  delay(10);
  digitalWrite(4, HIGH);
  delay(10);
  digitalWrite(5, LOW);
  delay(10);             
  digitalWrite(2, LOW);   
  delay(20);
  digitalWrite(4, LOW);
  delay(100);             
  digitalWrite(3, HIGH); 
  delay(20);             
  digitalWrite(4, HIGH); 
  delay(20);             
  digitalWrite(3, LOW);   
  delay(70);             
  digitalWrite(4, LOW);   
  delay(70);             
  digitalWrite(3, HIGH);   
  delay(20);             
  digitalWrite(3, LOW);   
  delay(120);



   //überprüft ob ausgeschaltet wird
   uint32_t deltazeit = millis() - zeit;
   if (deltazeit > 20000){
     digitalWrite(6, LOW);
     Serial.println("Audiomodul aus");
   }             
}

Okay, also die Batterie-Problematik hab ich jetzt mal mit nem 100 μf ELKO abgepuffert um die Lebzeit des Nano zu verlängern.

Und beim Sketch hab ich rausgefunden, dass ein delay im setup wohl eher nicht so optimal ist und das ganze eher durcheinander bringt. Vermutlich liegt/lag hier der Hund begraben.

Und auch in meinem loop waren ganz viele delays drin, die wohl Probleme machen können.

Zeit hab ich von 32 auf 16 umgestellt und das ganze jetzt noch in nen komplett überarbeiteten und hoffentlich funktionierenden Sketch gepackt.

Vielleicht schaut da mal kurz jemand drüber, der da mehr Ahnung hat als ich?! Ich hab versucht das Ganze so übersichtlich und verständlich wie möglich zu gestalten:

uint16_t zeit;
uint8_t iteration;

void setup() {

 //leds
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);

 //audio
 pinMode(6, OUTPUT);
  
 //einmalige Ansteuerung des Audiomodules:
 digitalWrite(6, HIGH);

 //initialisiere variablen
 zeit = 0;
 iteration = 0;
}


void loop() {
 //teile den loop in 10ms ticks
 delay(10);

 //starte leds iteration nach 670ms neu
 if(iteration > 67){
 iteration = 0;
 }

 //starte leds nach 25 sekunden
 if(zeit > 2500){
 iteration++;
 }

 //leds blinkabfolge
 switch(iteration){
 case 1: digitalWrite(2, HIGH); 
 case 3: digitalWrite(5, HIGH);
 case 5: digitalWrite(2, LOW);
 case 12: digitalWrite(5, LOW);
 case 19: digitalWrite(2, HIGH);
 case 20: digitalWrite(5, HIGH);
 case 21: digitalWrite(4, HIGH);
 case 22: digitalWrite(5, LOW);
 case 23: digitalWrite(2, LOW);
 case 25: digitalWrite(4, LOW);
 case 35: digitalWrite(3, HIGH);
 case 37: digitalWrite(4, HIGH);
 case 39: digitalWrite(3, LOW);
 case 46: digitalWrite(4, LOW);
 case 53: digitalWrite(3, HIGH);
 case 55: digitalWrite(3, LOW);
 }

 //stoppe audio nach 45 sekunden
 if (zeit > 4500){
 digitalWrite(6, LOW);
 zeit = 9999;
 } else {
 zeit++;
 }  
}

Bitte seid nicht allzu streng mit mir, ich bin diesbezüglich echt noch ein N00b und versuche mich bestmöglich einzuarbeiten...