Problem Temp messung unterbricht bei lcd Display an und aus schalten

Ein freundliches Hallo in die runde,

und hmmm ja wieder ein blutiger anfänger. Kurz zu mir ich bin 34 Jahre und hatte bis vor 1/2 Jahr mit Microcontroller und co nix am hut.

(wehn das drum herum nicht interessiert scrollt jetzt dann weiter bis zur ------ lienie)

bis ich auf ein Arduino und ein CNC Shield im internet gestossen bin und damit endlich eine alte CNC Fräse angesteuern konnte (sie lief damals unter DOS und ansteuerung war nicht mehr vorhanden)

allerdings lies mich der Microcontroller nicht mehr in ruhe fand es wahnsinig interesant, worauf ich mir nochmal einen besorgte mit zubehör.

Probierte hier und da und schon hatte ich ein Projekt im Kopf,

Ich habe nämlich das Problem an einem 40 Jahr alten Wohnwagen mit dem Kühlschrank wenn es im Sommer zimmlich warm ist bzw. ich damit in Wärmeren Länder bin bekomme ich die Warmluft hinten nicht schnell genug weg und er hört dann auf richtig zu kühlen. also baute ich zwei PC lüfter ein und klemmte die mit einem Schalter an die Batterie. was dann zur folge hatte das ich nach 2 Tagen keinen saft mehr hatte da unter anderem die lüfter immer volle pulle durchgelaufen sind

dann einen Skatch genommen der Temperatur misst und ab einer bestimmten Temperatur ein alarm gibt, anstatt des alarms nehme ich ein Relais um die Lüfter an und aus zu schalten...

Im Prinzip hatte ich auch schon alles was ich vorerst wollte, dann ohh LCD Display um werte Abzulesen währe auch cool, aber es sollte nicht immer an sein, und um eventuell später noch andere sachen abzufragen

und ab Jetzt beginnen meine Probleme......


wenn ich wie im ersten Skatch die Taste drücke zeigt es mir die Temperatur auf dem display an aber ich muss natürlich auf der Taste bleiben, ich will aber das bei einmaligem drücken der Taste die beleuchtung und schrift anbleibt und bei erneutem drücken das Display und beleuchtung wieder aus geht. ( okey ich könnte auch einfach einen entsprechenden schalter dafür nehmen, will ich aber nich währe ja sonst langweilig)

Das hab ich zwar im zweiten Skatch hinbekommen allerdings misst es mir jetzt die Temperatur nur jeweils wenn ich die Taste drücke, somit hab ich zwar das mit dem Display hinbekommen aber dafür keine automatische Temperaturmesung mehr....

Jetzt meine Frage wie bekomme ich es hin das einmal die temperatur gemessen wird und das Relais schaltet ohne das die tasten drückerei dies beeinflusst....

ich werwarte keine komplettlösung ich währe schon zu frieden in die richtige richtung geschupst zu werden da ich schon einiges versuchte aber nicht weiter komme, und natürlich will ich es verstehen wie es funktioniert.

Skatch 1

/*  Steuerung für Kühlschrank im Wohnwagen "Kühlschrank bekommt bei Hohen ausentemperaturen die abwärme
 *  nicht weg transportiert" dadurch kühlt Kühlschrank nicht mehr.
 *  
 *  Wenn eine Temperatur von X C° erreicht oder überschritten ist wird über ein Relais ein oder zwei
 *  PC lüfter eingeschaltet kühlt er wieder ab unter X C° schalten die Lüfter wieder ab

*/
//#include <OneButton.h>                        //OneButten Bibliothek hochladen
#include <Wire.h>                                   //Wire Bibliothek hochladen
#include <LiquidCrystal_I2C.h>                //LiquidCrystal Bibliothek hochladen

LiquidCrystal_I2C lcd(0x3F, 16, 2);            // angaben um welches LCD Display es sich handelt



int LM35 = A0;                                       // Pin A0 heißt jetzt LM35 
int sensorwert1;                                     // Sensorwert vom LM35 
int temperatur = 0;                                // Legt temperatur mit Startwert 0 fest
int t=20;                                               // t = 20ms zeit stop
int luefter = 5;                                       // Pin 5 wird als Luefter bezeichnet
int Taste = 4;                                         // Pin 3 wird als Taste bezeichnet
int TastenStatus = 0;                              // TastenStatus wird mit 0 (LOW) festgelegt 
                 

//------------------------------------------------------------------------------------------------

