LCD shield menu

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
employer
Młodszy majsterkowicz
Posty: 3
Rejestracja: 29 paź 2012, 15:02

LCD shield menu

Post autor: employer » 29 paź 2012, 15:36

Witam wszystkich,
jest to mój pierwszy post na forum aczkolwiek przeglądałem je wcześniej pod kątem projektów Arduino.

Posiadam arduino MEGA 2560 i LCD shield wraz z klawiaturą (wyświetlacz 2x16)
Chcę 'zbudować' własne menu, chodzi mi o to, że będzie 6 pozycji przeglądanych
za pomocą klawiszy prawo - lewo.
Klawiatura ma 6 przycisków, które są podpięte do jednego wejścia analogowego A0.
Każdy z nich daje następującą wartość:
góra 142;
dół 328;
prawo 0;
lewo 504;
select 741;

Chciał bym, żeby moje menu miało np. 6 pozycji załóżmy
1
2
3
4
5
6
Jeżeli program wystartuje będzie wyświetlone okno 1.
Za pomocą klawisza w prawo przejdzie do pozycji drugiej,
przez ponowne naciśnięcie do 3 itd aż do 6.
Jeżeli w lewo będzie się cofało o 1.

Wymyśliłem coś takiego:

Kod: Zaznacz cały

void loop()
{
  dod == 0;
  sensVal = analogRead(A0);
 
 if (sensVal == 142 ) {
  dod ++;
  delay(500);
  }
  
  if (sensVal == 0 )
 {
  dod --;
  delay(500);
  }
  
switch (dod) {

    case 0:
      lcd.clear();
      lcd.setCursor(0,0);              
      lcd.print("praca");
      delay(100);
      break;  

   case 1:
      lcd.clear();
      lcd.setCursor(0,0);              
      lcd.print("dol");
      delay(100);
      break;
     }
   }
Problem jest taki, że chcę aby wszystkie pozycje menu wyświetlać bez opóźnienia.
Nie wiem jak to zrobić, jak wyeliminuje z każdego case delay to napis żarzy,
jak jest delay to mruga z częstotliwością opóźnienia.
Za pewne chodzi tutaj o jakiś problem ze zmienną.
Proszę o wyrozumiałość ponieważ jestem początkujący.

Z góry dziękuję za pomoc.
Ostatnio zmieniony 30 paź 2012, 11:40 przez Łukasz, łącznie zmieniany 1 raz.
Powód: Kod umieszczamy w znacznikach [code] ... [/code]

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


wachu
Młodszy majsterkowicz
Posty: 23
Rejestracja: 25 wrz 2012, 23:02

Re: LCD shield menu

Post autor: wachu » 30 paź 2012, 00:41

cześć
Ja korzystam z takiego kodu:

Kod: Zaznacz cały

#include <Timers.h> //biblioteka do wielozadaniowści
LimitedTimerPool timer;//wielozadaniowsc na 8 slotach

// *** Zmienne dla przycisków ***
int adcKeyVal[5]={20,270,520,690,880};//wartości odczyt-analogu dla różnych przycisków
int numKeys=5; //ilość przycisków
int adcKeyIn=0;

void setup()
{
  Serial.begin(9600);
  timer.connect(0,200,odczytPrzycisku); // co 0.5 sek spr. odczytu przycisku
}

void loop()
{
  timer.update();
}

void odczytPrzycisku()
{
int k;
adcKeyIn = analogRead(0);    // odczyt przycisku na pinie A0 
for (k=0; k<numKeys;++k)
{  
  if (adcKeyIn<adcKeyVal[k])
  {    
    Serial.print("naduszono przycisk nr: ");
    Serial.println(adcKeyVal[k]);
    if (k==0)
    {
      //tutaj działnia jeżeli naduszony przycisk, jego wartość odczyt analogowy wynosi 20
    }
    if (k==2)
    {
      //tutaj działnia jeżeli naduszony przycisk, jego wartość odczyt analogowy wynosi 520
    }
    if (k==3)
    {
      // itd
    }
        return;
  }
  if (k>=numKeys)
  {
    return;
  }
}
}
shymon
Majsterkowicz
Posty: 139
Rejestracja: 6 paź 2012, 20:27

Re: LCD shield menu

Post autor: shymon » 30 paź 2012, 11:21

Kod: Zaznacz cały

loop()
{
[b]dod == 0;[/b]
sensVal = analogRead(A0);
Dałeś tutaj operator porównania "==", a chciałeś chyba zainicjować tej zmiennej wartość 0, aby po uruchomieniu działał pierwszy case?
Jeśli tak, to powinno być

Kod: Zaznacz cały

dod=0; 
.
No i ja bym to wyrzucił przed loopa, tylko w celu zainicjowania jej wartości "startowej", bo chyba nie chcesz, żeby przy każdym obrocie pętli automatycznie wracało do "zerowego" menu?
Mówiłeś też o klawiszach prawo, lewo, a zrobiłeś prawo i góra, ale jak rozumiem, to tylko przykład na szybko :)
No i nie zapomnij o jakimś warunku przy wyjściu poza "zakres" swoich case'ów w prawo i lewo (np. if(dod<0){dod=6;} i if(dod>6){dod=0;}).
I kod wstawiaj w znaczniki 'code', czytelniej się czyta.
employer
Młodszy majsterkowicz
Posty: 3
Rejestracja: 29 paź 2012, 15:02

Re: LCD shield menu

Post autor: employer » 7 lut 2013, 15:05

Witam, otóż projektu nie porzuciłem tylko brak czasu zmusił mnie do chwilowego przestoju ;) docelowo mój projekt ma być sterownikiem kotła węglowego, podstawowy sterownik, będzie ustalana temp zadana wody w obiegu i na tej podstawie będzie załączać pompę obiegową oraz sterować wentylatorem. Menu było mi potrzebne do przechodzenia między funkcjami. Chcę wyświetlać temperaturę, zewnętrzną, wewnętrzną i oczywiście wody obiegowej. Do pomiaru temperatury zastosowałem czujnik DS18B20. Na razie testuję jeden czujnik ale podpięcie kolejnych i wyświetlanie z nich danych nie stanowi problemu ponieważ są one na magistrali one wire. Nie chcę zakładać nowego tematu ponieważ najpierw robię sobie 'części składowe' do programu a później sobie to wszystko złożę w jedno. Proszę o wyrozumiałość ponieważ jestem początkującym programistą w C ;)

Przedstawię kod programu a poniżej opiszę w czym problem:

Kod: Zaznacz cały

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#define ONE_WIRE_BUS 22

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 0x28, 0x26, 0x44, 0xBB, 0x03, 0x00, 0x00, 0x0D };




void setup(void)
{
  Serial.begin(9600);
  pinMode(52, OUTPUT);
  sensors.begin();
  sensors.setResolution(insideThermometer, 10);
  lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
  lcd.clear(); // start with a blank screen
}
  void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
  lcd.print("Error");
} 
  else {
  lcd.print(tempC);
}
}


void loop(void)
{
  delay(2000);
  sensors.requestTemperatures();
  lcd.setCursor(0,0);
  lcd.print("kociol: ");
  printTemperature(insideThermometer);
  lcd.write(0xDF);
  lcd.write('C');  
}


Chodzi o to, że nie mogę wstawić warunku w pętli loop:

Kod: Zaznacz cały

if (tempC >= 25.00)
{
 digitalWrite(52, HIGH);
}
else
{
  digitalWrite(52, LOW); 
}
ponieważ wyskakuje mi błąd, że tempC nie jest zdeklarowane w tej pętli i nie mogę jej na żadne sposoby zdeklarować.
Jeżeli przeniosę warunek do pętli loop to działa bez problemu.
Co robię nie tak?
Z góry dziękuję za pomoc.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1168
Rejestracja: 18 lis 2011, 02:18

Re: LCD shield menu

Post autor: Marhef » 8 lut 2013, 00:10

Zmienną tempC powinieneś zadeklarować jako zmienną globalną. Nie wiem, jak to wygląda w arduino, ale prawdopodobnie przed pętlą setup
employer
Młodszy majsterkowicz
Posty: 3
Rejestracja: 29 paź 2012, 15:02

Re: LCD shield menu

Post autor: employer » 8 lut 2013, 11:16

Faktycznie trzeba było na samym początku zadeklarować zmienną jako globalną

Kod: Zaznacz cały

volatile float tempC;
dziękuję za pomoc.
ODPOWIEDZ

Strony partnerskie: