Temperatursensor in Menü inplementieren

Guten Abend

Heuer hatte ich versucht für ein Projekt einen bestehenden sketch zum laufen zu bringen http://forum.arduino.cc/index.php?topic=363539.0 . Da dies trotz Hilfe aus dem Forum nicht geklappt hatte, habe ich nun einen anderen sketch gefunden. Diesen konnte ich zum laufen bringen, aber wenn ich nun ein Temperatursensor in das Programm “implementiere”, funzt das Programm nicht mehr richtig, bzw. sind die Unterprogis nicht mehr anwählbar.

Verwenden tue ich einen Arduino Uno, ein 16x2 Keypad shield und, ein Temp.sensor ds 18b20.

Was mir aufgefallen ist, wenn ich den Befehl sensors.begin(); weglasse, kann ich wenigstens zwischen den Hauptmenüs wechseln. Was mich auch irritiert, ist dass ich keine Fehlermeldung erhalte.

Über inputs würde ich mich sehr freuen und jetzt schon vielen Dank!!

Gruss
Manu

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

//States for the menu.
int currentMenuItem = 0;
int lastState = 0;

  
void setup() 
{
  // start serial port
 
  Serial.begin(9600);

   // Start up the library
  //sensors.begin();
  
   //Set the characters and column numbers.
   lcd.begin(16, 2);
   //Print default title.
   clearPrintTitle();


float currentTemp;
   
  
}
 
void loop() {
  //Call the main menu.
  mainMenu();

// Send the command to get temperatures
sensors.requestTemperatures();

 

}


void mainMenu() {
  //State = 0 every loop cycle.
  int state = 0;
  //Refresh the button pressed.
  int x = analogRead (0);
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0,0);
 
  //Check analog values from LCD Keypad Shield
  if (x < 100) {
    //Right
  } else if (x < 200) {
   //Up
    state = 1;
  } else if (x < 400){
   //Down
    state = 2;
  } else if (x < 600){
    //Left
  } else if (x < 800){
    //Select
    state = 3;
  }
 
  //If we are out of bounds on th menu then reset it.
  if (currentMenuItem < 0 || currentMenuItem > 4) {
   currentMenuItem = 0; 
  }
 
   //If we have changed Index, saves re-draws.
   if (state != lastState) {
      if (state == 1) {
         //If Up
          currentMenuItem = currentMenuItem - 1; 
          displayMenu(currentMenuItem);
      } else if (state == 2) {
         //If Down
          currentMenuItem = currentMenuItem + 1;  
          displayMenu(currentMenuItem);
      } else if (state == 3) {
         //If Selected
         selectMenu(currentMenuItem); 
      }
      //Save the last State to compare.
      lastState = state;
   } 
   //Small delay
delay(2);
}
 
//Display Menu Option based on Index.
void displayMenu(int x) {
     
    // Start up the library
     
     switch (x) {
      case 1:
        clearPrintTitle();
        lcd.print ("-> Temperature");
        break;
      case 2:
        clearPrintTitle();
        lcd.print ("-> dissolved Oxygen");
        break;
       case 3:
        clearPrintTitle();
        lcd.print ("-> Feeder 1");
        break;
      case 4:
        clearPrintTitle();
        lcd.print ("-> Feeder 2");
        break;
    }
}
 
//Print a basic header on Row 1.
void clearPrintTitle() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("AQUAPONIC ");
  lcd.setCursor(0,1); 
}
 
//Show the selection on Screen.
void selectMenu(int x) {
  
   switch (x) {
      case 1:
        clearPrintTitle();
        lcd.print(sensors.getTempCByIndex(0));
        //Call the function that belongs to Option 1
        break;
      case 2:
        clearPrintTitle();
        lcd.print ("Selected Opt 2");
        //Call the function that belongs to Option 2
        break;
       case 3:
        clearPrintTitle();
        lcd.print ("Selected Opt 3");
        //Call the function that belongs to Option 3
        break;
      case 4:
        clearPrintTitle();
        lcd.print ("Selected Opt 4");
        //Call the function that belongs to Option 4
        break;
    }
}

PS: Der Ursprungscode ist nicht von mir. Den hab ich aus dem i-net.

Warum nimmst du immer Sketche aus dem Web, die du offenbar nicht verstehst.
Schreibe doch bitte erstmal selbst ein paar Sketche anhand der Beispiele in der IDE und trainierst deine Programmierkenntnisse.

Danach kannst du dich an die Sketche aus dem Web machen.
Hilfe wirst du dann auch hier erhalten.

Also Basics lernen und mit kleinen Beispielen anfangen.

Edit:
Da hast du aus dem Erste Thread nichts gelernt.
So wird das nie was.

Guten Morgen

Ehrlich gesagt wusste ich nicht genau wie anfangen, da habe ich etwas bestehendes genommen und es versucht anhand dieses Beispiel-sketches zu verstehen und an meine Bedürfnisse anzupassen. Über youtube Tutorials habe ich mir das Basiswissen angeeignet, aber hier steck ich jetzt absolut fest. Ich werde mal versucen selber etwas zu schreiben.