void setup() {
  
  Serial.begin(9600);                              // startet den Serialenmonitor
  
  lcd.begin();                                         // Startet das LCD Display
  
  pinMode (luefter,OUTPUT);                   // setzt den Pin 5 (luefter) als ausgang fest
  pinMode (Taste, INPUT);                      // setzt den Pin 4 (Taste) als eingang fest
  



}

//------------------------------------------------------------------------------------------------

void loop() {


 
  
  TastenStatus = digitalRead(Taste);             // liest den TastenStatus ob HIGH (gedrückt) oder LOW (nicht gedrückt)

  Serial.print("             Taste");                    // Sreibt im Serialmonitor das wort Taste
  Serial.println(TastenStatus);                      // und den Status ob HIGH (1) oder LOW (0)

  
   
  if  (digitalRead(TastenStatus) == LOW)      // wenn TastenStatus HIGH also 1 ist schaltet das lcd Display an.
      {
        lcd.display();
        lcd.backlight();
        
                        
      }

  if (digitalRead(TastenStatus) == HIGH)      // wenn Tastenstatus LOW Display und beleuchtung aus
      {
        lcd.noDisplay();
        lcd.noBacklight();
        
                                         
      }


  sensorwert1 = analogRead(LM35);                       // sensorwert auslesen vom (LM35)       
  temperatur = map (sensorwert1,0,307,0,150);     // map (sensorwert,0,307,0,150) rechnet die LM35 Daten um und zeigt ise als temperatur an                     
  delay(t);                                                            // (t) sagt 1000 milisec warten siehe oben?"
  
  
  Serial.print(temperatur);                                    // gibt an serial Monitor die Temperatur aus
  Serial.println(" C° ");                                         // schreibt hinte der Temperatur (C°)


  lcd.setCursor(0,0);                                            // setzt den Cursur in die linke obere ecker der ersten zeile
  lcd.println("Temperatur :     ") ;                          // schreibt im LCD Display Temperatur :
  lcd.setCursor(11,0);                                          // setzt den Cursor auf die 11te stelle
  lcd.print( temperatur );                                     // schreibt den gemesenen wert, und das kürzel C dahinter
  lcd.println(" C ");
  
 


    if  (temperatur>=27)                                     // ist die temperatur gleich oder höher als 37°
  
        {digitalWrite(luefter,HIGH);}                      // schaltet der lüfter auf HIGH also an
    
   
    else                                                              // wenn nicht bleibt der lüfter aus
        {digitalWrite(luefter,LOW);}

   
  }

Skatch 2

#include <OneButton.h>
#include <Wire.h>                                   //Wire Bibliothek hochladen
#include <LiquidCrystal_I2C.h>                //LiquidCrystal Bibliothek hochladen

LiquidCrystal_I2C lcd(0x3F, 16, 2);            // angaben um welches LCD Display es sich handelt



int LM35 = A0;                                        // Pin A0 heißt jetzt LM35 
int sensorwert1;                                      // Sensorwert vom LM35 
int temperatur = 0;                                 // Legt temperatur mit Startwert 0 fest
int t=200;                                              // t = 200ms zeit stop

int luefter = 5;                                       // Pin 5 wird als Luefter bezeichnet

int Taste = 4;                                         // Pin 4 wird als Taste bezeichnet
int TastenStatus = 0;                              // TastenStatus wird mit 0 (LOW) festgelegt 

//int buttonPushCounter = 0;                  // counter for the number of button presses

//int letzterTastenStatus = 0;                  // previous state of the button
int merker = 0;                                      // 0 meint: Display ist aus, 1 meint Display ist an

//------------------------------------------------------------------------------------------------

void setup() {
  
  Serial.begin(9600);                              // startet den Serialenmonitor
  
  lcd.begin();                                         // Startet das LCD Display
  
  pinMode (luefter,OUTPUT);                   // setzt den Pin 5 (luefter) als ausgang fest
  pinMode (Taste, INPUT);                      // setzt den Pin 3 (Taste) als eingang fest
 // digitalWrite (Taste, HIGH);
  


}

//------------------------------------------------------------------------------------------------

void loop() {

 
  
 TastenStatus = digitalRead(Taste);            // liest den TastenStatus ob HIGH (gedrückt) oder LOW (nicht gedrückt)

 Serial.print("Taste");                                // Sreibt im Serialmonitor das wort Taste
 Serial.println(TastenStatus);                     // und den Status ob HIGH (1) oder LOW (0)

  
   
    //if  (digitalRead(TastenStatus) == LOW)           // wenn TastenStatus HIGH also 1 ist schaltet das lcd Display an.

    if (digitalRead (Taste)==LOW && merker ==0)
        {   
          lcd.display();                                            // schaltet das lcd Display an.
          lcd.backlight();                                         // schaltet sich die Hintergrund beleuchtung an.
          merker=1;
          while (digitalRead (Taste)==LOW);
          //delay(10);
        
        }

    if (digitalRead (Taste) ==LOW && merker ==1)                 // wenn nicht also (0)...
        {
         lcd.noDisplay();
         lcd.noBacklight();                                                      // bleibt es aus
         merker =0;
         while (digitalRead(Taste) == LOW);
        //delay(10);
        }


    
/*    war nur zum Testen
 *     

    if  (buttonStatus == HIGH)           // LCD Display bleibt nach drücken des buttons 10 sec an (PROBLEM     PROGRAM BLEIBT STEHEN UND FRIERT DEN WERT EIN)
        {delay(10000);}

    else                                                  // wenn nicht läuft program weiter
        {delay(0);}
*/
        
 
  sensorwert1=analogRead(LM35);                     // sensorwert auslesen vom (LM35)       
  temperatur= map (sensorwert1,0,307,0,150);  // map (sensorwert,0,307,0,150) rechnet die LM35 Daten um und zeigt ise als temperatur an                     
  delay(t);                                                        // (t) sagt 1000 milisec warten siehe oben?"
  
  
  Serial.print(temperatur);                                // gibt an serial Monitor die Temperatur aus
  Serial.println(" C° ");                                     // schreibt hinte der Temperatur (C°)


  lcd.setCursor(0,0);                                        // setzt den Cursur in die linke obere ecker der ersten zeile
  lcd.println("Temperatur :     ") ;                      // schreibt im LCD Display Temperatur :
  lcd.setCursor(11,0);                                      // setzt den Cursor auf die 11te stelle
  lcd.print( temperatur );                                 // schreibt den gemesenen wert, und das kürzen C° dahinter
  lcd.println(" C ");
  
 


    if  (temperatur>=27)                                  // ist die temperatur gleich oder höher als 27°
  
        {digitalWrite(luefter,HIGH);}                    // schaltet der lüfter auf HIGH also an
    
   
    else                                                           // wenn nicht bleibt der lüfter aus
        {digitalWrite(luefter,LOW);}

   
  }

ich danke euch schon mal

Schau Dir mal hier den Beitrag #7 von agmue an.
Das sollte sein, was Du suchst. Musst es nur auf die Hintergrundbeleuchtung, statt auf die interne LED anwenden.

Du machst das mit delay().
Das heisst nix anderes, als dass der Controller in deinem Fall zehn Sekunden einfach nur wartet, bis sie um sind.
Erst danach tut er wieder _irgendwas.

Wenn du verstehen willst, wie es funktioniert (find ich gut!), dann schau dir mal das mitgelieferte Beispielprogramm BlinkWithoutDelay an. Das ist bei der IDE-Installation dabei, du findest es unter Beispiele.
Dort wird, im Prinzip, genau das gemacht, was du willst, nur mit der Bord-LED und ner anderen Zeit (ne Sekunde, glaub ich).
Aber diese Vorgehensweise kann dein Problem leicht lösen.

Vielen dank Moko und Rabenauge für die schnelle Antwort.

Den link werd ich mir mal vornehmen, ach so sorry Rabenauge die 10 sec stehen in /* */ war der erste Versuch hab aber gleich bemerkt das das delay mir nicht hilft hatte ich nur noch nicht rausgelöscht.

BlinkWithoutDelay hatte ich mir auch schon angeschaut und versucht nur bin ich glaub noch zu doof dafür, hatte versucht das LCD. Display da mit ein zu bringen aber klappte bei mir noch nicht... Hatte es versucht durch die Led zu ersetzen aber ich kann beim Display ja kein HIGH oder LOW definieren.

Aber ich werde es auf jedenfall nochmal versuchen danke

Denk Dir dochj einfach mal for LOW:

lcd.noDisplay();
lcd.noBacklilight();

und für HIGH:

lcd.display();
lcd.backlilight();

Evtl. wird BlinkWithoutDelay dann verständlich.

Gruß Tommy

Moko vielen dank das war genau das was ich brauchte damit es so funktioniert wie ich das möchte,
hab es umgeändert das es mit dem Display funktioniert und komischerweisse hab ich es auch richtig gemacht.
Nur so richtig verstanden hab ich es noch nicht ganz was da genau passiert,
für einen wie mich währe es echt top wenn eine erklärung dahinter stehen würde.

