Skocz do zawartości

Menu wyświetlacza dla pomiaru temperatury


Bonkers

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


}
Link do komentarza
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);
 }
}
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

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

Link do komentarza
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();
 }
}
Link do komentarza
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.

Link do komentarza
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.

Link do komentarza
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;
 }



}
Link do komentarza
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?

Link do komentarza
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!

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

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.