Skocz do zawartości
Bonkers

Menu wyświetlacza dla pomiaru temperatury

Pomocna odpowiedź

Witam,

Moja przygoda z Arduino zaczęła się od niedawna (jakiegoś miesiąca). Mam taki problem, że potrzebuję zrobić pomiar temperatury z czujnika DS18B20. Temperatura ma się wyświetlać na wyświetlaczu lcd 2x16 z konwerterem I2C, który włączał by dane urządzenie np. diode w danym przedziale temperatur. Tylko nie wiem kompletnie jak zrobić menu na wyświetlaczu aby ustalić dane progi temperatury dla których będzie się ta dioda włączała (ustawienie temp. : od: do:). W menu wchodziło by się za pomocą przycisku (enter), dwoma przyciskami zmieniałoby się wartości temp., 4 przycisk służył by jako exit.

Poniżej program który zapisałem dla początkowo ustalonych wartości temperatur.

Proszę o pomoc jak go zmienić aby spełnił moje wymagania 🙂

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

#define BACKLIGHT_PIN 3

//przyciski
#define ENTER 4
#define UP 5
#define DOWN 6
#define  EXIT 7

#define LED 8

int tempOd = 23.0;
int tempDo = 26.0;
//Numer pinu do ktorego podlaczasz czujnik
#define ONEWIRE_PIN 2

float temperatura = 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(EXIT, INPUT_PULLUP);


 pinMode(LED, OUTPUT);
 digitalWrite(LED, LOW);
 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 prog(float temperatura, int tempOd, int tempDo)
{
 if(temperatura > tempOd && temperatura < tempDo)
 {
   digitalWrite(LED, HIGH);
   delay(200);
 }
 else
 {
   digitalWrite(LED, LOW);
   delay(200);
 }

}
void loop() {


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

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

 prog(temperatura, tempOd, tempDo);
 delay(3000);


}

Udostępnij ten post


Link to post
Share on other sites

To może zacznij o programu, który by wyświetlał na wyświetlaczu liczbę i pozwalał ją zmieniać dwoma przyciskami. Myślisz, że dasz radę coś takiego napisać?

Udostępnij ten post


Link to post
Share on other sites

No dałem rade takie coś napisać, ale nie wiem czy to prawidłowo zrobiłem, poza tym to nie wiem co dalej.

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

#define BACKLIGHT_PIN 3

#define UP 4
#define DOWN 5
int liczba = 0;
//Adres wyswietlacza
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

byte butto = false;
void setup() {

Serial.begin(9600);

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

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

}

void loop() {

 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Liczba: ");
 lcd.setCursor(10, 0);
 lcd.print(liczba);

 if(digitalRead(UP)==HIGH)
 {
   liczba++;
   delay(200);
 }
 if(digitalRead(DOWN)==HIGH)
 { 
   liczba--;
   delay(200);
 }
}

Udostępnij ten post


Link to post
Share on other sites

Próbuje to przerobić, ale mi nie wychodzi 🙁

Udostępnij ten post


Link to post
Share on other sites

Spróbuj coś takiego:

 long last_up = 0;

 if ((digitalRead(UP) == HIGH)  && (millis() - last_up > 200) { 
   liczba++; 
   last_up = millis()
 }

i w drugim warunku tak samo. Jak już ci to zadziała, to spróbuj dodać trzeci klawisz który zmienia zmienną, od której zależeć będzie która liczba się wyświetla (zmieniać będzie napis "Liczba:" na przykład na "Liczba2:".

Udostępnij ten post


Link to post
Share on other sites

Przerobiłem na taki program, ale jest problem z wyświetleniem tej liczby na wyświetlaczu (ledwo ją widać), kontrast wyświetlacza jest dobrze ustawiony.

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

#define BACKLIGHT_PIN 3

#define UP 4
#define DOWN 5
int liczba = 0;
//Adres wyswietlacza
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

long last_up = 0; 
long last_down = 0;

void setup() {

Serial.begin(9600);

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

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

}

void loop() {

 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Liczba: ");
 lcd.setCursor(10, 0);
 lcd.print(liczba);


 if((digitalRead(UP)==HIGH) && (millis() - last_up > 200))
 {
   liczba++;
   last_up = millis();

 }
 if((digitalRead(DOWN)==HIGH) && (millis() - last_down > 200))
 { 

   liczba--;
   last_down = millis();
 }
}

Udostępnij ten post


Link to post
Share on other sites

To dlatego, ciągle kasujesz ten wyświetlacz i wyświetlasz od nowa.

To teraz wrzuć to wyświetlanie do ifa i dodaj flagę, która będzie mówić czy coś się zmieniło czy nie -- tak, żeby wypisywać na wyświetlacz tylko wtedy, gdy coś się zmieniło.

Udostępnij ten post


Link to post
Share on other sites

Zadeklaruj zmienną globalną typu bool, o początkowej wartości true.

Te linie:

lcd.clear();

lcd.setCursor(0,0);

lcd.print("Liczba: ");

lcd.setCursor(10, 0);

lcd.print(liczba);

mają się wykonywać tylko kiedy ta zmienna jest true, a po wykonaniu się ustawiać ją na false.

W pozostałych if-ach ustawiaj tę zmienną na true.

[ Dodano: 31-03-2017, 20:05 ]

Jak nie wiesz jak zrobić któryś z tych punktów i google nie pomaga, to pytaj.

Udostępnij ten post


Link to post
Share on other sites

Teraz działa, tylko że te liczba teraz jakoś szybko miga że czasami trudno rozpoznać czy to 3 czy 4

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

#define BACKLIGHT_PIN 3

#define UP 4
#define DOWN 5
int liczba = 0;
bool flaga = true;
//Adres wyswietlacza
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

long last_up = 0; 
long last_down = 0;

void setup() {

Serial.begin(9600);

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

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

}

void loop() {

 if(flaga==true){
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Liczba: ");
 lcd.setCursor(10, 0);
 lcd.print(liczba);

 flaga=false;
 }

 if((digitalRead(UP)==HIGH) && (millis() - last_up > 200))
 {

   liczba++;
   last_up = millis();
   flaga = true;

 }
 if((digitalRead(DOWN)==HIGH) && (millis() - last_down > 200))
 { 

   liczba--;
   last_down = millis();
   flaga = true;
 }



}

Udostępnij ten post


Link to post
Share on other sites

To dziwne, nic nie powinno migać. Nic się nie powinno dziać dopóki nie naciśniesz przycisku.

Udostępnij ten post


Link to post
Share on other sites

No to może mam jakiś błąd w programie

Udostępnij ten post


Link to post
Share on other sites

Jeśli na pewno masz wgrane to, co tutaj wkleiłeś, to nie masz błędu. Żaden z if-ów się nie będzie wykonywał, chyba, że zostanie naciśnięty przycisk.

Hmm... A możesz pokazać schemat jak masz te przyciski podłączone?

Udostępnij ten post


Link to post
Share on other sites

Proszę, tylko nie wiem czy dobrze widać wszystko 😃

IMG_20170331_215653.thumb.jpg.4d81fb47c9c22bf6ee62e15a4fb98852.jpg

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...