Menu maken met 3 buttons en lcd
18 berichten
• Pagina 1 van 2 • 1, 2
Menu maken met 3 buttons en lcd
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?
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
Re: Menu maken met 3 buttons en lcd
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
shooter@home.nl
Re: Menu maken met 3 buttons en lcd
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.
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);
}
Re: Menu maken met 3 buttons en lcd
dan kun je dus haschanged even aan zetten dan gaat het menu weer aan
paul deelen
shooter@home.nl
shooter@home.nl
Re: Menu maken met 3 buttons en lcd
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?
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?
Re: Menu maken met 3 buttons en lcd
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?
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;
}
}
Re: Menu maken met 3 buttons en lcd
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
shooter@home.nl
Re: Menu maken met 3 buttons en lcd
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?
Re: Menu maken met 3 buttons en lcd
door af en toe het juiste scherm aan te roepen met een timer.
paul deelen
shooter@home.nl
shooter@home.nl
18 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 36 gasten