Go Down

Topic: 16x2 lcd en druk knop om volgende inputs te kiezen (Read 1 time) previous topic - next topic

Gijsje

Hoi allemaal,

Ik ben nog erg nieuw in het arduino gebeuren maar al wel veel opgestoken van de starter kit die ik heb gekocht.
heb de kit gekocht om bij het slechte weer wat te kunnen spelen in de avond.
Mijn andere hobby is auto's en dan voor mijn huidige nissan skyline.
Ik ben dus ook bezig om een projectje te maken voor in mijn auto en opzich gaat het wel de goede kant op maar loop op een ding nog vast

Heb nu de lcd aan gesloten op de arduino uno en deze geeft nu het volgende weer
Water Temp 24°C (dmv een TMP36)
Oil temp 50° C (dmv potmeter)


Maar wat ik graag zou willen is om een knopje aan te sluiten en dan als je op de knop drukt naar het volgende scherm kan gaan naar bv
Oil pres 4,5bar
Boost press 1,1bar


Nog een keer drukken dan naar
RPM 1500
A/F 14.7


Nog een keer drukken weer terug naar temp


Dit is wat ik er tot nu toe van gemaakt heb.
Heb al veel gezocht maar nog steeds niet echt kunnen vinden waar ik wat aan heb.

#include <LiquidCrystal.h>

//waar sensoren aangesloten
int reading = 0;
int sensorPin1 = A0;
int sensorPin2 = A1;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
}
 
void loop() {
   reading = analogRead(sensorPin1);
   int celsius1 = reading/6;
   lcd.setCursor(0, 0);
   lcd.print("Oil temp: ");
   lcd.setCursor(12,0);
   lcd.print(celsius1, DEC);
   lcd.print((char)223);
   lcd.print("C");

   reading = analogRead(sensorPin2);
   int celsius2 = reading/6;
   lcd.setCursor(0, 1);
   lcd.print("Water temp: ");
   lcd.setCursor(12,1);
   lcd.print(celsius2, DEC);
   lcd.print((char)223);
   lcd.print("C");


  Serial.println("Oil temp:");
  Serial.println(celsius1);
  Serial.println("Water temp");
  Serial.println(celsius2);
}



shooter

knopje aansluiten, en if ingang==high dan andere scherm.
handiger is om het op tijd te doen, dan hoef je niks aan te raken.

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

shooter

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

MAS3

Of het handiger is om op tijd door de schermen te gaan is maar de vraag (leidt meer af tijdens het rijden als je het mij vraagt, omdat je mogelijk langer moet kijken om te zien wat je wilde zien).
Maar dat was niet de vraag.

Hoi Gijsje, welkom.

Je kunt alle waardes die je wil verwerken, bijvoorbeeld in het begin van "de loop" binnenhalen en opslaan in variabelen.
Daarna kun je informatie op het scherm gaan afbeelden.
Wanneer je de aanpak wil doen die je boven beschreven hebt, moet je niet alleen een knopje gaan verwerken (ik zou 'm trouwens aansluiten op een pin, de PinMode vervolgens INPUT_PULLUP zetten.
Dan moet je daarna kijken naar LOW in plaats van HIGH, maar je werkt dan wel zo als de meeste schakelaars in auto's werken.

Maar goed.
Je moet gaan bijhouden hoe vaak je hebt gezien dat er op de knop gedrukt is.
Als je het tot die 3 schermen wil beperken, dan moet je dus tot de derde waarde tellen, en vervolgens weer bij de eerste waarde uitkomen.
Je laat alleen het scherm dat bij de waarde hoort zien.

Het is natuurlijk aan jou of je zoals ik daarnet zei eerst alles binnenhaalt, of dat je het doet zoals je het tot nog toe deed, binnenhalen en meteen weergeven.
In dat laatste geval haal je dan geen waardes binnen die je misschien wel wil weten ook al beeld je ze dan niet af (bijvoorbeeld omdat je ze naar een kaartje wegschrijft om later uit te lezen, of ze als telemetrie verstuurt via een draadloze verbinding).
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Gijsje

Bedankt beide voor de informatie.
Ik wil inderdaad uit eindelijk de data het liefst weg schrijven op een sd kaart om naderhand de data te kunnen bekijken dus alle data moet dan ook binnen blijven komen en niet alleen als het op de display staat.

Heb je misschien een link op een referentie hoe ik het kan opbouwen om de inputs te gaan tellen van het knopje?

Gijs

Gijsje

https://www.arduino.cc/en/Tutorial/StateChangeDetection

Ben ik dan hier mee op de goede weg?

shooter

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Gijsje

Ben ondertussen al een heel stuk verder gekomen en hij gaat nu van het ene scherm naar het andere scherm :)
Heb nu dus drie verschillende schermen maar hij gaat na drie keer drukken niet terug naar het eerste scherm.
Hoe zou ik dat voor elkaar kunnen krijgen?

Wat ik ook zie is dat er nog gegevens van het vorige scherm blijven staan op het nieuwe scherm.
Heb het al geprobeerd met lcd.clear maar dan blijft hij het scherm clearen in de loop en is het venster niet echt duidelijk meer.
Kan je lcd.clear ook een keer uit laten voeren??
Code: [Select]
#include <LiquidCrystal.h>
// this constant won't change:
const int  buttonPin = 8;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to
int reading = 0;
int sensorPin1 = A0;
int sensorPin2 = A1;

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
  lcd.begin(16, 2);
}


void loop() {
  reading = analogRead(sensorPin1);
  int celsius1 = reading / 6;
  reading = analogRead(sensorPin2);
  int celsius2 = reading / 6;

  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:
      buttonPushCounter++;
    }
  }
  // save the current state as the last state,
  //for next time through the loop
  lastButtonState = buttonState;
  if (buttonPushCounter == 0) {
    lcd.setCursor(0, 0);
    lcd.print("Oil temp: ");
    lcd.setCursor(12, 0);
    lcd.print(celsius1);
    lcd.print((char)223);
    lcd.print("C");

    lcd.setCursor(0, 1);
    lcd.print("Water temp: ");
    lcd.setCursor(12, 1);
    lcd.print(celsius2);
    lcd.print((char)223);
    lcd.print("C");
  }
  if (buttonPushCounter == 1) {
    lcd.setCursor(0, 0);
    lcd.print("Oil pr: ");
    lcd.setCursor(11, 0);
    lcd.print(celsius1);
    lcd.print("B");

    lcd.setCursor(0, 1);
    lcd.print("Boost pr: ");
    lcd.setCursor(11, 1);
    lcd.print(celsius2);
    lcd.print("B");
  }
  if (buttonPushCounter == 2) {
    lcd.setCursor(0, 0);
    lcd.print("AFR Value ");
    lcd.setCursor(11, 0);
    lcd.print(celsius1);

    lcd.setCursor(0, 1);
    lcd.print("RPM: ");
    lcd.setCursor(11, 1);
    lcd.print(celsius2);
    lcd.print("RPM");
  }
  Serial.print("Oil temp: ");
  Serial.print(celsius1);
  Serial.println("C");

  Serial.print("Water temp: ");
  Serial.print(celsius2);
  Serial.println("C");

  Serial.print("Oil pressure: ");
  Serial.print(celsius1);
  Serial.println("Bar");

  Serial.print("Boost pressure: ");
  Serial.print(celsius2);
  Serial.println("Bar");

  Serial.print("AFR: ");
  Serial.print(celsius1);
  Serial.println("Lambda");

  Serial.print("RPM: ");
  Serial.print(celsius2);
  Serial.println("Rpm");
  delay(1000);
}

MAS3

Graag code in [code] [/code] tags zetten, die is daar voor bedoeld, en is gemakkelijker en beter leesbaar voor degenen die je willen helpen.

Dus je wil, dat als (buttonPushCounter== 3), buttonPushCounter gereset word naar nul ?

En je wil ook alleen een lcd.clear doen als buttonPushCounter niet gelijk is aan lastButtonPushCounter ?

Schrijf je vragen op voor jezelf.
Bekijk die problemen nog eens en kijk eens of je ze ook op een andere manier kunt stellen.
Kijk vervolgens of de problemen eigenlijk niet meerdere kleinere problemen zijn, want kleinere problemen zijn vaak eenvoudiger op te lossen.
Als je dat een paar keer gedaan hebt, zie je ineens dat die problemen al bijna in code veranderd zijn.

O ja.
Ik begrijp dat je namen gebruikt die je ergens anders gezien (en begrepen) hebt.
Maar je moet wel een beetje oppassen dat de namen nog een beetje handelbaar en bovendien meteen te snappen blijven.
Anders loop je het risico dat je enormLangeEnOnhandigeNamenMoetGaanBijhouden.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

shooter

bij jouw buttonpushcounter++
hier kan ook die clear komen.
nog een regel zetten if (bpc >2){bpc=0;}
als hij 3 is dan wordt het weer 1

de IF==0 vervangen door een switch case ding.
en dus
case 0:
functie0
.......

in functie0 je hele riedel met instructies voor 0
etc.

opdracht: haal delay eruit (dat zal het wel nodig maken om debounce te gebruiken.
en herschrijf het lcd alleen als er een waarde is verandert.


paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Go Up