Skocz do zawartości

Zwracanie wartości z instrukcji switch case


kopcor

Pomocna odpowiedź

Witam,

jestem świeżym użytkownikiem forum także przepraszam jeżeli w złym miejscu umieściłem mój post. 

Proszę o pomoc w zwracaniu wartości tablicy z warunku switch case. 

Oto kod:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DS18B20.h>
#include <DS3231.h>
///////////////////////////////Zmienne//////////////////////////////////////////////////////
uint8_t odczyt= 20;
uint8_t a=0;
float temperature1;
float temperature2;


////////////////////////////////////////////////////////////////////////////////////////////
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/////////////////////////////////////////////////////////////////////////
   // digitalWrite(7, HIGH);
    gora();
    dol();
    lcd.setCursor(6, 1);
    lcd.print(odczyt);
    delay(200);
    
    if (a >= 80 && 100 <= a) 
    {
      Serial.println(a);
       digitalWrite(7, HIGH);
    }
    //lcd.setCursor(0,0);
 


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

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

if (temperature2 >= 27.0 && temperature2 <= 28.0 ) 
     {
      
    lcd.print(tab[0]);
    Serial.print(tab[0]);
    delay(50);
    uint8_t a = tab[0];
    return a; 
     }
if (temperature2 >= 29.0 && temperature2 <= 30.0) 
     {
    lcd.print(tab[1]);
    Serial.print(tab[1]);
    delay(50);
     }
    break;
      }
//////////////////////////////////////////////////////////////////////////////////////////////  
    case 23:
    if (odczyt = 23)
    {
    uint8_t tab1[] = {40,30,20};
    lcd.setCursor(10,1);
if (temperature2 >= 27.0 && temperature2 <= 28.0 ) 
     {
    lcd.print(tab1[0]);
    delay(50);
     }
   if (temperature2 >= 29.0 && temperature2 <= 30.0) 
     {
    lcd.print(tab1[1]);
    Serial.print(tab1[1]);
    delay(50);
     }
    break;
    }
  }
  

}

///////////////////////////////////////////////////////////////////////
uint8_t gora () 
{
  if (digitalRead(3) == LOW)
  {
    odczyt = odczyt+1;
    return odczyt;
  }
}
////////////////////////////////////////////////////////////////////////
uint8_t dol () 
{
  if (digitalRead(2) == LOW)
  {
    odczyt = odczyt-1;
    return odczyt;
  }
}
///////////////////////////////////////////////////////////////////////////

W case 22 mam warunek, w którym jeżeli temperatura jest z przedziału 27 - 28 stopni to element zerowy tablicy jest przypisywany do zmiennej( zmienna  uint8_t a ). Następnie ta zmienna jest zwracana po za instrukcję switch case i ma zapalać diodę. Niestety nie działa mi to. 

Prosze o pomoc bo nie wiem co robię źle.

Link do komentarza
Share on other sites

@kopcor witam na forum 🙂

Na początek zerknij jak wygląda pusty szkielet instrukcji warunkowej switch...case. Poniższy zapis raczej nie ma sensu. Co właściwie chciałeś nim osiągnąć?

    switch (odczyt)
    {
      if (odczyt = 22)
      {
    case 22:

Tutaj znajdziesz podstawowe informacje na temat switch...caseKurs Arduino – #6 – kontynuacja UART, serwomechanizmy

PS Zadbaj też o formatowanie programu. Wykorzystaj przynajmniej automatyczną opcję w (Narzędzia > Automatyczne formatowanie), a będzie już znacznie lepiej 🙂

Link do komentarza
Share on other sites

Nie mówiąc już o tym, że zbędny warunek if także jest błędny. Jeśli w jakimkolwiek warunku chcesz sprawdzić czy zmienna jest równa określonej wartości to używasz np.:

 if(zmienna == wartość)
    { //to się wykona jeśli warunek jest prawdziwy (spełniony)
   
 	}

Zwróć uwagę na podwójny znak równości. Użycie zmienna = wartość to przypisanie wartości zmiennej np.

zmienna = 2; // przypisujemy zmiennej wartość 2

 

Edytowano przez Belferek
Link do komentarza
Share on other sites

Mój zamysł na ten projekt jest następujący:

Chcę wybierać za pomocą 2 przycisków temperaturę, niejako mi się to udało ( zmienna odczyt, case 22). Jeżeli temperatura będzie z przedziału np 27 - 28 stopni to mam mi się wyświetlić zerowy element tablicy( uint8_t tab[] ) na lcd i zwracać wartość tablicy na zewnątrz switch case. Da się coś takiego zrobić ? Jestem początkujący w programowaniu.  

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

      if (temperature2 >= 27.0 && temperature2 <= 28.0 )
      {

        lcd.print(tab[0]);
        Serial.print(tab[0]);
        delay(50);
        uint8_t a = 2;
        return a;
      }

poniżej  wstawiam cały kod programu.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DS18B20.h>
#include <DS3231.h>
///////////////////////////////Zmienne//////////////////////////////////////////////////////
uint8_t odczyt = 20;
uint8_t a = 0;
float temperature1;
float temperature2;


////////////////////////////////////////////////////////////////////////////////////////////
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);
  digitalWrite(7, HIGH);
  //////////////////////////////////////////////////////////////////////////////////////////////////////////


}

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);


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

  switch (odczyt)
  {


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

      if (temperature2 >= 27.0 && temperature2 <= 28.0 )
      {

        lcd.print(tab[0]);
        Serial.print(tab[0]);
        delay(50);
        uint8_t a = 2;
        return a;
      }
      if (temperature2 >= 29.0 && temperature2 <= 30.0)
      {
        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.0 && temperature2 <= 28.0 )
      {
        lcd.print(tab1[0]);
        delay(50);
      }
      if (temperature2 >= 29.0 && temperature2 <= 30.0)
      {
        lcd.print(tab1[1]);
        Serial.print(tab1[1]);
        delay(50);
      }
      break;

  }
  //////////////////////////////////////////////////////////////////////////
  if (a > 1)
  {
    //Serial.println(a);
    digitalWrite(7, LOW);
    lcd.setCursor(4, 0);
    lcd.print("Działa");
    delay(200);
  }
  //lcd.setCursor(0,0);

}
///////////////////////////////////////////////////////////////////////
uint8_t gora ()
{
  if (digitalRead(3) == LOW)
  {
    odczyt = odczyt + 1;
    return odczyt;
  }
}
////////////////////////////////////////////////////////////////////////
uint8_t dol ()
{
  if (digitalRead(2) == LOW)
  {
    odczyt = odczyt - 1;
    return odczyt;
  }
}
///////////////////////////////////////////////////////////////////////////

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ten program działa? Co się wydarzy w switch(odczyt) jeśli zmienna ta nie będzie równa 22 lub 23? Gorąco polecam rozrysowanie swojego pomysłu na program w postaci algorytmu. Po stworzeniu sobie takiej recepty (algorytmu) na program należy ją dogłębnie przeanalizować. Wcielasz się w rolę procesora, symulujesz zdarzenia (wartości zmiennych), które mogą się pojawić .... Twój program moim zdaniem (po reset) wchodzi w warunek switch i .......

Edytowano przez Belferek
Link do komentarza
Share on other sites

No teraz nie działa... czy jest możliwość abyście mi podsunęli pomysł jak napisać ten program ? bo ja stanąłem w miejscu i nie mam pojęcia ani pomysłu jak to zrobić żeby działało....

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.