Menu maken met 3 buttons en lcd

Arduino specifieke Software
Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Menu maken met 3 buttons en lcd

Berichtdoor DeDraak » 20 Sep 2019, 16:09

Hallo Allemaal,

Wie kan mij helpen om een menutje te maken?

Ik heb nu een Uno met een 1602 lcd en 3 buttons.

Ik heb een Up button, down button en een settings button.

Als het programma start dan krijg je eerst op elke lijn een tekst te staan voordat er een verstelbaar setpoint in beeld komt. Middels de up en down button kan ik dit setpoint verstellen.

Nu wil ik met de settings button een menu ingaan waarin ik de Kp, Ki en de Kd wil gaan verstellen met de up en down button.

Wie kan mij een eind op weg helpen?



Code: Alles selecteren
#include <PID_v1.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int downButtonPin = 7; // button to lower set temperature 5
const int upButtonPin = 6;// button to raise set temperature 6
const int MenuButtonPin = 5;

int downButtonState = LOW;// neither button is pressed
int downReading;// status read from the button input
int upButtonState = LOW;// neither button is pressed
int upReading;// status read from the button input
int MenuButtonState = LOW;// neither button is pressed
int MenuReading;// status read from the button input


double Setpoint, Input, Output;

double Kp = 30, Ki = 0.1, Kd = 5;

PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);


void setup()
{
  Setpoint = 107;//setpoint of the bbq controller. can be changed bij buttons Up & Down

  myPID.SetMode(AUTOMATIC);//turn the PID on

  pinMode(downButtonPin, INPUT);// assign pins to the buttons
  pinMode(upButtonPin, INPUT);// assign pins to the buttons
  pinMode(MenuButtonPin, INPUT);// assign pins to the buttons

  Serial.begin( 9600);
  lcd.begin();
  lcd.setCursor(5, 0);
  lcd.print("Menu");
  delay(2000);
  lcd.setCursor(5, 1);
  lcd.print("Test");
  delay(3000);
  lcd.clear();

  lcd.begin();
  lcd.setCursor(4, 0);
  lcd.print("\337C");//Graden celcius teken
}


void loop()
{

  lcd.setCursor(0, 0);
  lcd.print(Setpoint, 0);
  lcd.print(" ");  // maak de rij schoon

 
  // Check states of pushbuttons, if pressed change setpoint up or down
  upButtonState = digitalRead(upButtonPin);
  if (upButtonState == 0)
    Setpoint++;
  downButtonState = digitalRead(downButtonPin);
  if (downButtonState == 0)
    Setpoint--;

 
  delay(100);
}

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Menu maken met 3 buttons en lcd

Berichtdoor shooter » 20 Sep 2019, 22:42

dan doe je precies ook een if als die button in is dan naar een functie toegaan die een menu laat zien.
paul deelen
shooter@home.nl

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Menu maken met 3 buttons en lcd

Berichtdoor DeDraak » 21 Sep 2019, 10:53

Hmm, daar loop ik nu al op vast..

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Menu maken met 3 buttons en lcd

Berichtdoor DeDraak » 21 Sep 2019, 14:09

Na een tijdje zoeken op het internet heb ik iets gevonden.
Ik heb het menu werken alleen werken mijn Up en Down buttons niet meer.

Ook heb ik even een dht sensor toegevoegd.
Met de MenuButton kan ik nu tussen de 4 pagina's bladeren.
Nu wil ik dus per pagina die waardes kunnen verstellen...

Nu kan ik wel het setpoint verhogen of verlagen maar ik krijg pas de aangepaste waarde te zien als ik even doorblader en weer terugkom op de firstscreen. Hij ververst dus niet.

Code: Alles selecteren
#include <DHT.h>
#include <PID_v1.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);          // set the LCD address to 0x27 for a 16 chars and 2 line display

int WhichScreen = 1;                         // This variable stores the current Screen number

boolean hasChanged = true;

#define DHTPIN 4                             // what pin we're connected to
#define DHTTYPE DHT22                        // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);                    // Initialize DHT sensor for normal 16mhz Arduino

const int MenuButtonPin = 5;                 // the number of the Menubutton pin
const int downButtonPin = 7;                 // button to lower set temperature 5
const int upButtonPin = 6;                   // button to raise set temperature 6
const int bloweroutput = 3;

int downButtonState = LOW;                   // neither button is pressed
int downReading;                             // status read from the button input
int upButtonState = LOW;                     // neither button is pressed
int upReading;                               // status read from the button input
int MenuButtonState;                         // the current reading from the input pin
int MenulastButtonState = LOW;               // the previous reading from the input pin

unsigned long lastDebounceTime = 0;          // the last time the output pin was toggled
unsigned long debounceDelay = 50;            // the debounce time; increase if the output flickers

double Setpoint, Input, Output;
double Kp = 30, Ki = 0.1, Kd = 5;

int chk;
float hum;  //Stores humidity value
float temp; //Stores temperature value


PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);



void setup()
{
  Setpoint = 22;//setpoint of the bbq controller. can be changed bij buttons Up & Down

  myPID.SetMode(AUTOMATIC);//turn the PID on
  dht.begin();
  lcd.begin();// initialize the lcd

  pinMode(bloweroutput, OUTPUT);
  pinMode(downButtonPin, INPUT);// assign pins to the buttons
  pinMode(upButtonPin, INPUT);// assign pins to the buttons
  pinMode(MenuButtonPin, INPUT);

  lcd.begin();
  lcd.setCursor(5, 0);
  lcd.print("Menu");
  delay(2000);
  lcd.setCursor(5, 1);
  lcd.print("Test");
  delay(3000);
  lcd.clear();


}
void loop()
{


  //Read data and store it to variables hum and temp
  hum = dht.readHumidity();
  temp = dht.readTemperature();
 


  // Check states of pushbuttons, if pressed change setpoint up or down
  upButtonState = digitalRead(upButtonPin);
  if (upButtonState == 0)
    Setpoint++;
  downButtonState = digitalRead(downButtonPin);
  if (downButtonState == 0)
    Setpoint--;

  delay(100);

  if (hasChanged == true) {

    switch (WhichScreen) {
      case 1:
        {
          firstScreen();
        }
        break;

      case 2:
        {
          secondScreen();
        }
        break;

      case 3:
        {
          thirdScreen();
        }
        break;

      case 4:
        {
          fourthScreen();
        }
        break;

    }
  }

  //-------------------------------
  // BEGIN of the switch debouncing code
  int MenuReading = digitalRead(MenuButtonPin);
  if (MenuReading != MenulastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (MenuReading != MenuButtonState) {
      MenuButtonState = MenuReading;

      // only toggle the LED if the new button state is HIGH
      if (MenuButtonState == HIGH) {
        hasChanged = true;
        WhichScreen++;


      }
    } else {
      hasChanged = false;
    }
  }
  MenulastButtonState = MenuReading;
  // END of the switch Debouncing code
  // --------------------------------------
  if (WhichScreen > 4) {
    WhichScreen = 1;
  }
}

void firstScreen()
{
  Input = temp;
  int val = Output;
  val = map (val, 0, 255, 0, 100);
  myPID.Compute();
  analogWrite(bloweroutput, Output);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Setpoint:");
  lcd.setCursor(10, 0);
  lcd.print(Setpoint, 0);
  lcd.print(" ");  // maak de rij schoon
  lcd.setCursor(14, 0);
  lcd.print("\337C");//Graden celcius teken

  lcd.setCursor(0, 1);
  lcd.print("T=");
  lcd.setCursor(2, 1);
  lcd.print(temp, 1);
  lcd.print(" ");  // maak de rij schoon
  lcd.setCursor(7, 1);
  lcd.print("\337C");//Graden celcius teken
  lcd.setCursor(10, 1);
  lcd.print(val);
  lcd.print(" ");// maak de rij
  lcd.setCursor(14, 1);
  lcd.print("%");

}
void secondScreen()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Kp");
  lcd.setCursor(0, 1);
  lcd.print(Kp);

}
void thirdScreen()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Ki");
  lcd.setCursor(0, 1);
  lcd.print(Ki);
}
void fourthScreen()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Kd");
  lcd.setCursor(0, 1);
  lcd.print(Kd);
}

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Menu maken met 3 buttons en lcd

Berichtdoor shooter » 21 Sep 2019, 20:43

dan kun je dus haschanged even aan zetten dan gaat het menu weer aan
paul deelen
shooter@home.nl

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Menu maken met 3 buttons en lcd

Berichtdoor DeDraak » 21 Sep 2019, 21:17

Jeetje zeg, daar was ik voorlopig niet achter gekomen...

Nu ik die aangezet hebt werkt de firstscreen inderdaad met setpoint verstelling en de temperatuur veranderd ook. Wel zie ik het display flikkeren??

De volgende stap die ik zou willen is dat ik in de Secondscreen ook de waarde kan veranderen met dezelfde up en down button.
Hoe kan ik dat het beste aanpakken?

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Menu maken met 3 buttons en lcd

Berichtdoor DeDraak » 22 Sep 2019, 10:04

Ik heb de lcd.clear(); weggehaald in de firstscreen en daarmee is het knipperen opgelost, hij bleef hem dus maar clearen.

Ik heb nu de functie's van de up en down button per screen in de loop geplaatst, dit werkt nu alleen zou dat niet anders kunnen?


Code: Alles selecteren
void loop()
{

  hum = dht.readHumidity();        //Read data and store it to variables hum
  temp = dht.readTemperature();    //Read data and store it to variables temp

  // Check states of pushbuttons, if pressed change setpoint up or down
  upButtonState = digitalRead(upButtonPin);
  if (upButtonState == 0)
    Setpoint++;
  downButtonState = digitalRead(downButtonPin);
  if (downButtonState == 0)
    Setpoint--;

  delay(100);

  if (hasChanged == true) {

    switch (WhichScreen) {
      case 1:
        {
          Serial.println("firstscreen" );
          firstScreen();
        }
        break;

      case 2:
        {
          upButtonState = digitalRead(upButtonPin);
          if (upButtonState == 0)
            Kp++;
          downButtonState = digitalRead(downButtonPin);
          if (downButtonState == 0)
            Kp--;

          Serial.println("secondscreen" );
          secondScreen();
        }
        break;

      case 3:
        {
          upButtonState = digitalRead(upButtonPin);
          if (upButtonState == 0)
            Ki++;
          downButtonState = digitalRead(downButtonPin);
          if (downButtonState == 0)
            Ki--;
          Serial.println("thirdscreen" );
          thirdScreen();
        }
        break;

      case 4:
        {
          upButtonState = digitalRead(upButtonPin);
          if (upButtonState == 0)
            Kd++;
          downButtonState = digitalRead(downButtonPin);
          if (downButtonState == 0)
            Kd--;
          Serial.println("fourthscreen" );
          fourthScreen();
        }
        break;

    }
  }

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Menu maken met 3 buttons en lcd

Berichtdoor shooter » 22 Sep 2019, 19:59

ja dat kan zeker door er een aparte functie van te maken, maar hier zou ik dat gewoon laten zitten, want nu staat de variabelen gelijk goed, ipv dat je ze naar andere moet zetten, het is weliswaar jammer dat je nu dus 3 keer hetzelfde schrijft, maar het is een compromis met eenvoud en schaalbaarheid.
paul deelen
shooter@home.nl

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Menu maken met 3 buttons en lcd

Berichtdoor DeDraak » 25 Sep 2019, 06:56

Het gaat inderdaad goed zo alleen als ik in mijn secondescreen zit dan werkt natuurlijk de firstscreen niet meer, hoe krijg ik dit voor elkaar om mijn dht waardes wel up to date te houden als ik in een andere screen zit?

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Menu maken met 3 buttons en lcd

Berichtdoor shooter » 25 Sep 2019, 21:01

door af en toe het juiste scherm aan te roepen met een timer.
paul deelen
shooter@home.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 36 gasten