Arduino im Wohnmobil

Hallo Zusammen,

zwischendurch hatte ich mal wieder zeit zum basteln:

grundlage für meinen erfolg, war der tip mit dem "TIMER" hier:
http://forum.arduino.cc/index.php?topic=198494.0

ich hatte einen einfachen sketch, wo alles ein gelesen und verarbeitet und ausgegeben wurde. entsprechend langsam war dieser auch, aber es erfüllt seine aufgabe. nun möchte ich eine art menü erstellen, wo ich erst mal meine standart-werte (wunschtemp zb) einstellen (grundwert verändern) kann und die taster reagieren sofort (ohne das bearbeiten des DHT22, was die verzögerung auslöst.. warum verstehe ich net ganz, hat wohl was mit der lib zu tun)..
wenn ich es eingestellt hab, bestätige ich und gehe in die ausgabe, wo dann der DHT22, das relais und der (12V) Lüfter gesteuert wird und bei taster "menü" drücken wechselt es wieder in den einstellungsmodus.

soweit die theorie! in der praxis hänge ich in dem sketch bei den "X-en" fest, also dieser sketch, ist die bearbeitung von dem funktionierenden der sehr langsam ist:

mache ich was falsch?? 
was sol denn der mist??? 
: 	
The following error or errors occurred while posting this message:
The message exceeds the maximum allowed length (9500 characters). 

der skecht muss dann in den nächsten poste, sorry!

hab wohl ne denkblockade oder so,.... .. HILFE!

gruß andy

so ein scheiß !!!!!

was soll denn der unsinn mit der zeichenbegrenzung bei sketchen?????

na schön, teil 1:

// LCD
  #include <LiquidCrystal.h>
  LiquidCrystal lcd(39, 41, 43, 45, 47, 49);
  byte grad;
  byte GRAD[8] = {
    B11100,
    B10100,
    B11100,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000
  };
  
// DTH 22
  #include "DHT.h"
  #define DHTPIN 53     // Angeschlossen an Pin
  #define DHTTYPE DHT22   // DHT 22  (AM2302)
  DHT dht(DHTPIN, DHTTYPE);
  float hx;
  float tempx;

// LED Shift Register
  int taktPin = 23;       // SH_CP
  int speicherPin = 25;   // ST_CP
  int datenPin = 27;     // DS
  
  // zahlen VARIABLE
  byte SIEBENsegm;
  
  // F mit punt
  byte FEHLER = B10000101; 
  
  // zahlen
  byte Null = B00100010;
  byte eins = B11111010;
  byte zwei = B00010011;
  byte drei = B01010010;
  byte vier = B11001010;
  byte fuenf = B01000110;
  byte sechs = B00000110;
  byte sieben = B11110010;
  byte acht = B00000010;
  byte neun = B01000010;

  // zahlen mit punkt
  byte NullP = B00100000;
  byte einsP = B11111000;
  byte zweiP = B00010001;
  byte dreiP = B01010000;
  byte vierP = B11001000;
  byte fuenfP = B01000100;
  byte sechsP = B00000100;
  byte siebenP = B11110000;
  byte achtP = B00000000;
  byte neunP = B01000000;
  

// Motor
int motor = 9;  // Basis vom Transistor an PIN 

// TEMP - Berechnung
float wunschtemp = 25.00;

// Relais
int relaisA = 38;
int relaisB = 40;


// Taster
int tasterlinks = 52;  // Plus taste
int tasterlinksX;  // Plus variable

int tasterrechts = 46;  // Minus taste
int tasterrechtsX;  // minus variable

int tasterunten = 48;
int tasteruntenX;

int tasteroben = 50;
int tasterobenX ;

int tastermenu = 42; // MENÜ Taster
int tastermenuX;

int tasterback = 44;
int tasterbackX;

int moduswert;
int moduswertX;
int modus = 0;

int wert = 0;

// Switch Case
int casewert;


//******************************************************************************
//******************************************************************************
//******************************************************************************