was mir aufgefallen ist, ist das beim erstenmal starten also an Strom anschliessen der erste Tastendruck nichts macht erst beim zweiten mal schällt er das Display aus, ich gehe mal davon aus das der erste Tastendruck wohl notwendig ist um irgendeine zeit oder aktion zu messen....

was echt irre ist, ich stehe Täglich an Anlagen und bediene diese über lcd Displays und Tasten. Mir wird aber erst jetzt seit dem ich an der sache rumgrübel klar was da hinter steckt und betrachte es aus einer gans anderen sicht

Jonfeli:
Nur so richtig verstanden hab ich es noch nicht ganz was da genau passiert,
für einen wie mich währe es echt top wenn eine erklärung dahinter stehen würde.

bei

"ledStatus = !ledStatus;"

negierst bei jedem Tastendruch den aktuellen Statusder Variable ledStatus: aus "FALSE" wird "TRUE", beim nächsten Druck wird aus "TRUE" wieder "FALSE"

bei der Abfrage

"if (ledStatus)"

wird je nach Wert der Variable "ledstatus" die LED (oder bei Dir das Display) ein- oder ausgeschaltet

Das mit den aktMillis und tasterMillis dient zum Entprellend es Tasters.

Jonfeli:
was mir aufgefallen ist, ist das beim erstenmal starten also an Strom anschliessen der erste Tastendruck nichts macht erst beim zweiten mal schällt er das Display aus, ich gehe mal davon aus das der erste Tastendruck wohl notwendig ist um irgendeine zeit oder aktion zu messen....

dann stell den aktuellen Sketch mal ein, vlt finden wir den Fehler dann.

//#include <OneButton.h>                        //OneButten Bibliothek hochladen
#include <Wire.h>                             //Wire Bibliothek hochladen
#include <LiquidCrystal_I2C.h>                //LiquidCrystal Bibliothek hochladen

LiquidCrystal_I2C lcd(0x3F, 16, 2);           // angaben um welches LCD Display es sich handelt



int LM35 = A0;                                // Pin A0 heißt jetzt LM35 
int sensorwert1;                              // Sensorwert vom LM35 
int temperatur = 0;                           // Legt temperatur mit Startwert 0 fest
int t=200;                                     // t = 20ms zeit stop
int luefter = 5;                              // Pin 5 wird als Luefter bezeichnet
int Taste = 4;                                // Pin 3 wird als Taste bezeichnet
int TastenStatus = 0;                         // TastenStatus wird mit 0 (LOW) festgelegt 
                 
uint32_t aktMillis, tasterMillis;
bool DisplayStatus, aktTaste,altTaste;

//------------------------------------------------------------------------------------------------

void setup() {
  
  Serial.begin(9600);                         // startet den Serialenmonitor
  
  lcd.begin();                                // Startet das LCD Display
  
  pinMode (luefter,OUTPUT);                   // setzt den Pin 5 (luefter) als ausgang fest
  pinMode (Taste, INPUT_PULLUP);                     // setzt den Pin 4 (Taste) als eingang fest
  



}

//------------------------------------------------------------------------------------------------

void loop() {


aktMillis = millis();
  altTaste = aktTaste;
  if (aktMillis - tasterMillis >= 30)
  {
    tasterMillis = aktMillis;
    aktTaste = digitalRead(Taste);
  }
  if (altTaste && !aktTaste)
  {
    DisplayStatus = !DisplayStatus;
    if (DisplayStatus)
    {
      
      lcd.display();
      lcd.backlight();
    } 
    else {
      
      lcd.noDisplay();
      lcd.noBacklight();
    }
  }



  TastenStatus = digitalRead(Taste);            // liest den TastenStatus ob HIGH (gedrückt) oder LOW (nicht gedrückt)

  Serial.print("             Taste");           // Sreibt im Serialmonitor das wort Taste
  Serial.println(TastenStatus);                 // und den Status ob HIGH (1) oder LOW (0)


  sensorwert1 = analogRead(LM35);               // sensorwert auslesen vom (LM35)       
  temperatur = map (sensorwert1,0,307,0,150);   // map (sensorwert,0,307,0,150) rechnet die LM35 Daten um und zeigt ise als temperatur an                     
  delay(t);                                     // (t) sagt 1000 milisec warten siehe oben?"
  
  
  Serial.print(temperatur);                     // gibt an serial Monitor die Temperatur aus
  Serial.println(" C° ");                       // schreibt hinte der Temperatur (C°)


  lcd.setCursor(0,0);                           // setzt den Cursur in die linke obere ecker der ersten zeile
  lcd.println("Temperatur :     ") ;            // schreibt im LCD Display Temperatur :
  lcd.setCursor(11,0);                          // setzt den Cursor auf die 11te stelle
  lcd.print( temperatur );                      // schreibt den gemesenen wert, und das kürzel C dahinter
  lcd.println(" C ");
  
 


    if  (temperatur>=27)                        // ist die temperatur gleich oder höher als 37°
  
        {digitalWrite(luefter,HIGH);}           // schaltet der lüfter auf HIGH also an
    
   
    else                                        // wenn nicht bleibt der lüfter aus
        {digitalWrite(luefter,LOW);}

    }

ich weis nicht ob es damit was zu tun hat, aber zuvor war bei mir der Pin 4 (Taste) als pinMode (Taste,INPUT); und in dem beispiel ist es pinMode(Taste,INPUT_PULLUP);
vorher hatte ich keine spannung auf Pin 4 und jetzt hab ich durch den PULLUP 5V, hab irgendwo auch was davon gelesen das es so woll besser sei.

vorhin hatte ich am Taster einmal 5V und dann Pin 4 mit einem wiederstand auf GND
das hab ich jetzt abgeändert sonst hätte ich ja eine dauer verbindung wen Pin 4 jetzt HIGH ist mit wiederstand auf GND, also hab ich den wiederstand komplett rausgenommen und die andere seite der Taste auf GND gelegt.

wenn das Display aus ist habe ich auf Pin 4 5,01 V wenn das Display an ist 4,87V

Ich denke es könnte daran liegen, dass Dein Displaystatus beim Starten 0 ist.
Beim ersten Tastendruck schaltest Du auf 1 um.
Die anschließende Abfrage schaltet das Display nochmals ein (obwohl es schon an ist).

Versuch es mal mit

bool DisplayStatus =1;
bool aktTaste,altTaste;

statt:

bool DisplayStatus, aktTaste,altTaste;

dann sollte beim ersten Tastendruck das Display ausgehen.
Kann es leider nicht testen, da bei meinem Display die Hintergrundbeleuchtung sich nicht abschalten lässt, oder ich eine andere Version der Library habe.

jep genau das war es, wahnsin.

wie ist das denn wenn ich eine anzeige auf das LCD schicke zb. ("Temperatur") das dies mir auf dem display anzeigt habe ich immer auf der Anzeige hinter dem Text zwei sequenzen (felder) mir Zebrastreifen ich bekomm die nur weg wenn ich dann zb.("Temperatur ") also 6 leerzeichen das alle 16 felder benutzt sind weg... liegt das an der Library?

es sieht so aus:

11111 11111
00000 00000
11111 11111
00000 00000
10111 10111
00000 00000
11111 11111
00000 00000

Hi

Du sendest CR LF mit (eventuell println ??).
Das sind Steuerzeichen und Die sind wohl im Zeichensatz so hinterlegt.

Durch die Leerzeichen schiebst Du diese Zeichen nur weiter nach hinten - wenn Du das Display shiftest, kommen Die wieder nach vorne.

MfG

ja mit println... den rest verstehe ich nicht CR LF????

wie bekomm ich die weg.... gefallen mir nicht. wie du schon sagst ich schiebe sie ja nur hinten raus... auch wenn ich sie dann nicht sehe ich weis das sie da sind... grinz

Hi

printLN fügt am auszugebendem String eine neue Zeile an, je nach Betriebssystem war Das CR LF (carrige return, line feed - von der Schreibmaschine - Wagen Rücklauf, Zeilenschritt).
Wenn Du statt printLN nur print benuzt, wird keine 'neue Zeile' gesendet.
Im Terminal ist das LN dafür da, daß Du ... in die neue Zeile kommst :wink:
Auf dem LCD wird Das anders gemacht, indem Du an die Stelle springst, wo Du als Nächstes schreiben willst.

Also
lcd.println("Text"); ergibt TextCR**LF
lcd.print("Text"); egibt Text

MfG

Also diese Zeilen:
lcd.println("Temperatur : ") ;
Wenn's auf das LCD geht, das LN weg lassen.

ah ok supi danke, werd es mal morgen Testen..

Hi so jetzt bin ichs es nochmal, ich danke euch nochmal für die schnelle Hilfe. hat jetzt prima geklappt.
leider hatte es mich mit der sch.... Grippe verwischt weswegen ich mich erst jetzt melde.
aber in diesem sinne euch nochmals vielen dank