Buttons Keypad shield Programmumschaltung

Hallo,
unten ist mein bisheriger Code angefügt. Ich möchte mit dem Code mit dem Select-Button zwischen Tempertur und Fahrenheit wechseln können. Mit diesen if-Bedingungen funktioniert, das nur wenn ich den Button gedrückt halte.
Kann mir Jemand vllt weiterhelfen?
Vielen Dank!

#include "DHT.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
DHT dht(A5, DHT11);
int State = 0;
int BUTTONS = A0;

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  dht.begin();
  display();
}

void loop() {
  if (analogRead(BUTTONS) >=1000){
  State=1;
  display();  
}
if ((analogRead (BUTTONS)>700) && (analogRead (BUTTONS)<1000)){
  State=2;
  display();
  }
if (analogRead (BUTTONS)<=700){
    State=3;
    display();
  }
}

void display() {
switch (State) {
  case 1:
  action1();
break;
  case 2:
  action2();
break;
  default:
  action3();
  break;
}
}
...

Nein.
Du hast den entscheidenden Codeteil abgeschnitten.

Aber vielleicht kommst Du ja selbst drauf, wo Du in Deinem geheimen Code state noch veränderst. (*)

(*) Alternativ kommt die Änderung des Displayinhalt infrage - aber auch das kannst nur Du wissen.

Nachtrag:

#include "DHT.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
DHT dht(A5, DHT11);
int State = 0;
int BUTTONS = A0;

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  dht.begin();
  display();
}

void loop()
{
  display();
}

void display()
{
  uint16_t wert = analogRead(BUTTONS);
  switch (wert)
  {
    case 0 ... 700:
      action1();
      break;
    case 701 ... 1000:
      action2();
      break;
    default:
      action3();
      break;
  }
}

Danke schonmal.
Ich bin nicht davon ausgegangen, dass die relevant wären und sie ein wenig unübersichtlich ist, da es das anzeigt, was es soll und ich keine Änderung an den Variablen vornehme. Hier ist der Rest des Codes :slight_smile:

void action1(){
float Temp= dht.readTemperature();
float Feuchte= dht.readHumidity();
float HI= dht.computeHeatIndex(Temp, Feuchte, false);
  lcd.setCursor(0,0);
        lcd.print ("Temp.: ");
        lcd.print(Temp);
        lcd.write(byte(0));
        lcd.print("C");
        lcd.setCursor(0,1);
        lcd.print("rF: ");
        lcd.print(Feuchte);
        lcd.print("% ");
         }

void action2(){
float Temp= dht.readTemperature();
float F=(Temp*9/5) + 32;
float Feuchte= dht.readHumidity();
float HI= dht.computeHeatIndex(Temp, Feuchte, false);
  lcd.setCursor(0,0);
        lcd.print ("Temp.: ");
        lcd.print(F);
        lcd.print(byte(0));
        lcd.print("F");
        lcd.setCursor(0,1);
        lcd.print("rF: ");
        lcd.print(Feuchte);
        lcd.print("% ");
         }

void action3(){
  lcd.print ("Programm");
  }

AAH!! Jetzt habe ich es...
Dann jetzt auch richtig:
Das wäre mein Code ... mit einem ABER

#include "DHT.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
DHT dht(A5, DHT11);
const byte BUTTONS = A0;

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  dht.begin();
  display();
}

void loop()
{
  display();
}

void display()
{
  switch (analogRead(BUTTONS))
  {
    case 100 ... 500:
      action1();
      break;
    case 550 ... 800:
      action2();
      break;
    case 850 ... 1000:
      action3();
      break;
  }
}
void action1()
{
  float Temp = dht.readTemperature();
  float Feuchte = dht.readHumidity();
  float HI = dht.computeHeatIndex(Temp, Feuchte, false);
  lcd.setCursor(0, 0);
  lcd.print ("Temp.: ");
  lcd.print(Temp);
  lcd.write(byte(0));
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("rF: ");
  lcd.print(Feuchte);
  lcd.print("% ");
}

void action2()
{
  float Temp = dht.readTemperature();
  float F = (Temp * 9 / 5) + 32;
  float Feuchte = dht.readHumidity();
  float HI = dht.computeHeatIndex(Temp, Feuchte, false);
  lcd.setCursor(0, 0);
  lcd.print ("Temp.: ");
  lcd.print(F);
  lcd.print(byte(0));
  lcd.print("F");
  lcd.setCursor(0, 1);
  lcd.print("rF: ");
  lcd.print(Feuchte);
  lcd.print("% ");
}

void action3()
{
  lcd.print ("Programm");
}

das Aber ist die Einstufung, wann was umschalten soll.
Um die Schaltpunkte richtig zu treffen, kannst Du Dir nur die Ausgabe von den gedrückten Tasten und keiner gedrückten taste geben.

Also folgender Code startet ohne gedrückte taste mit einer Ausgabe.
Mit jeder gedrückten Taste muss sich die Zahl ändern.
Wen Du alle Tasten durch hast, kannst Du damit ein Array füllen.
Also -> erste Ausgabe ohne gedrückte Taste, Wert aufschreiben
Dann mit jeder gedrückten Taste den zugehörigen Wert aufschreiben,
Dann hier damit melden, dann bau ich das fertig.


const byte BUTTONS = A0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.println(analogRead(BUTTONS));
  delay(100);
}

Den Versuch hatte ich auch schon gemacht, aber dann habe ich das gleiche Porblem, dass der nur bei Farhenheit stehen bleibt, solange ich den Button gedrückt halte. Sobald ich loslasse springt es wieder zu °C zurück.

Gib mir bitte die Werte aus dem zweiten Sketch!
NA KLAR WEISS ICH, DAS MEINE GERATENEN WERTE NICHT STIMMEN!

Die Werte lauten:
Select ist 721/722
left 482
Down 310
UP 133
Right 0
RST 1023
und er springt immer in der RST zurück

#include "DHT.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
DHT dht(A1, DHT11);
const byte BUTTONS = A0;

void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
  lcd.begin(16, 2);
  dht.begin();
  display();
}

void loop() {
  // put your main code here, to run repeatedly:

    display();
}

void display() {
switch (analogRead(BUTTONS)) {
  case 1023:
  action1();
break;
  case 721:
  action2();
break;
  default:
  action3();
  break;
}
}

void action1(){
float Temp= dht.readTemperature();
float Feuchte= dht.readHumidity();
float HI= dht.computeHeatIndex(Temp, Feuchte, false);
  lcd.setCursor(0,0);
        lcd.print ("Temp.: ");
        lcd.print(Temp);
        lcd.write(byte(0));
        lcd.print("C");
        lcd.setCursor(0,1);
        lcd.print("rF: ");
        lcd.print(Feuchte);
        lcd.print("% ");
        
  }

void action2(){
float Temp= dht.readTemperature();
float F=(Temp*9/5) + 32;
float Feuchte= dht.readHumidity();
float HI= dht.computeHeatIndex(Temp, Feuchte, false);
  lcd.setCursor(0,0);
        lcd.print ("Temp.: ");
        lcd.print(F);
        lcd.print(byte(0));
        lcd.print("F");
        lcd.setCursor(0,1);
        lcd.print("rF: ");
        lcd.print(Feuchte);
        lcd.print("% ");
       
  }

void action3(){
  lcd.print ("Programm");
  }`

Das ist richtig.
Damit geht Dein default: nicht.
Aber meiner sollte ja schon so ungefähr richtig gewesen sein :wink:
Ich nehm jetzt up und down für die Umschaltung °C/°F und Right für programm.

#include "DHT.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
DHT dht(A5, DHT11);
const byte BUTTONS = A0;

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  dht.begin();
  display();
}

void loop()
{
  display();
}

void display()
{
  switch (analogRead(BUTTONS))
  {
    case 100 ... 150: // UP 133
      action1();
      break;
    case 300 ... 330: // Down 310
      action2();
      break;
    case 0 :          // Right 0
      action3();
      break;
  }
}
void action1()
{
  float Temp = dht.readTemperature();
  float Feuchte = dht.readHumidity();
  float HI = dht.computeHeatIndex(Temp, Feuchte, false);
  lcd.setCursor(0, 0);
  lcd.print ("Temp.: ");
  lcd.print(Temp);
  lcd.write(byte(0));
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("rF: ");
  lcd.print(Feuchte);
  lcd.print("% ");
}

void action2()
{
  float Temp = dht.readTemperature();
  float F = (Temp * 9 / 5) + 32;
  float Feuchte = dht.readHumidity();
  float HI = dht.computeHeatIndex(Temp, Feuchte, false);
  lcd.setCursor(0, 0);
  lcd.print ("Temp.: ");
  lcd.print(F);
  lcd.print(byte(0));
  lcd.print("F");
  lcd.setCursor(0, 1);
  lcd.print("rF: ");
  lcd.print(Feuchte);
  lcd.print("% ");
}

void action3()
{
  lcd.print ("Programm");
}

Dankeschön :slight_smile: auf die Idee den Case1 nicht auf 1023 zu stellen, bin ich nicht mehr gekommen. Wenn man den Wald vor lauter Bäumen nicht mehr sieht.

Dann freu ich mich, Erhellung beschafft und das Grünzeug befreit zu haben.
markier ihn als gelöst - Es freut sich die Nachwelt und ich noch mehr.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.