void setup() {
//Serial.begin(9600);
  
// TIMER
  TCCR2B = TCCR2B & 0xF8 | 0x07;
// DHT
  dht.begin();
// LCD
  lcd.createChar(grad, GRAD);
  lcd.begin(20, 4);
// LED Shift-Register
  pinMode(taktPin, OUTPUT);
  pinMode(speicherPin, OUTPUT);
  pinMode(datenPin, OUTPUT);
// Motor
  pinMode(motor, OUTPUT);
// Relais
  pinMode(relaisA, OUTPUT);
  pinMode(relaisB, OUTPUT);
// Taster
  pinMode(tasteroben, INPUT);
  pinMode(tasterunten, INPUT);
  pinMode(tastermenu, INPUT);
  pinMode(tasterlinks, INPUT);
  pinMode(tasterrechts, INPUT);
  pinMode(tasterback, INPUT);


}
//*****************************************************************************
//*****************************************************************************
//*****************************************************************************







void loop() {
  
// ++++++ EBENE I +++++   
  


//-------- Beginn SWITCH CASE -------------------------------------  
      switch(casewert)
      {

  // ##### MENU - begin #####        
    
    default:
    
      // LCD - Ausgabe
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("##  *** MENU ***  ##");
    lcd.setCursor(0, 1);
    lcd.print("WunschTemp: ");
    lcd.print(wunschtemp);
    lcd.write(grad);
    lcd.print("C");   
    lcd.print("Unterboden Vent.: ");
    lcd.print(wert);        
    
  // Taster einlesen
  
  // modus auswählen
  if(tastermenuX == HIGH)
  {
    casewert = 1;
  }
    
    
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX    
    
    

}

teil 2:

        case 1:
        
          // LCD - Ausgabe
//          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Luftfeuchte: ");
          lcd.print(hx);
          lcd.print("%");
          lcd.setCursor(0, 1);
          lcd.print("Temp: ");
          lcd.print(tempx);  // DHT22
          lcd.write(grad);
          lcd.print("C");
          lcd.setCursor(0, 2);
          lcd.print("Motor: ");
          lcd.print(wert);
          lcd.setCursor(0, 3);
          lcd.print("WunschTemp: ");
          lcd.print(wunschtemp);
          lcd.write(grad);
          lcd.print("C");   
          
          // Relais 
          digitalWrite(relaisA, HIGH);
          digitalWrite(relaisB, HIGH);
          
          // LED Shift-Register
          digitalWrite(speicherPin, LOW);
          shiftOut(datenPin, taktPin, LSBFIRST, FEHLER);
          digitalWrite(speicherPin, HIGH);

      
          // --- WERT - beginn ---  
            
             tasterobenX = digitalRead(tasteroben);
             tasteruntenX = digitalRead(tasterunten);
             
      
             if(tasterobenX == HIGH)
             { 
               wert++;
               wert = min(9, wert);  // wert MINIMIERT auf 9
               delay(20);
             }
             if(tasteruntenX == HIGH)
             { 
               wert--; 
               wert = max(0, wert);  // wert MAXIMIERT auf 0
               delay(20);
             } 
             
          // --- WERT Berechnung - ende ---
          
          
          
          
          // ~~~ ZURÜCK - begin ~~~
          tasterbackX = digitalRead(tasterback);  
          if(tasterbackX == HIGH)
          {
            casewert = 0;
            break;
          }
          // ~~~ ZURÜCK - ende ~~~
          
          
       
  // ########## MENU - ende ##########



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


  // ######### BEARBEITUNG - begin ##########

         case 0:
          
          // DHT22 - einlesen
          float h = dht.readHumidity();
          float temp = dht.readTemperature();
          tempx = temp;
          hx = h;
          
          
          // Relais
          if(temp <= wunschtemp)                // wenn gemessene "temp" kleiner als "wunschtemp"
          {               
            digitalWrite(relaisB, LOW);         // schalte relais ein (LOW = EIN)
          }                                     
          if(temp >= (wunschtemp + 1.00))       // wenn gemessene "temp" größer als "wunschtemp"
          {      
            digitalWrite(relaisB, HIGH);        // chalte relais aus (HIGH = AUS)
          }
          
          
          // LCD - Ausgabe
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Luftfeuchte: ");
          lcd.print(hx);
          lcd.print("%");
          lcd.setCursor(0, 1);
          lcd.print("Temp: ");
          lcd.print(tempx);  // DHT22
          lcd.write(grad);
          lcd.print("C");
          lcd.setCursor(0, 2);
          lcd.print("Motor: ");
          lcd.print(wert);
          lcd.setCursor(0, 3);
          lcd.print("WunschTemp: ");
          lcd.print(wunschtemp);
          lcd.write(grad);
          lcd.print("C");  
         
          // ~~~ ZURÜCK - begin ~~~
          tastermenuX = digitalRead(tastermenu);  
          if(tastermenuX == HIGH)
          {
            moduswert = 1;
            break;
          }
          // ~~~ ZURÜCK - ende ~~~
         
          
          
//+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +


      // ##### IF 0 - beginn #####
      
        if(wert == 0){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, Null);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 0);
        }
      // ##### IF 0 - ende #####
      
      
      // ##### IF 1 - beginn #####
      
        if(wert == 1){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, eins);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 20);
        }
      // ##### IF 1 - ende #####
      
      
      // ##### IF 2 - beginn #####
      
        if(wert == 2){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, zwei);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 40);
        }
      // ##### IF 2 - ende #####
      
      
      // ##### IF 3 - beginn #####
      
        if(wert == 3){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, drei);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 60);
        }
      // ##### IF 3 - ende #####
      
      
      // ##### IF 4 - beginn #####
      
        if(wert == 4){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, vier);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 80);
        }
      // ##### IF 4 - ende #####
      
      
      // ##### IF 5 - beginn #####
      
        if(wert == 5){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, fuenf);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 100);
        }
      // ##### IF 5 - ende #####
      
      
      // ##### IF 6 - beginn #####
      
        if(wert == 6){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, sechs);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 120);
        }
      // ##### IF 6 - ende #####
      
      
      // ##### IF 7 - beginn #####
      
        if(wert == 7){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, sieben);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 140);
        }
      // ##### IF 7 - ende #####
      
      
      // ##### IF 8 - beginn #####
      
        if(wert == 8){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, acht);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 160);
        }
      // ##### IF 8 - ende #####
      
      
      // ##### IF 9 - beginn #####
      
        if(wert == 9){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, neun);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        digitalWrite(motor, HIGH);
        }
      // ##### IF 9 - ende #####


      }

