INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ablaufstruktur beim arbeiten mit Sensorwerten?
29.10.2017, 18:36
Beitrag #9
RE: Ausbruch aus dem loop. Ganz einfach, ODER?
(29.10.2017 17:57)Jan_OL schrieb:  Jetzt würde ich gerne versuchen bei erreichen des Sensorwertes > 150 einen Timer zu setzen der mir nach Zeit X eine weiteren Ausgang schaltet.[/code]
Und wann soll der wieder zurückgesetzt werden?
Da dein loop() sowieso nur 1mal/Sekunde durchläuft, könntest Du einfach einen Zähler setzen. Den, wenn er > 0 ist in jedem Durchlauf um 1 runterzählen, und dann bei 0 den Ausgang setzen. Danach auf -1 setzen, was bedeutet, dass er nicht aktiv ist.

Solltest Du mal mehr mit deinem Sketch machen wollen, musst Du allerdings das delay() rausschmeissen und dich mit millis() befassen. Aber erstmal sollte es mit einem Zähler gehen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.10.2017, 18:47 (Dieser Beitrag wurde zuletzt bearbeitet: 29.10.2017 18:48 von Jan_OL.)
Beitrag #10
RE: Ausbruch aus dem loop. Ganz einfach, ODER?
(29.10.2017 18:36)MicroBahner schrieb:  
(29.10.2017 17:57)Jan_OL schrieb:  Jetzt würde ich gerne versuchen bei erreichen des Sensorwertes > 150 einen Timer zu setzen der mir nach Zeit X eine weiteren Ausgang schaltet.[/code]
Und wann soll der wieder zurückgesetzt werden?
Da dein loop() sowieso nur 1mal/Sekunde durchläuft, könntest Du einfach einen Zähler setzen. Den, wenn er > 0 ist in jedem Durchlauf um 1 runterzählen, und dann bei 0 den Ausgang setzen. Danach auf -1 setzen, was bedeutet, dass er nicht aktiv ist.

Solltest Du mal mehr mit deinem Sketch machen wollen, musst Du allerdings das delay() rausschmeissen und dich mit millis() befassen. Aber erstmal sollte es mit einem Zähler gehen.

Also der sog. timer soll bei dem Sensorwert >150 aktivieren und nach zb.5 sec einen weiteren Ausgang auf HIGH setzen. Sobald der wert aber kleiner <150 oder >500 überschreitet, soll er abgebrochen werden.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.10.2017, 20:37 (Dieser Beitrag wurde zuletzt bearbeitet: 29.10.2017 20:38 von MicroBahner.)
Beitrag #11
RE: Ausbruch aus dem loop. Ganz einfach, ODER?
(29.10.2017 18:47)Jan_OL schrieb:  Also der sog. timer soll bei dem Sensorwert >150 aktivieren und nach zb.5 sec einen weiteren Ausgang auf HIGH setzen. Sobald der wert aber kleiner <150 oder >500 überschreitet, soll er abgebrochen werden.
Dann musst Du ihn im Abschnitt >150 auf '5' setzen, und in den anderen Abschnitten setzt Du ihn auf 0 und setzt dort auch den Ausgang auf LOW

Am Anfang des loop kommt dann ein kleiner Programmblock, wo der Zähler bearbeitet wird. Etwa so:

Code:
if ( timer > 0 ) {
    timer --;
   if ( timer == 0 ) digitalWrite( Ausgang = HIGH );
}
...
if ( sensorwert > 500 ) {
    timer = 0;
    digitalWrite( Ausgang, LOW );
    ...
} else if ( sensorwert > 150 ) {
    if ( timer == 0 ) timer = 5;
    ...
} else if ( sensorwert > 10 ) {
    timer = 0;
    digitalWrite( Ausgang, LOW );
    ....
} else { // die Abfrage auf < 10 ist hier überflüssig
    timer = 0;
    digitalWrite( Ausgang, LOW );
    ...
}

Wenn der Sensorwert dauerhaft zwischen 150 und 500 bleibt wird in dem Code der Timer immer wieder aufgezogen, nach dem der Ausgang gesetzt wurde. Das macht zwar nichts ( der Ausgang wird eben alle 5 Sec erneut gesetzt ) aber das könnte man gegebenenfalls auch noch unterbinden indem man prüft, ob der Ausgang schon gesetzt ist.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.10.2017, 01:11
Beitrag #12
RE: Ausbruch aus dem loop. Ganz einfach, ODER?
(29.10.2017 20:37)MicroBahner schrieb:  
(29.10.2017 18:47)Jan_OL schrieb:  Also der sog. timer soll bei dem Sensorwert >150 aktivieren und nach zb.5 sec einen weiteren Ausgang auf HIGH setzen. Sobald der wert aber kleiner <150 oder >500 überschreitet, soll er abgebrochen werden.
Dann musst Du ihn im Abschnitt >150 auf '5' setzen, und in den anderen Abschnitten setzt Du ihn auf 0 und setzt dort auch den Ausgang auf LOW

Am Anfang des loop kommt dann ein kleiner Programmblock, wo der Zähler bearbeitet wird. Etwa so:

Code:
if ( timer > 0 ) {
    timer --;
   if ( timer == 0 ) digitalWrite( Ausgang = HIGH );
}
...
if ( sensorwert > 500 ) {
    timer = 0;
    digitalWrite( Ausgang, LOW );
    ...
} else if ( sensorwert > 150 ) {
    if ( timer == 0 ) timer = 5;
    ...
} else if ( sensorwert > 10 ) {
    timer = 0;
    digitalWrite( Ausgang, LOW );
    ....
} else { // die Abfrage auf < 10 ist hier überflüssig
    timer = 0;
    digitalWrite( Ausgang, LOW );
    ...
}

Wenn der Sensorwert dauerhaft zwischen 150 und 500 bleibt wird in dem Code der Timer immer wieder aufgezogen, nach dem der Ausgang gesetzt wurde. Das macht zwar nichts ( der Ausgang wird eben alle 5 Sec erneut gesetzt ) aber das könnte man gegebenenfalls auch noch unterbinden indem man prüft, ob der Ausgang schon gesetzt ist.

Da passt irgendwas nicht.
Code:
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
//SoftwareSerial softSerial(99, 4); //99 dummy 4 pin ausgang senden

SoftwareSerial mySerial(99, 4); // RX, TX


int eingang = A3;   // Sensorik leitfähigkeit Mensch
int sensorWert = 0; // Sensorwert startet bei 0
int LED_Rot = 0;    // Sensorwert zu hoch
int LED_Gelb = 1;   // Sensorwert zu niedrig
int LED_Gruen = 2;  // Sensorwert richtig (Soll zeitversetzt int Relais aktivieren?)
//int Relais = 4;   // deaktiviert wird für softSerial zum auslesen der Sensorwerte benötigt.


void setup() {

  //softSerial.begin(9600);     // Serieller Monitor auf 19200
  mySerial.begin (9600);
  mp3_set_serial (mySerial);  //set softwareSerial for DFPlayer-mini mp3 module
  mp3_set_volume (10);
  pinMode(LED_Rot, OUTPUT);   // Wir sind was wir sind
  pinMode(LED_Gelb, OUTPUT);  // Wir sind was wir sind
  pinMode(LED_Gruen, OUTPUT); // Wir sind was wir sind
//  pinMode (Relais, OUTPUT); // Wir sind was wir sind
  
}

void loop()
{
  sensorWert =analogRead(eingang);                    // Die Spannung auslesen und unter der Variable sensorWert abspeichern.
  //softSerial.print ("Leitfähigkeit = " );           // Ausgabe am Serial-Monitor:
  //softSerial.println(sensorWert);                     // Schreibt Wert vom analog Eingang
  delay (1000); // Jede Sekunde immer und immer und immer wieder
  
if ( timer > 0 ) {
    timer --;
   if ( timer == 0 ) digitalWrite( Ausgang = HIGH );
}

if (sensorWert > 500)                                 // viel zu hoch
{
  timer = 0;
    digitalWrite( Ausgang, LOW );
   digitalWrite(LED_Rot, HIGH);                        // an
  digitalWrite(LED_Gelb, LOW);                         // aus
  digitalWrite(LED_Gruen, LOW);                        // aus
  //digitalWrite(Relais, LOW);                           // aus
}




else if (sensorWert > 150)                                  //genau richtig
{
    if ( timer == 0 ) timer = 5;
  digitalWrite(LED_Gruen, HIGH);                       // an
  digitalWrite(LED_Gelb, LOW);                         // aus
  digitalWrite(LED_Rot, LOW);                         // aus
  mp3_play (4);
  //digitalWrite(Relais, HIGH);                          // aus
}

else if (sensorWert > 10)                                  // da geht noch mehr
{
  timer = 0;
    digitalWrite( Ausgang, LOW );
    digitalWrite(LED_Gelb, HIGH);                        // an
   digitalWrite(LED_Rot, LOW);                          // aus
   digitalWrite(LED_Gruen, LOW);                        // aus
   //digitalWrite(Relais, LOW);                           // aus                    
}
else if (sensorWert < 10)                                  // alles aus
{
   digitalWrite(LED_Gelb, LOW);                         // aus
   digitalWrite(LED_Rot, LOW);                          // aus
   digitalWrite(LED_Gruen, LOW);                        // aus
  // digitalWrite(Relais, LOW);                           // aus            
}
  
  
  delay (100);                                          // und das ganze wieder von vorne immer und immer usw.
}

//Ende
Code:
Arduino: 1.8.5 (Windows 7), Board: "ATtiny25/45/85, ATtiny85, Internal 8 MHz"

C:\Users\Zuhause\Desktop\sensor_testebene\sensor_testebene.ino: In function 'void loop()':

sensor_testebene:36: error: 'timer' was not declared in this scope

if ( timer > 0 ) {

      ^

sensor_testebene:38: error: 'Ausgang' was not declared in this scope

    if ( timer == 0 ) digitalWrite( Ausgang = HIGH );

                                    ^

sensor_testebene:43: error: 'timer' was not declared in this scope

   timer = 0;

   ^

sensor_testebene:44: error: 'Ausgang' was not declared in this scope

     digitalWrite( Ausgang, LOW );

                   ^

sensor_testebene:56: error: 'timer' was not declared in this scope

     if ( timer == 0 ) timer = 5;

          ^

sensor_testebene:66: error: 'timer' was not declared in this scope

   timer = 0;

   ^

sensor_testebene:67: error: 'Ausgang' was not declared in this scope

     digitalWrite( Ausgang, LOW );

                   ^

exit status 1
'timer' was not declared in this scope

Aber mal rein vom Verständnis. Er würde dann ja alle Funktionen ab erreichen des sensorWertes > 150 um 5 sec verzögern.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.10.2017, 09:45
Beitrag #13
RE: Ausbruch aus dem loop. Ganz einfach, ODER?
(30.10.2017 01:11)Jan_OL schrieb:  Da passt irgendwas nicht.
Naja, ein bisschen 'Mitdenken' ist bei den Vorschlägen und Codeschnipseln schon nötig. Natürlich musst Du die verwendeten Variablen noch definieren. Und ich weis ja auch nicht, welchen Ausgang Du da schalten willst. Das musst Du schon noch entsprechend anpassen.
(30.10.2017 01:11)Jan_OL schrieb:  Aber mal rein vom Verständnis. Er würde dann ja alle Funktionen ab erreichen des sensorWertes > 150 um 5 sec verzögern.
Warum? Sobald ein anderer Sensorwert erkannt wird, wird die Zeitzählung doch wieder abgebrochen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.10.2017, 15:02
Beitrag #14
RE: Ablaufstruktur beim arbeiten mit Sensorwerten?
Ja es war schon spät und ich dachte ich hätte einen Ausgang mit (Ausgang) definiert.

Es funktioniert aber trotzdem nicht. Kannst du mir die funktion mal genauer beschreiben. bzw ich schreibe das mal in den Code Schnipsel was ich denkr.

Code:
if ( timer > 0 ) {
    timer --;
   if ( timer == 0 ) digitalWrite( Ausgang = HIGH ); //gibt den Ausgang an der nach Ablauf der Zeit geschaltet wird.?
}
...
if ( sensorwert > 500 ) {
    timer = 0; // setzt den timer auf 0 und damit auch den Ausgang auf LOW?
    digitalWrite( Ausgang, LOW ); // wenn der angebende. Ausgang LOW ist
    ...
} else if ( sensorwert > 150 ) {
    if ( timer == 0 ) timer = 5; // schaltet nach 5 Sekunden den oben definierten Ausgang auf HIGH
    ...
} else if ( sensorwert > 10 ) {
    timer = 0; //wie bei sensorwert >500
    digitalWrite( Ausgang, LOW );
    ....
} else { // die Abfrage auf < 10 ist hier überflüssig (weil sowieso alle Ausgänge als LOW definiert sind.?
    timer = 0;
    digitalWrite( Ausgang, LOW );
    ...
}

In etwa so?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.10.2017, 21:19 (Dieser Beitrag wurde zuletzt bearbeitet: 30.10.2017 21:30 von georg01.)
Beitrag #15
RE: Ablaufstruktur beim arbeiten mit Sensorwerten?
Hallo,
ja die Loop ist schon "komisch". Ist lediglich eine Endlosschleife.
Ich habe was für Dich gebastelt. Lade es auf Deinen Uno (Pins bitte beachten) und Teste es.

CODE:
Code:
int LED_Rot = 2;
int LED_Gelb = 3;
int LED_Gruen = 4;
int count;

void setup() {

  Serial.begin(9600);

  pinMode(LED_Rot, OUTPUT);
  pinMode(LED_Gelb, OUTPUT);
  pinMode(LED_Gruen, OUTPUT);
  
  count = 0;
}

void loop() {

  Serial.println(count);

  if (count == 10) {
    digitalWrite(LED_Rot, HIGH);
  }

  if (count == 20) {
    digitalWrite(LED_Rot, LOW);
    count = 0; // hier wird die count Variable wieder auf null gemacht
  }

  digitalWrite(LED_Gruen, HIGH);  // loop Zeit Start
  delay (500);  // 0,5s Warten
  digitalWrite(LED_Gruen, LOW);
  delay (500); // 0,5s Warten // loop Zeit Ende
  // Also 500 + 500 = 1000 = 1sek.
  count += 1;
}

Mit:
Code:

void loop() {

  digitalWrite(LED_Gruen, HIGH);  // loop Zeit Start
  delay (500);  // 0,5s Warten
  digitalWrite(LED_Gruen, LOW);
  delay (500); // 0,5s Warten // loop Zeit Ende
  // Also 500 + 500 = 1000 = 1sek.
}
blinkt die Grüne LED im Sekundentakt.

Weiterhin habe ich dazu einen Zähler eingebaut (count), welches lediglich seinen Wert bei jedem loop um eins erhöht. Die komplette Durchlaufzeit beträgt eigentlich nur die zwei delay(500) Interwale (Rest braucht auch Zeit … aber lassen wir die mickros!)
Man kann also davon ausgehen, dass die count Variable sich jede Sekunde um 1 erhöht. Wenn Du die beiden delays auf -> delay(1000) änderst, dann hast Du 2x1000 => 2sek.

Code:

void loop() {

  Serial.println(count);

  digitalWrite(LED_Gruen, HIGH);  // loop Zeit Start
  delay (500);  // 0,5s Warten
  digitalWrite(LED_Gruen, LOW);
  delay (500); // 0,5s Warten // loop Zeit Ende
  // Also 500 + 500 = 1000 = 1sek.
  count += 1;
}

Öffne dafür den Seriel Monitor und verfolge das Ganze. (die Serial.println(count) Ausgabe also)
Jetzt soll die loop- Schleife endlich etwas verständlicher sein.

Letztendlich wurden zwei if() Abfragen implementiert, die Lauschen auf den Zähler (count Variable) Hat die count Var. den Wert 10 erreicht, so wird die Rote LED Leuchten, wird die count Var. den Wert 20 erreichen, so geht die Rote LED aus. Die Rote LED leuchtet 11sek Lang! Experimentiere es mit den Werten.

Code:
...
  if (count == 10) {
    digitalWrite(LED_Rot, HIGH);
  }

  if (count == 20) {
    digitalWrite(LED_Rot, LOW);
    count = 0; // hier wird die count Variable wieder auf null gemacht
  }
...

Gehe den Code solange nach (Analysiere es bitte) bis Du die Loop- Schleife begriffen hast.

Programmieren ist nicht die Befehle kennenzulernen, - dafür haben wir API- Doku … es ist (Allgemein) Logisches Denken und deren Verknüpfungen zu schaffen.
Ich werde mich freuen wenn mein Sketch Dir weiterhelfen kann.
Gruß Georg

EDIT!!!-------------
Ach so wichtiges habe ich vergessen!
Meine count ist Franz-Peter-s seine timer! (??? )

Sorry für mein nicht korrektes Deutsch. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.10.2017, 21:35 (Dieser Beitrag wurde zuletzt bearbeitet: 30.10.2017 21:36 von MicroBahner.)
Beitrag #16
RE: Ablaufstruktur beim arbeiten mit Sensorwerten?
(30.10.2017 15:02)Jan_OL schrieb:  Ja es war schon spät und ich dachte ich hätte einen Ausgang mit (Ausgang) definiert.

Es funktioniert aber trotzdem nicht. Kannst du mir die funktion mal genauer beschreiben. bzw ich schreibe das mal in den Code Schnipsel was ich denkr.

Code:
if ( timer > 0 ) {
    timer --;
   if ( timer == 0 ) digitalWrite( Ausgang = HIGH ); //gibt den Ausgang an der nach Ablauf der Zeit geschaltet wird.?
                                                     // -> Ja, richtig
}
...
if ( sensorwert > 500 ) {
    timer = 0; // setzt den timer auf 0 und damit auch den Ausgang auf LOW?
               // -> Der Ausgang wird dadurch nicht auf LOW gesetzt, es wird nur verhindert,
               // dass  er auf HIGH gesetzt wird
    digitalWrite( Ausgang, LOW ); // wenn der angebende. Ausgang LOW ist
                                  // -> der angegebene Ausgang wird auf LOW gesetzt
                                  // ( in der Zeile darüber wird es ja nicht gemacht )
    ...
} else if ( sensorwert > 150 ) {
    if ( timer == 0 ) timer = 5; // schaltet nach 5 Sekunden den oben definierten Ausgang auf HIGH
                                 // -> ja, über den Anweisungsblock ganz oben. Das mit den 5Sec. funktioniert
                                 // so nur, weil Du ein delay(1000) in deinem loop hast
                                 // Bei jedem loop-Durchlauf wird 'timer' um eins verringert, und
                                 // wenn '0' erreicht ist wird der Ausgang gesetzt. Da bei dir ein
                                 // loop-Durchlauf ca 1sec dauert, dauert das insgesamt 5 Sekunden
    ...
} else if ( sensorwert > 10 ) {
    timer = 0; //wie bei sensorwert >500
    digitalWrite( Ausgang, LOW );
    ....
} else { // die Abfrage auf < 10 ist hier überflüssig (weil sowieso alle Ausgänge als LOW definiert sind.?
         // -> ist überflüssig, weil er hier sowieso nur hinkommt, wenn der sonsorwert <= 10 ist
         // in allen anderen Fällen wird einer der vorherigen if-Blöcke ausgeführt.
    timer = 0;
    digitalWrite( Ausgang, LOW );
    ...
}

In etwa so?
Meine Antworten habe ich im Code hinzugefügt.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Fehler beim Hochladen auf Atmega 328 delay 17 781 30.07.2019 12:33
Letzter Beitrag: Tommy56
  DCF77 Fehler beim Kompilieren Xwill 5 807 11.06.2019 21:47
Letzter Beitrag: Tommy56
  Arbeiten mit Arrays Jan99 23 1.666 08.03.2019 10:10
Letzter Beitrag: MicroBahner
  Hilfe benötigt beim Verknüpfen von Klassen Batucada 7 788 02.03.2019 23:47
Letzter Beitrag: georg01
  Arduino IDE Fehler beim öffnen des Seriallen Monitors mgm099 6 844 28.12.2018 12:42
Letzter Beitrag: mgm099
  Problem beim Hochladen flint74 8 1.132 26.12.2018 19:26
Letzter Beitrag: Tommy56
  Warnung beim Kompilieren, deren Bedeutung Christian_Moba-Arduino 9 1.162 17.11.2018 09:31
Letzter Beitrag: amithlon
  Roboterbein, Probleme beim Methoden programmieren Thundernici 4 1.018 02.10.2018 19:58
Letzter Beitrag: Tommy56
  Problem beim Kompilieren Mega2560 und Dallastemp sepp01 2 739 24.09.2018 11:33
Letzter Beitrag: sepp01
  Fehlermeldung beim kompilieren Cotti 4 948 14.09.2018 14:01
Letzter Beitrag: Cotti

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste