Arduino Polska Forum

Pełna wersja: Wyświetlanie liczby na lcd
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam,

jestem początkującym użytkownikiem arduino i mam następujący problem. 
Po osiągnięciu temperatury przez czujnik nie wyświetla mi się odpowiednia wartość z tablicy tylko jakieś inne liczby. 
Problem chyba tkwi w instrukcji switch case. Poniżej umieszczam kod.


Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DS18B20.h>
#include <DS3231.h>
///////////////////////////////Zmienne//////////////////////////////////////////////////////
uint8_t odczyt= 20;


////////////////////////////////////////////////////////////////////////////////////////////
DS3231 clock;
RTCDateTime dt;
LiquidCrystal_I2C lcd(0x27, 16, 2);  // Ustawienie adresu ukladu na 0x27
// Numer pinu do którego podłaczasz czujnik
#define ONEWIRE_PIN 8
// Adres czujnika
byte address1[8] = {0x28, 0x2, 0xEA, 0x7D, 0x2, 0x0, 0x0, 0x6D};
byte address2[8] = {0x28, 0x2A, 0x40, 0x7, 0xA, 0x0, 0x0, 0x62};
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

void setup()
{
  clock.setDateTime(__DATE__, __TIME__);
  Serial.begin(9600);
  pinMode(3, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  /////////////////////////////////////////////////////////////////////////////
  sensors.begin();
  sensors.request(address1);
  sensors.request(address2);
  ///////////////////////////////////////////////////////Wyświetlacz////////////////////////////////////////
  lcd.begin();
  lcd.backlight(); // zalaczenie podwietlenia
  lcd.clear();
  lcd.setCursor(0, 0);
  delay(500);
  //////////////////////////////////////////////////////////////////////////////////////////////////////////
pinMode(7, OUTPUT);

  //////////////////////////////////////////////////////////////////////////////////////////////////////////


}

void loop()
{

//////////////////////////////////Temperatura/////////////////////////////////////////////////////////////
    float temperature1 = sensors.readTemperature(address1);
    float temperature2 = sensors.readTemperature(address2);

    sensors.request(address1);
    sensors.request(address2);
 
    lcd.setCursor(0,0);
    lcd.print(temperature1);
    lcd.setCursor(0,1);
    lcd.print(temperature2);
/////////////////////////////////////////Nastawienie Temperatury/////////////////////////////////////////////////////////////////////////
 
    gora();
    dol();
    lcd.setCursor(6, 1);
    lcd.print(odczyt);
    delay(200);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
uint8_t tab[]={};

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    switch (odczyt)
    {
    case 22:
    uint8_t tab[] = {90,80,70};
    lcd.setCursor(10,1);
    //lcd.print(tab[1]);
    break;
   
    case 23:
  // uint8_t tab1[] = {40,30,20,15,10};
 
    break;
   
    }

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  if (temperature2 >= 27 && temperature2 <= 28 )
    {
     
    lcd.print(tab[0]);
    Serial.print(tab[0]);
    delay(100);
    }
  if (temperature2 >= 29 && temperature2 <= 30)
    {
   
    lcd.print(tab[1]);
    Serial.print(tab[1]);
    delay(100);
    }

}

///////////////////////////////////////////////////////////////////////
uint8_t gora ()
{
  if (digitalRead(3) == LOW)
  {
    odczyt = odczyt+1;
    return odczyt;
  }
}
////////////////////////////////////////////////
uint8_t dol ()
{
  if (digitalRead(2) == LOW)
  {
    odczyt = odczyt-1;
    return odczyt;
  }
}
uint8_t tab1 ()
  {
 
  }
Po osiągnięciu jakiej temperatury, jaka wartość z tablicy ma się wyświetlić?
Proszę wskazać linie kodu za to odpowiedzialne.
Od 27 do 28 chciałbym aby pojawił się pierwszy element tablicy ( tab[0] ), a od 29 do 30 drugi element tablicy ( tab[1] ).

Kod:
    switch (odczyt)
    {
    case 22:
    uint8_t tab[] = {90,80,70};
    lcd.setCursor(10,1);
    break;
   
    case 23:
    break;
   
    }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
   if (temperature2 >= 27 && temperature2 <= 28 )
     {
     
    lcd.print(tab[0]);
    Serial.print(tab[0]);
    delay(100);
     }
   if (temperature2 >= 29 && temperature2 <= 30)
     {
    
    lcd.print(tab[1]);
    Serial.print(tab[1]);
    delay(100);
     }
Najpierw zajmij się tym:

Kod:
uint8_t tab[]={};

    switch (odczyt)
    {
    case 22:
    uint8_t tab[] = {90,80,70};
    lcd.setCursor(10,1);
    //lcd.print(tab[1]);
    break;
 
    case 23:
  // uint8_t tab1[] = {40,30,20,15,10};

    break;
 
    }

W linii 69 deklarujesz tablicę tab, która na pierwszy rzut oka jest pusta. To jest deklaracja z definicją, ale nie wypełniasz pól, więc do tablicy wpadają wartości , które zostały w tym miejscu po ostatnim programie.
Dalej za switch, ww linii 76 deklarujesz nową tablicę tab, ale ona jest lokalna i tworzona jest tylko, gdy program wejdzie pomiędzy klamry switch. Poza klamrami ta tablica jest niedostępna, więc jeśli w linii 93 jest wywołana funkcja Serial.print(tab[0]);
to wyrzuca na UART tablicę z linii 69 i te wartości z pozostałości wymienione wyżej, a Ty chcesz tę z linii 76, co jest niemożliwością stopnia pierwszego.
dziękuję za pomoc Wink
Robson Kerman znów potrzebuję pomocy. W instrukcji swith case dodałem coś takiego:
Kod:
switch (odczyt)
    {
    case 22:
   uint8_t tab[] = {90,80,70};
    lcd.setCursor(10,1);

if (temperature2 >= 27 && temperature2 <= 28 )
     {
     
    lcd.print(tab[0]);
    Serial.print(tab[0]);
    delay(50);
     }
   if (temperature2 >= 29 && temperature2 <= 30)
     {
    lcd.print(tab[1]);
    Serial.print(tab[1]);
    delay(50);
     }
    break;
////////////////////////////////////////////////////////////////////////////////////////////// 
    case 23:
    uint8_t tab1[] = {40,30,20};
    lcd.setCursor(10,1);
if (temperature2 >= 27 && temperature2 <= 28 )
     {
    lcd.print(tab1[0]);
    delay(50);
     }
   if (temperature2 >= 29 && temperature2 <= 30)
     {
    lcd.print(tab1[1]);
    Serial.print(tab1[1]);
    delay(50);
     }
    break;
    }
jeżeli zmienna ,,odczyt" będzie miała 23 to nie wykonuje się case 23. Mógłbyś znów rzucić okiem ?