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

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.