Funkcja switch case problem z zmienna.

Masz problem z Arduino? Tutaj możesz szukać pomocy.
grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 16 gru 2018, 19:04

No cześć. Od paru dni robię regulacje temperatury cieczy którą podgrzewa grzałka eletryczna.
Mam problem z funkcja switch - case.
to mój fragment kodu:

Kod: Zaznacz cały

void loop(){
switch (temp){  
    case temp<20:  //pierwszy zakres
       do {
         wypelnienie=100;
         regulacja_grzalka;  // tutaj program wykonuje operacje dla przekaznika grzałki i ponownie mierzy 					 
 					   temperature
       
 
      } while (temp=20); 
    break;
    case 20>=temp<30: //drugi zakres 
       do {  
         wypelnienie=80;
         regulacja_grzalka;
        
      } while (temp=30);
    break;
    
a to błąd który wyskakuje:
error: the value of 'temp' is not usable in a constant expression

case temp<20: //pierwszy zakres
jak rozwiązać ten problem ? gdy wpisze np case 20: .... to w tedy jest ok ale ja potrzebuję tu zakresów.
Pozdrawiam.

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


wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 16 gru 2018, 19:32

Case przyjmuje tylko int.
Zrob zmienna tempx i ja ustawiaj zaleznie od temp.
If (temp <=20){tempx = 1;}
If (temp >20){tempx = 2;}

I case od tempx


Wysłane z mojego SM-G950F przy użyciu Tapatalka
Ostatnio zmieniony 16 gru 2018, 20:43 przez wchpikus, łącznie zmieniany 1 raz.
grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Re: Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 16 gru 2018, 20:17

oczywiście nie wpadłem na to..
dzięki bardzo, działa znakomicie.
wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 16 gru 2018, 20:46

grzeebcio pisze:
16 gru 2018, 20:17
oczywiście nie wpadłem na to..
dzięki bardzo, działa znakomicie.

Spoko, ustaw sobie jeszcze histerezę, aby nie włączał sie jak będziesz miał 20 a wyłączał 19,99..
Najlepiej dodaj jeden stopien + - przy sprawdzaniu warunku.
Czyli masz 20stopni, włączasz, i odejmujesz jeden stopniej tak, aby wyłączył się przy 19, lub przy 21, jak wolisz.
unikniesz niestabilności przy temperaturach bliskich 20.
grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Re: Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 16 gru 2018, 22:12

hmm jednak mi to nie działa tak jak chciałem. wstawiłem funkcje if dla tempx która przypisuje liczby od 1-8, dałem to do setup a później wstawiłem to też do regulacja_grzalka(); ale od razu przeskakuje na case 8: ..
wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 16 gru 2018, 22:20

Pokaz..
Czemu do setup?
Setup wykonuje sie tylko raz przy starcie..
grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Re: Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 16 gru 2018, 22:26

pokazuje mi że odczytuje np 22 stopnie a przypisuje pozycje 8

Kod: Zaznacz cały

if (temp <20){tempx = 1;}
    if (20<=temp<30){tempx = 2;}
    if (30<=temp<35){tempx = 3;}
    if (35<=temp<36){tempx = 4;}
    if (36<=temp<37){tempx = 5;}
    if (37<=temp<38){tempx = 6;}
    if (38<=temp<39){tempx = 7;}
    if (39<=temp<=40){tempx = 8;}
wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 16 gru 2018, 22:32

Wstaw ten kod caly

Wysłane z mojego SM-G950F przy użyciu Tapatalka

grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Re: Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 16 gru 2018, 23:02

Kod: Zaznacz cały

#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
/*pinMode*** ustawienie pinów cyfrowych jako wejscie/wyjscie
 *digitalWrite** ustawienie pinu cyfrowego na stan low high
*/
#include <Wire.h>
#include <OneWire.h>

int add =0; // WARTOSC zadana z potencjometru    
int tempy=0; //TEMPERATURA cieczy
int wypelnienie = 100; // wypełnienie ustawione dla mocy grzałki podane w procentach 
int czas_wl=0;  //czasy wlaczenia i wylaczenia grzalki
int czas_wy=0;
int tempx=0;
OneWire oneWire(A3); //czujnik temperatury podłaczony do wejscia analogowego A5
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);// ustawienia adresu wyswietlacza
void setup() {
  Serial.begin(9600);
  sensors.begin();// Inicjacja czujnika temperatury
 
  /*ustawienia wyswietlacza*/
  lcd.begin(16, 2); // iNICJALIZACJA LCD 2x16
  lcd.backlight(); // zalaczenie podwietlenia 
  lcd.clear();
  lcd.setCursor(0, 0); //Ustawienie kursora
  lcd.print("temp.");
  lcd.setCursor(0,1);// ustawienie kursora
  lcd.print("Moc grzalki"); 
  /*------------------------------------------------------------------*/
    sensors.requestTemperatures();// pobranie temperatury z czujnika
    tempy=sensors.getTempCByIndex(0); //przypisanie temperatury do zmiennej temp
    lcd.setCursor(8,0);
    lcd.print(tempy);
    
 
  /*----------------------------------------------------------------------*/
  pinMode(9, OUTPUT);// wyjscie na przekasnik SSR
  pinMode(5,INPUT); //wejscie napiecia z potencjometru
  pinMode(8, INPUT); // wejscie napiecia  termometru
  digitalWrite(9, LOW);//ustawienie przekaznika SSR poczatkowy niski

}/*----------------------------------------------------------------------------*/
 
/*---------------------------------------------------------------------------------*/
void loop(){
switch (tempx)

  {
    case 1:  //pierwszy zakres
       do {
         wypelnienie=100;
         regulacja_grzalka();
      
      } while (tempy=20);//pierwszy zakres)
    break;
    case 2: //drugi zakres 
       do {  
         wypelnienie=80;
         regulacja_grzalka();
       } while (tempy=30);
    break;
    case 3:
        do{
          wypelnienie=60;
         regulacja_grzalka();     
      } while (tempy=35);
    break;
    case 4:
        do{
          wypelnienie=50;
         regulacja_grzalka();         
      } while (tempy=36);
    break;
    case 5: 
        do{
          wypelnienie=40;
          regulacja_grzalka();        
      } while (tempy=37);
    break;
    case 6:
        do{ 
          wypelnienie=30;
          regulacja_grzalka();         
      } while (tempy=38);
    break;
    case 7:
        do{
          wypelnienie=20;
          regulacja_grzalka();        
      } while (tempy=39) ;
     break;
     case 8:
        do{
          wypelnienie=10;
          regulacja_grzalka();        
      } while (tempy=40);
     break;
     default:
       digitalWrite(9, HIGH);
       delay(0);
       digitalWrite(9, LOW);
       delay(1000);
       sensors.requestTemperatures();// pobranie temperatury z czujnika
       tempy=sensors.getTempCByIndex(0); //przypisanie temperatury do zmiennej temp
       lcd.setCursor(14,0);
       lcd.print(tempy);
       Serial.println("temperature ktora odczytało default ");
   Serial.print(tempy);
  
  if (tempy <20){tempx = 1;}
    if (20<tempy<30){tempx = 2;}
     if (30<tempy<35){tempx = 3;}
   if (35<tempy<36){tempx = 4;}
    if (36<tempy<37){tempx = 5;}
    if (37<tempy<38){tempx = 6;}
    if (38<tempy<39){tempx = 7;}
    if (39<tempy<=40){tempx = 8;}
    
    Serial.println("temperature ktora przypisalodefault");
   Serial.println(tempx);
    Serial.println(wypelnienie);
      
     break;

}}
void regulacja_grzalka () 
 {                                          //czasy wlaczenia i wylaczenia grzalki wraz z obliczeniem czasu poprzez podanie wypełnienia
   int czas_wl=wypelnienie*10;         
   int czas_wy=1000-(wypelnienie*10);
 
   digitalWrite(9, HIGH);
   delay(czas_wl);
   digitalWrite(9, LOW);
   delay(czas_wy);

   sensors.requestTemperatures();// pobranie temperatury z czujnika
   tempy=sensors.getTempCByIndex(0); //przypisanie temperatury do zmiennej temp
   Serial.println("temperature ktora odczytało ");
   Serial.print(tempy);
   lcd.setCursor(8,0);
    lcd.print(tempy);
  

   
   if (tempy <20){tempx = 1;}
    if (20<tempy<30){tempx = 2;}
     if (30<tempy<35){tempx = 3;}
   if (35<tempy<36){tempx = 4;}
    if (36<tempy<37){tempx = 5;}
    if (37<tempy<38){tempx = 6;}
    if (38<tempy<39){tempx = 7;}
    if (39<tempy<=40){tempx = 8;}
    Serial.println("temperature ktora przypisalo");
   Serial.println(tempx);
    Serial.println(wypelnienie);
 }
teraz to juz tu mam namieszane...
wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 16 gru 2018, 23:34

ok, tylko ze..

popatrz co zwraca biblioteka od 1wire:
return (float) raw * 0.0078125;

https://github.com/milesburton/Arduino- ... rature.cpp

Wyświetl w terminalu co masz pod tempy, terminalem cokolwiek zobaczysz..teraz to nie wiesz co tam masz..
Serial.println(tempy);

Nie możesz porównywać w ten sposób..

case 1: //case 1 znaczy ze jesli tempx = 1 to
do {
wypelnienie=100;
regulacja_grzalka();

} while (tempy=20);
break;
case 2: //case 2 znaczy ze jesli tempx = 2 to
do {
wypelnienie=80;
regulacja_grzalka();
} while (tempy=30);
break;
case 3: //case 3 znaczy ze jesli tempx = 3 to
do{
wypelnienie=60;
regulacja_grza....


Zadna z tych case nie wywola sie, wiec masz:default:
digitalWrite(9, HIGH);
delay(0);
digitalWrite(9, LOW);
delay(1000);
sensors.requestTemperatures();// pobranie temperatury z czujnika
tempy=sensors.getTempCByIndex(0); //przypisanie temperatury do zmiennej temp
lcd.setCursor(14,0);
lcd.print(tempy);
Serial.println("temperature ktora odczytało default ");
grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Re: Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 17 gru 2018, 17:18

Wyswietlilem w terminalu temp i zależnie jak zdefiniuje zmienna to pokazuje mi dla int temp 25 a dla float 25.45.
To jak to mam porównywać?
wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 17 gru 2018, 17:29

Musisz zrobic rzutowanie na int.
Nigdy nie porownuj float w ten sposob.
Najlepiej zrobic tak, ze czesci dziesietne beda w jednej zmiennej, ulamki w drugiej.
Zapomnij o tej bibliotece w arduino.

https://github.com/macbre/telemetry/blo ... /ds18b20.c

18b20 ladnie da sie odczytac z palca..


Wysłane z mojego SM-G950F przy użyciu Tapatalka

grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Re: Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 17 gru 2018, 17:39

Możesz trochę jaśniej pisac ?
O której bibliotece mam zapomnieć?
Z jakiego palca odczytać?
Zrobiłem rzutowanie z int temp na int tempx. I nie działa.
wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 17 gru 2018, 19:31

Mozesz poszukac innej biblioteki do tego czujnika niz ta w ardiuno.
A co masz w serialu jak zrobiles rzutowanie?
Jakie wartosci?

Wysłane z mojego SM-G950F przy użyciu Tapatalka

grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Re: Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 17 gru 2018, 20:03

serial pokazuje dla tempy wartość temperatury rzeczywistej
po rzutowaniu serial pokazuje ostatnią funkcję if czyli w tym wypadku zwraca liczbę 8
gdy zakończę listę funkcji if np tylko do 5 to serial zwróci wartość tempx = 5.
wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 17 gru 2018, 20:29

Nie...zczytaj temperature, zrob rzutowanie do int i wyswietl 2 wartosci, przed i po.
Case na razie nie rob.
Zobacz dokladnie co masz po rzutowaniu.


Wysłane z mojego SM-G950F przy użyciu Tapatalka

grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Re: Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 17 gru 2018, 20:53

Kod: Zaznacz cały

void loop(){
  sensors.requestTemperatures();// pobranie temperatury z czujnika
    tempy=sensors.getTempCByIndex(0); //przypisanie temperatury do zmiennej temp
    Serial.println(tempy);
    if (tempy <20){tempx = 1;}
    if (20<tempy<30){tempx = 2;}
     if (30<tempy<35){tempx = 3;}
   if (35<tempy<36){tempx = 4;}
    if (36<tempy<37){tempx = 5;}
    if (37<tempy<38){tempx = 6;}
    if (38<tempy<39){tempx = 7;}
    if (39<tempy<=40){tempx = 8;}
    Serial.println(tempx);
generuje wyniki
32.25
8

a ten kod

Kod: Zaznacz cały

void loop(){
  sensors.requestTemperatures();// pobranie temperatury z czujnika
    tempy=sensors.getTempCByIndex(0); //przypisanie temperatury do zmiennej temp
    Serial.println(tempy);
    if (tempy <20){tempx = 1;}
    if (20<tempy<30){tempx = 2;}
  
    Serial.println(tempy);
    Serial.println(tempx);
generuje
32.50
2
i tyle
wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 17 gru 2018, 21:28

A gdzie masz to rzutowanie?

tempy=(int)sensors.getTempCByIndex(0);

Wysłane z mojego SM-G950F przy użyciu Tapatalka

uzi18
Majsterkowicz
Posty: 87
Rejestracja: 10 maja 2018, 05:06

Re: Funkcja switch case problem z zmienna.

Post autor: uzi18 » 17 gru 2018, 21:55

w czym problem?
jesli zmienna do ktorej przypisuje jest int to samo sie rzutuje, wcale nie trzeba innej biblioteki uzywac.


Wysłane z mojego MI MAX przy użyciu Tapatalka

wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 17 gru 2018, 22:03

https://4programmers.net/C_sharp/Rzutowanie

Ok w takim razie nie pomoge..

Wysłane z mojego SM-G950F przy użyciu Tapatalka

grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Re: Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 17 gru 2018, 22:19

Kod: Zaznacz cały

void zmiana_temp()
{ 
  if (temp<40 && temp>=39){tempx = 8;}
  if (temp<39 && temp>=38){tempx = 7;}
  if (temp<38 && temp>=37){tempx = 6;}
  if (temp<37 && temp>=36){tempx = 5;}
  if (temp<36 && temp>=33){tempx = 4;} 
  if (temp<33 && temp>=30){tempx = 3;}
  if (temp<30 && temp>=20){tempx = 2;}
  if (temp<20){tempx = 1;}
wystarczy zrobić tak.
nic innego nie zmieniać
float temp
int tempx
i tyle
uzi18
Majsterkowicz
Posty: 87
Rejestracja: 10 maja 2018, 05:06

Re: Funkcja switch case problem z zmienna.

Post autor: uzi18 » 18 gru 2018, 17:50

temp =sensors.getTempCByIndex(0) * 10;
tempy = temp/10;
tempx = temp%10;

Wysłane z mojego MI MAX przy użyciu Tapatalka

Dalessom
Młodszy majsterkowicz
Posty: 9
Rejestracja: 11 gru 2018, 10:36

Re: Funkcja switch case problem z zmienna.

Post autor: Dalessom » 19 gru 2018, 15:05

Nie możesz używać case w ten sposób stąd ten problem.
wchpikus
Majsterkowicz
Posty: 68
Rejestracja: 7 lut 2015, 20:59

Re: Funkcja switch case problem z zmienna.

Post autor: wchpikus » 19 gru 2018, 15:19

Pisalem, ale nie slucha...

Wysłane z mojego SM-G950F przy użyciu Tapatalka

grzeebcio
Młodszy majsterkowicz
Posty: 12
Rejestracja: 16 gru 2018, 13:22

Re: Funkcja switch case problem z zmienna.

Post autor: grzeebcio » 19 gru 2018, 20:03

Dalessom pisze:
19 gru 2018, 15:05
Nie możesz używać case w ten sposób stąd ten problem.
Dlaczego nie mogę ?
ODPOWIEDZ

Strony partnerskie: