Skocz do zawartości
Bonkers

Menu wyświetlacza dla pomiaru temperatury

Pomocna odpowiedź

Teraz nie miga, bo się nie da zmienić wogóle progów, raz na początku tylko jak przycisnę przycisk to pojawia się na sekundę, a potem to sie już nic nie da zmienić.

#include <OneWire.h>
#include <DS18B20.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define BACKLIGHT_PIN 3

//przyciski
#define UP 4
#define DOWN 5
#define ENTER 6
#define ENTEXIT 10

#define LED 8


//Numer pinu do ktorego podlaczasz czujnik
#define ONEWIRE_PIN 2

float temperatura = 0;
float temp =0;

float liczba[2] = {0,0};  //progi temperatur

int prog = 0; //wartosc dla danego progu
int entexit = 0;

bool flaga = true;
bool flaga2 = true;
//ostatnie klikniecia przyciskow
long last_up = 0; 
long last_down = 0;
long last_enter = 0;
long last_entexit = 0;
long last_check = 0;

//adres czujnika
byte address[8] = {0x28, 0xFF, 0x9A, 0x26, 0x58, 0x16, 0x4, 0x42};

//Adres wyswietlacza
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);




void setup() {

 Serial.begin(9600);

 pinMode(ENTER, INPUT_PULLUP);
 pinMode(UP, INPUT_PULLUP);
 pinMode(DOWN, INPUT_PULLUP);
 pinMode(ENTEXIT, INPUT_PULLUP);



 sensors.begin();
 sensors.request(address);

 lcd.begin(16, 2);
 lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd.setBacklight(HIGH);
 lcd.setCursor(0, 0); //ustawienie kursora
 lcd.print("Temp: ");


}

/*void progi(float temperatura, float liczba[0], float liczba[1])
{
 if(temperatura > liczba[0] && temperatura < liczba[1])
 {
   digitalWrite(LED, HIGH);
   delay(200);
 }
 else
 {
   digitalWrite(LED, LOW);
   delay(200);
 }

}*/
void loop() {



 temperatura = sensors.readTemperature(address);
 sensors.request(address);

  if((digitalRead(ENTEXIT)==LOW) && (millis() - last_entexit > 200))
{
 if(entexit==0){entexit=1;}
 else{entexit = 0;}
 last_entexit = millis();

}

if((millis() - last_check > 3000)){

 temperatura = sensors.readTemperature(address);
 sensors.request(address);

 last_check = millis();
 flaga2 = true;
}
 if(entexit==0 && flaga2 ==true)
 {

 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Temp: ");
 lcd.setCursor(6, 0);
 lcd.print(temperatura);
 lcd.setCursor(12, 0);
 lcd.print("*C");


 // delay(3000);

   if(temperatura > liczba[0] && temperatura < liczba[1])
   {
     digitalWrite(LED, HIGH);
     delay(200);
   }
   else
   {
     digitalWrite(LED, LOW);
     delay(200);
   }

   flaga2 = false;
 }

 if(entexit == 1){
 if((digitalRead(ENTER)==LOW) && (millis() - last_enter > 200))
 {
   if(prog == 0)
   {
     prog = 1;

   }
   else
   {
     prog = 0;

   }
     last_enter = millis();
 }


 if(prog == 1)
 {
   if(flaga== true)
   {  
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("MAX");

     lcd.setCursor(10, 0);
     lcd.print(liczba[prog],1);

     flaga = false;
    }
 }
 if(prog ==0)
 {
    if(flaga== true)
    {  
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("MIN");

       lcd.setCursor(10, 0);
       lcd.print(liczba[prog],1);
       flaga = false;
    }
 }

 /*if(flaga!=false)
 {
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.setCursor(10, 0);
   lcd.print(liczba[prog],1);

   flaga=false;
 }*/

 if(liczba[prog] < 100.0)
 {
   if((digitalRead(UP)==LOW) && (millis() - last_up > 200))
   {

      liczba[prog]+=0.1;
      last_up = millis();

     flaga = true;
    }
  }


 if( 0 <= liczba[prog])
 {
   if((digitalRead(DOWN)==LOW) && (millis() - last_down > 200))
   { 

     liczba[prog]-=0.1;
     last_down = millis();
     flaga = true;
    }
 }
 }

}

Udostępnij ten post


Link to post
Share on other sites

Musisz ustawić obie flagi na true po naciśnięciu entera.

Udostępnij ten post


Link to post
Share on other sites

Teraz lepiej, bo już da się zmienić progi i nie miga już, tylko że da się zrobić to tylko raz bo potem przycisk ENTEXIT nie reaguje.

#include <OneWire.h>
#include <DS18B20.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define BACKLIGHT_PIN 3

//przyciski
#define UP 4
#define DOWN 5
#define ENTER 6
#define ENTEXIT 10

#define LED 8


//Numer pinu do ktorego podlaczasz czujnik
#define ONEWIRE_PIN 2

float temperatura = 0;
float temp =0;

float liczba[2] = {0,0};  //progi temperatur

int prog = 0; //wartosc dla danego progu
int entexit = 0;

bool flaga = true;
bool flaga2 = true;
//ostatnie klikniecia przyciskow
long last_up = 0; 
long last_down = 0;
long last_enter = 0;
long last_entexit = 0;
long last_check = 0;

//adres czujnika
byte address[8] = {0x28, 0xFF, 0x9A, 0x26, 0x58, 0x16, 0x4, 0x42};

//Adres wyswietlacza
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);




void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);

 pinMode(ENTER, INPUT_PULLUP);
 pinMode(UP, INPUT_PULLUP);
 pinMode(DOWN, INPUT_PULLUP);
 pinMode(ENTEXIT, INPUT_PULLUP);



 sensors.begin();
 sensors.request(address);

 lcd.begin(16, 2);
 lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd.setBacklight(HIGH);
 lcd.setCursor(0, 0); //ustawienie kursora
 lcd.print("Temp: ");


}

/*void progi(float temperatura, float liczba[0], float liczba[1])
{
 if(temperatura > liczba[0] && temperatura < liczba[1])
 {
   digitalWrite(LED, HIGH);
   delay(200);
 }
 else
 {
   digitalWrite(LED, LOW);
   delay(200);
 }

}*/
void loop() {
 // put your main code here, to run repeatedly:


 temperatura = sensors.readTemperature(address);
 sensors.request(address);

  if((digitalRead(ENTEXIT)==LOW) && (millis() - last_entexit > 200))
{

 if(entexit==0){entexit=1;}
 else{entexit = 0;}
 last_entexit = millis();

}

if((millis() - last_check > 3000)){

 temperatura = sensors.readTemperature(address);
 sensors.request(address);

 last_check = millis();
 flaga2 = true;
}
 if(entexit==0 && flaga2 ==true)
 {

 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Temp: ");
 lcd.setCursor(6, 0);
 lcd.print(temperatura);
 lcd.setCursor(12, 0);
 lcd.print("*C");


 // delay(3000);

   if(temperatura > liczba[0] && temperatura < liczba[1])
   {
     digitalWrite(LED, HIGH);
     delay(200);
   }
   else
   {
     digitalWrite(LED, LOW);
     delay(200);
   }

   flaga2 = false;
 }

 if(entexit == 1){
 if((digitalRead(ENTER)==LOW) && (millis() - last_enter > 200))
 {
   flaga = true;
   flaga2 = true;
   if(prog == 0)
   {
     prog = 1;

   }
   else
   {
     prog = 0;

   }
     last_enter = millis();
 }


 if(prog == 1)
 {
   if(flaga== true)
   {  
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("MAX");

     lcd.setCursor(10, 0);
     lcd.print(liczba[prog],1);

     flaga = false;
    }
 }
 if(prog ==0)
 {
    if(flaga== true)
    {  
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("MIN");

       lcd.setCursor(10, 0);
       lcd.print(liczba[prog],1);
       flaga = false;
    }
 }

 /*if(flaga!=false)
 {
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.setCursor(10, 0);
   lcd.print(liczba[prog],1);

   flaga=false;
 }*/

 if(liczba[prog] < 100.0)
 {
   if((digitalRead(UP)==LOW) && (millis() - last_up > 200))
   {

      liczba[prog]+=0.1;
      last_up = millis();

     flaga = true;
    }
  }


 if( 0 <= liczba[prog])
 {
   if((digitalRead(DOWN)==LOW) && (millis() - last_down > 200))
   { 

     liczba[prog]-=0.1;
     last_down = millis();
     flaga = true;
    }
 }
 }

}

Udostępnij ten post


Link to post
Share on other sites

Przepraszam, ale zmęczyło mnie to. Wydaje mi się, że co się miałeś nauczyć, to się nauczyłeś, dalej to już jest debugowanie zrefaktorowanie tego tak, żeby się dało czytać. Nie wiem, czy jest sens to robić na forum, więc po prostu wklejam ci tu moją wersję:

#include <OneWire.h>
#include <DS18B20.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define BACKLIGHT_PIN 3

#define KEY_UP_PIN 4
#define KEY_DOWN_PIN 5
#define KEY_ENTER_PIN 6
#define KEY_EXIT_PIN 10

#define LED_PIN 8

#define ONEWIRE_PIN 2

float temperature = 0;
float thresholds[2] = {0,0};
int state = 3;
// 0 - change min. threshold
// 1 - change max. threshold
// 2 - display temperature

bool dirty = true;

long last_up = 0;
long last_down = 0;
long last_enter = 0;
long last_exit = 0;
long last_check = 0;

//adres czujnika
byte address[8] = {0x28, 0xFF, 0x9A, 0x26, 0x58, 0x16, 0x4, 0x42};

//Adres wyswietlacza
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);


void setup() {
   Serial.begin(9600);
   pinMode(ENTER, INPUT_PULLUP);
   pinMode(UP, INPUT_PULLUP);
   pinMode(DOWN, INPUT_PULLUP);
   pinMode(ENTEXIT, INPUT_PULLUP);
   sensors.begin();
   sensors.request(address);
   lcd.begin(16, 2);
   lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
   lcd.setBacklight(HIGH);
}


void loop() {
   long now = millis();

   if ((!digitalRead(KEY_ENTER_PIN)) && (now - last_enter > 200)) {
       state = (state + 1) % 3;
       dirty = true;
       last_enter = now;
   }
   if ((!digitalRead(KEY_EXIT_PIN)) && (now - last_exit > 200)) {
       state = 2;
       dirty = true;
       last_exist = now;
   }

   if (state == 2) {
       if (now - last_check > 3000) {
           temperatura = sensors.readTemperature(address);
           sensors.request(address);
           dirty = true;
           last_check = now;
           digitalWrite(LED_PIN, (
               (temperatura > thresholds[0]) &&
               (temperatura < thresholds[1])
           ));
       }
       if (dirty) {
           lcd.clear();
           lcd.setCursor(0,0);
           lcd.print("Temp: ");
           lcd.setCursor(6, 0);
           lcd.print(temperatura);
           lcd.setCursor(12, 0);
           lcd.print("*C");
           dirty = false;
       }
   } else if ((state == 0) || (state == 1)) {
       if (dirty) {
           lcd.clear();
           lcd.setCursor(0,0);
           if (state == 2) {
               lcd.print("MAX");
           } else {
               lcd.print("MIN");
           }
           lcd.setCursor(10, 0);
           lcd.print(thresholds[state], 1);
           dirty = false;
       }
       if ((!digitalRead(KEY_UP_PIN)) && (now - last_up > 200)) {
           if (thresholds[state] < 100.0) {
               thresholds[state]+=0.1;
               dirty = true;
               last_up = now;
           }
       }
       if ((!digitalRead(KEY_DOWN_PIN)) && (now - last_down > 200)) {
           if (thresholds[state] < 100.0) {
               thresholds[state]+=0.1;
               dirty = true;
               last_down = now;
           }
       }
   }
}

Oczywiście mogą być literówki, bo nie bardzo mam jak to przetestować, ale nawet jak nie zadziała od kopa, to powinieneś być w stanie w oparciu o to i o to co już wiesz wykombinować coś.

Udostępnij ten post


Link to post
Share on other sites

No niestety ten twój program nie zadziałał, ale mimo to wielkie dzięki. I mam jeszcze 2 pytania:

- czy żeby zrobić więcej progów to wystarczy większą tablice zrobić i dorobić pozostałe warunki takie same jak w tym programie?

- i jaki obecnie największy wyświetlacz 4x20 można połączyć z arduino (najlepiej OLED), bo szukałem i największe to były chyba z 5,7 cali, a najlepiej jakby był jeszcze większy

Udostępnij ten post


Link to post
Share on other sites

1. Tak właśnie.

2. Możesz podłączyć nawet 100-calowy wyświetlacz z telewizora, tylko musisz wyczytać w nocie katalogowej jak z nim rozmawiać, no i przepychanie tych wszystkich pikseli może być trochę wolne. Spokojnie możesz użyć wyświetlaczy LCD dla RaspberryPi, tylko nie ten oficjalny, podłączany do specjalnego złącza.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Ok jeszcze raz wielkie dzięki, program już działa poprawnie bo wcześniej zapomniałem jeszcze ustawić flagę na true przy odczycie temperatury i teraz wszystko jest ok 🙂

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...