Du kannnt den Sketch auch als Datei anhängen. Einfach auf "Additional Optioins..." drücken.
Grüße Uwe

Das Anhängen des Sketches als Datei macht es auch leichter, ihn in der Arduino IDE anzuschauen, was die Sache erleichtert.

Was mir auffällt:
bei JEDEM Loop() Durchlauf wird bei dir das Display gelöscht und komplett neu beschrieben. Das kostet viel Zeit!
Besser ist es, wenn du eine Variable "casewert_alt" einführst, und den kompletten Displayinhalt nur schreibst, wenn du zum ersten Mal diesen Zweig durchläufst.

Ich habe es bei mir soweit getrieben, dass selbst die Ausgabe von Werten nur erfolgt, wenn die sich geändert haben (aber bei mir läuft auch ein PID-Regler im Hintergrund):

if (abs(Wert - Wert_alt)>0.1) {       
              lcd.setCursor(6,1);         
              lcd.print(Wert); 
              Wert_alt = Wert;
}

Auf jeden Fall sollte man nur die Zahlen neu schreiben und nicht den Text.

hallo zusammen,

@ Uwe: dnake, werde ich versuchen!

das display löschen und neuschreiben mache ich wegen den einwirkungen vom relais,.. beim schalten kommen immer komische zeichen raus.. so fällt es nur komplett aus, was selten ist. vorher hat es immer fehler gegeben bei der LCD darstellung.

Ist der Lüfter wirklich nötig? Hab bislang nie luftgekühlte Relais in der Größenordnung gesehen :wink:

sschultewolter:
Ist der Lüfter wirklich nötig? Hab bislang nie luftgekühlte Relais in der Größenordnung gesehen :wink:

naja, eigentlich nicht, ist aber eine vorsichtsmaßnahme, da ich das auch beim schlafen an habe und ein 2000W heizlüfter dran hängt... ich mag es einfach nicht wenn es fühlbar warm wird, das gibt mir ein schlechts gefühl (auch wenn ich weis, dass es zum teil normal ist)

hallo zusammen und frohe weihnachten,

nun habe ich es so gelöst und es klappt so wie ich das möchte. es hat sich herausgestellt, das ich ein paar "systematische fehler" hatte(weil ich es einfach falsch wusste), die nun auch beseitigt sind...:

void setup() {
//Serial.begin(9600);
  
// TIMER
  TCCR2B = TCCR2B & 0xF8 | 0x07;
// DHT
  dht.begin();
// LCD
  lcd.createChar(grad, GRAD);
  lcd.begin(20, 4);
// LED Shift-Register
  pinMode(taktPin, OUTPUT);
  pinMode(speicherPin, OUTPUT);
  pinMode(datenPin, OUTPUT);
// Motor
  pinMode(motor, OUTPUT);
// Relais
  pinMode(relaisA, OUTPUT);
  pinMode(relaisB, OUTPUT);
// Taster
  pinMode(tasteroben, INPUT);
  pinMode(tasterunten, INPUT);
  pinMode(tastermenu, INPUT);
  pinMode(tasterlinks, INPUT);
  pinMode(tasterrechts, INPUT);
  pinMode(tasterback, INPUT);

// LCD - Ausgabe
//          lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Luftfeuchte: ");        // 14 zeichen
//          lcd.print(hx);           // 5 zeichen
  lcd.setCursor(18, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("Temp: ");               // 6 zeichen
//          lcd.print(tempx);        // 5 zeichen
  lcd.setCursor(11, 1);
  lcd.write(grad);                   // 1 zeichen
  lcd.print("C");
  lcd.setCursor(0, 2);
  lcd.print("Motor: ");              // 7 zeichen
//          lcd.print(wert);         // 1 zeichen
  lcd.setCursor(0, 3);
  lcd.print("WunschTemp: ");         // 12 zeichen
//          lcd.print(wunschtemp);   // 5 zeichen
  lcd.setCursor(17, 3);
  lcd.write(grad);                   // 1 zeichen
  lcd.print("C");   


}
//*****************************************************************************
//*****************************************************************************
//*****************************************************************************







void loop() {
  
// ++++++ EBENE I +++++   
  
  
  
  // Taster einlesen
  
  // modus auswählen
  tastermenuX = digitalRead(tastermenu);
  if(tastermenuX == HIGH){
    moduswert = 1;
   }
   

//-------- Beginn SWITCH CASE -------------------------------------  
      switch(moduswert)
      {

  // ##### MENU - begin #####        
        case 1:
        
          // LCD - Ausgabe
//          lcd.clear();
          lcd.setCursor(13, 0);
//          lcd.print("Luftfeuchte: ");        // 13 zeichen
          lcd.print(hx);                     // 5 zeichen
//          lcd.print("%");
          lcd.setCursor(6, 1);
//          lcd.print("Temp: ");               // 6 zeichen
          lcd.print(tempx);                  // 5 zeichen
//          lcd.write(grad);                   // 1 zeichen
//          lcd.print("C");
          lcd.setCursor(7, 2);
//          lcd.print("Motor: ");              // 7 zeichen
          lcd.print(wert);                   // 1 zeichen
          lcd.setCursor(12, 3);
//          lcd.print("WunschTemp: ");         // 12 zeichen
          lcd.print(wunschtemp);             // 5 zeichen
//          lcd.write(grad);                   // 1 zeichen
//          lcd.print("C");   
          
          // Relais 
          digitalWrite(relaisA, HIGH);
          digitalWrite(relaisB, HIGH);
          
          // LED Shift-Register
          digitalWrite(speicherPin, LOW);
          shiftOut(datenPin, taktPin, LSBFIRST, FEHLER);
          digitalWrite(speicherPin, HIGH);

      
          // --- WERT Berechnung - beginn ---  
            
             tasterobenX = digitalRead(tasteroben);
             tasteruntenX = digitalRead(tasterunten);
             
      
             if(tasterobenX == HIGH)
             { 
               wert++;
               wert = min(9, wert);  // wert MINIMIERT auf 9
               delay(100);
             }
             if(tasteruntenX == HIGH)
             { 
               wert--; 
               wert = max(0, wert);  // wert MAXIMIERT auf 0
               delay(100);
             } 
             
          // --- WERT Berechnung - ende ---
          
          
          // --- Wunschtemperatur Berechnung - beginn ---  
            
             tasterlinksX = digitalRead(tasterlinks);
             tasterrechtsX = digitalRead(tasterrechts);
             
      
             if(tasterlinksX == HIGH)
             { 
               wunschtemp = (wunschtemp + 0.1);
               wunschtemp = min(30, wunschtemp);  // wert MINIMIERT auf 9
               delay(100);
             }
             if(tasterrechtsX == HIGH)
             { 
               wunschtemp = (wunschtemp - 0.1);
               wunschtemp = max(15, wunschtemp);  // wert MAXIMIERT auf 0
               delay(100);
             } 
             
          // --- Wunschtemperatur Berechnung - ende ---
          
          
          
          // ~~~ ZURÜCK - begin ~~~
          tasterbackX = digitalRead(tasterback);  
          if(tasterbackX == HIGH)
          {
            moduswert = 0;
          }
          break;
          // ~~~ ZURÜCK - ende ~~~
          
          
       
  // ########## MENU - ende ##########



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


  // ######### BEARBEITUNG - begin ##########

         case 0:
          
          // DHT22 - einlesen
          float h = dht.readHumidity();
          float temp = dht.readTemperature();
          tempx = temp;
          hx = h;
          
          
          // Relais
          if(temp <= wunschtemp)                // wenn gemessene "temp" kleiner als "wunschtemp"
          {               
            digitalWrite(relaisB, LOW);         // schalte relais ein (LOW = EIN)
          }                                     
          if(temp >= (wunschtemp + 1.00))       // wenn gemessene "temp" größer als "wunschtemp"
          {      
            digitalWrite(relaisB, HIGH);        // chalte relais aus (HIGH = AUS)
          }
          
          
          // LCD - Ausgabe
//          lcd.clear();
          lcd.setCursor(13, 0);
        //  lcd.print("Luftfeuchte: ");        // 13 zeichen
          lcd.print(hx);                     // 5 zeichen
        //  lcd.print("%");
          lcd.setCursor(6, 1);
        //  lcd.print("Temp: ");               // 6 zeichen
          lcd.print(tempx);                  // 5 zeichen
        //  lcd.write(grad);                   // 1 zeichen
        //  lcd.print("C");
          lcd.setCursor(7, 2);
        //  lcd.print("Motor: ");              // 7 zeichen
          lcd.print(wert);                   // 1 zeichen
          lcd.setCursor(12, 3);
        //  lcd.print("WunschTemp: ");         // 12 zeichen
          lcd.print(wunschtemp);             // 5 zeichen
        //  lcd.write(grad);                   // 1 zeichen
        //  lcd.print("C");   
         
          // ~~~ ZURÜCK - begin ~~~
          tastermenuX = digitalRead(tastermenu);  
          if(tastermenuX == HIGH)
          {
            moduswert = 1;
            break;
          }
          // ~~~ ZURÜCK - ende ~~~
       
          
          
//+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +


      // ##### IF 0 - beginn #####
      
        if(wert == 0){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, Null);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 0);
        }
      // ##### IF 0 - ende #####
      
      
      // ##### IF 1 - beginn #####
      
        if(wert == 1){
      
      // LED Shift-Register
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, LSBFIRST, eins);
        digitalWrite(speicherPin, HIGH);
      
      // Motor
        analogWrite(motor, 20);
        }
      // ##### IF 1 - ende #####