eginni:
Guten Morgen

Ehrlich gesagt wusste ich nicht genau wie anfangen, da habe ich etwas bestehendes genommen und es versucht anhand dieses Beispiel-sketches zu verstehen und an meine Bedürfnisse anzupassen. Über youtube Tutorials habe ich mir das Basiswissen angeeignet, aber hier steck ich jetzt absolut fest. Ich werde mal versucen selber etwas zu schreiben.

Das ist als "Einsteiger" ohne Programmiererfahrung keine gute Lösung. Du solltest immer erst einige Beispiele aufbauen und an deine Wünsche anpassen. Damit wirst du deine Erfahrungen sammeln. Und hier können wir dir natürlich auch helfen.

In so komplexen Programmen wie die Menüsteuerung findest du dich ohne nötige Erfahrung nicht zurecht.

Selbst Anwender mit guter Erfahrung müssen bei komplexen Steuerungen länger drüber sehen, um die Funktionen zu verstehen.

Morgen

Ich habs bis jetzt geschafft die Temperatur auszulesen und sie auf dem LCD anzuzeigen. Das Menü das ich gepostet hatte, habe ich vom Aufbau her verstanden (sagen wir so das gerüst :slight_smile: ). Ich binjetzt etwas verunsichert aber ich werde versuchen ähnliche Projekte zu googeln und versuchen zu verstehen wie die sketche aufgebaut sind und funktionieren.

Danke und Gruss
Manu

Ja, das ist doch mal ein Anfang. Super…

Wenn du uns dann noch deinen Sketch zeigst, dann können wir dir auch Tipps geben, was du noch besser machen kannst.

Hallo zusammen

Ich hab mich die letzten Tage wieder mit dem Menü und dem Temperatursensor auseinandergesetzt. Ich kriege es nun hin die Temperatur in einem Unterprogramm auszulesen und immer neu zu aktualisieren. Die Art um wieder aus dem Unterprogrammen herauszukommen (den button_state auf 1 zu setzen), scheint mir aber nicht so wirklich “professionell”. Gäbe es evtl. eine einfachere Alternative? Über konstruktive Kritik und Tipps würde ich mich sehr freuen!

Grüsse
Manu

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>



// Initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

//States for the menu.
int currentMenuItem = 0;
int lastState = 0;

int button_state = 0;

void setup()
{
  // start serial port

  Serial.begin(9600);

  //Start up the library
  sensors.begin();

  //Set the characters and column numbers.
  lcd.begin(16, 2);
  //Print default title.
  clearPrintTitle();


    //Kann wohl gelöscht werden, da Temperatur mit Nachkommastelle angezeigt wird.
  //float currentTemp;      


}

void loop() {
  
  //Call the main menu.
  mainMenu();

}


void mainMenu() {
  //State = 0 every loop cycle.
  int state = 0;
  //Refresh the button pressed.
  int lcdstatus = analogRead (0);
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0, 0);


  //Check analog values from LCD Keypad Shield
  if (lcdstatus < 100) {
    //Right
  } else if (lcdstatus < 200) {
    //Up
    state = 1;
  } else if (lcdstatus < 400) {
    //Down
    state = 2;
  } else if (lcdstatus < 600) {
    //Left
  } else if (lcdstatus < 800) {
    //Select
    state = 3;
  }

  //If we are out of bounds on the menu then reset it.
    if (currentMenuItem < 0 || currentMenuItem > 4) {
    currentMenuItem = 0;
  }

  //If we have changed Index, saves re-draws.
  if (state != lastState) {
    if (state == 1) {
      //If Up
      currentMenuItem = currentMenuItem - 1;
      displayMenu(currentMenuItem);
    } else if (state == 2) {
      //If Down
      currentMenuItem = currentMenuItem + 1;
      displayMenu(currentMenuItem);
    } else if (state == 3) {
      //If Selected
      selectMenu(currentMenuItem);
    }
    //Save the last State to compare.
    lastState = state;
  }
  //Small delay
  //delay(2);
}

//Display Menu Option based on Index.
void displayMenu(int y) {


  switch (y) {
    case 1:
      clearPrintTitle();
      lcd.print ("-> Temperature");
      break;
    case 2:
      clearPrintTitle();
      lcd.print ("-> dissolved Oxygen");
      break;
    case 3:
      clearPrintTitle();
      lcd.print ("-> Feeder 1");
      break;
    case 4:
      clearPrintTitle();
      lcd.print ("-> Feeder 2");
      break;
    case 5:
      clearPrintTitle();
      lcd.print ("-> Feeder 3");
      break;
      
  }
}

//Print a basic header on Row 1.
void clearPrintTitle() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("AQUAPONIC ");
  lcd.setCursor(0, 1);
}

//Show the selection on Screen.
void selectMenu(int z) {

  switch (z) {
    case 1:
    button_state = 0;
      clearPrintTitle();
      while (button_state == 0) {
        sensors.requestTemperatures();
        lcd.setCursor(0, 1);
        lcd.print(sensors.getTempCByIndex(0));
        button_select();
      }
      //Call the function that belongs to Option 1
      break;
    case 2:
      clearPrintTitle();
      lcd.print ("Selected Opt 2");
      //Call the function that belongs to Option 2
      break;
    case 3:
      clearPrintTitle();
      lcd.print ("Selected Opt 3");
      //Call the function that belongs to Option 3
      break;
    case 4:
      clearPrintTitle();
      lcd.print ("Selected Opt 4");
      //Call the function that belongs to Option 4
      break;
  }
}

void button_select() {

  //State = 0 every loop cycle.
  int state = 0;
  //Refresh the button pressed.
  int x = analogRead (0);
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0, 0);


  //Check analog values from LCD Keypad Shield
  if (x < 100) {
    //Right
  } else if (x < 200) {
    button_state = 1;
    //Up
    state = 1;
  } else if (x < 400) {
    button_state = 1;
    //Down
    state = 2;
  } else if (x < 600) {
    button_state = 1;
    //Left
  } else if (x < 800) {
    button_state = 1;
    //Select
    state = 3;
  }


}

Ich kann dir nur das Menü empfehlen, welches Scorpi08 verlinkt hat.
Ich setze dieses in mehreren Projekten ein und finde es sehr flexibel.

Sieh es dir mal an.

Hallo

Vielen Dank für den Hinweis. Ich kann diese lib aber leider nicht verwenden. Hab es wie unter "wichtig_installation.txt beschrieben gemacht und erhalte folgende Fehlermeldung:

Arduino: 1.6.5 (Mac OS X), Platine: "Arduino/Genuino Uno"

LCDML_1_easy_01_first_test.ino:11:24: fatal error: LCDMenuLib.h: No such file or directory
compilation terminated.
Fehler beim Kompilieren.

Muss ich etwas spezielles beachten?

Vielen Dank und Grüsse

Manu

Ich kann diese lib aber leider nicht verwenden.

Logisch

LCDMenuLib.h: No such file or directory

auf DE

LCDMenuLib.h: Datei nicht vorhanden

Muss ich etwas spezielles beachten?

Würd mal behaupten, ja.

Dokumente/Arduino/libraries/LCDMenuLib/LCDMenuLib.h

Ich habe es nun geschafft die lib zum laufen zu bringen. Das Problem ist nun dass ich das Menü (als Test habe ich das Menü Bienensauna genommen) jetzt nicht bedienen kann ausser den right button meines lcd buttons. Damit kann ich zurück zum Hauptmenü gehen, sobald das Menü auf InitScreen schaltet. Ich habe im passenden threat nach einer Lösung gesucht aber leider nichts gefunden. Ich bin aber auch ehrlich gesagt mit meinem Wissen am Anschlag. Ich versuche nun schon seit Tagen ein einfaches Menü zum Auslesen von Sensoren und dem Einstellen von zwei Relais aufzubauen, komme aber irgendwie auf keinen grünen Zweig.. Kann mir jemand die Richtung etwas aufzeigen?

Danke für eure Geduld und frohe Weihnachten!

Manu

Bitte poste deine Fragen zum Menü in dem entsprechenden Thread, dann sprichst du gezielt die richtigen User an.

Wäre aber gut, die Frage zu präzisieren.

Zuerst diesen Sketch aufspielen, drück alle Tasten und schreibe dir die Werte auf.

#include <LiquidCrystal.h>
LiquidCrystal lcd (8,9,4,5,6,7);

void setup() 
{
  lcd.begin(16,2);
}  

void loop() 
{
  int value= analogRead(A0);
  char buf[17];
  snprintf(buf,sizeof(buf), "%4d", value);
  lcd.setCursor(0,0);
  lcd.print(buf);
}

Dann passe die Werte an. in dem Sketch “Bienensauna”:

// ======================
// analog lcdml control
// ======================
// nothing change here
#define _LCDML_DISP_cfg_control                1  // analog
void LCDML_CONTROL_analog();
// settings
#define _LCDML_CONTROL_analog_pin              0
// when you did not use a button set the value to zero
#define _LCDML_CONTROL_analog_enter_min        740   // Button Enter
#define _LCDML_CONTROL_analog_enter_max        750  
#define _LCDML_CONTROL_analog_up_min           140     // Button Up
#define _LCDML_CONTROL_analog_up_max           150   
#define _LCDML_CONTROL_analog_down_min         325     // Button Down
#define _LCDML_CONTROL_analog_down_max         335   
#define _LCDML_CONTROL_analog_back_min         500     // Button Back
#define _LCDML_CONTROL_analog_back_max         510   
#define _LCDML_CONTROL_analog_left_min         500     // Button Left
#define _LCDML_CONTROL_analog_left_max         510   
#define _LCDML_CONTROL_analog_right_min        0     // Button Right
#define _LCDML_CONTROL_analog_right_max        10