Arduino teploměr

Odpovědět
Vojta
Příspěvky: 1
Registrován: 20 pro 2020, 13:40

Arduino teploměr

Příspěvek od Vojta » 22 pro 2020, 16:19

Dobrý den, nedávno jsem začal s Arduinem a chtěl bych požádat o radu.
Zkusil jsem si udělat v arduinu program, aby mi vypisoval teplotu po sériové lince, pak jsem k tomu přidal LCD display(20,4) a funguje to. Ale ještě bych chtěl, aby když teplota bude pod limitem třeba 20°C, tak aby se rozsvítila led dioda a když teplota přesáhne třeba 26°C, tak aby se rozsvítila druhá led dioda.
Předem děkuji za vaše rady.

Kód: Vybrat vše

#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#include <OneWire.h>
#include <DallasTemperature.h>
const int cidlo = 7;  
OneWire oneWireDS(cidlo); 
DallasTemperature senzoryDS(&oneWireDS); 
int led1 = 6;
int led2 = 8;
void setup(void) {
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  lcd.begin(20,4);
  //Serial.begin(9600);  
  senzoryDS.begin();   
  lcd.setCursor(4,1);
  lcd.print("Thermometer");
  delay(5000);
  lcd.clear();
}
void loop(void) {
  senzoryDS.requestTemperatures();
  lcd.setCursor(0,0);
  lcd.print("Teplota: ");
  lcd.setCursor(1,1);
  lcd.print(senzoryDS.getTempCByIndex(0));
  lcd.setCursor(6,1);
  lcd.print(" stupnu Celsia");
  delay(1000);
  if (20 <= senzoryDS.requestTemperatures()) {digitalWrite(led1 = HIGH);}
  if (senzoryDS.requestTemperatures() >= 26) {digitalWrite(led2 = HIGH);}
}

MartinL
Příspěvky: 187
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: Arduino teploměr

Příspěvek od MartinL » 22 pro 2020, 16:46

Vojta píše:
22 pro 2020, 16:19

Kód: Vybrat vše

void loop(void) {
  senzoryDS.requestTemperatures();
  lcd.setCursor(0,0);
  lcd.print("Teplota: ");
  lcd.setCursor(1,1);
  lcd.print(senzoryDS.getTempCByIndex(0));
  lcd.setCursor(6,1);
  lcd.print(" stupnu Celsia");
  delay(1000);
  if (20 <= senzoryDS.requestTemperatures()) {digitalWrite(led1 = HIGH);}
  if (senzoryDS.requestTemperatures() >= 26) {digitalWrite(led2 = HIGH);}
}
Sice tu knihovnu pro DS snímače neznám, ale řekl bych, že funkce requestTemperatures() spustí měření. Načtení hodnoty je spíše getTempCByIndex(0).
Takže v tom porovnání je to potřeba vyměnit. Jinak bych to, ale raději udělal tak, že hodnotu teploty si načtu do nějaké proměnné a tu pak budu používat. Druhý problém je, že je nutné také někdy ty led zhasínat. Takže to upravíme např. takto (jde to napsat i elegantněji, ale nechci ti do toho moc hrabat) :

Kód: Vybrat vše

void loop(void) {
  senzoryDS.requestTemperatures();
  lcd.setCursor(0,0);
  lcd.print("Teplota: ");
  lcd.setCursor(1,1);
  float teplota = senzoryDS.getTempCByIndex(0);
  lcd.print(teplota);
  lcd.setCursor(6,1);
  lcd.print(" stupnu Celsia");
  if (20 <= teplota) {digitalWrite(led1, HIGH);} else {digitalWrite(led1, LOW);}
  if (teplota >= 26) {digitalWrite(led2, HIGH);} else {digitalWrite(led2, LOW);}
  delay(1000);
}

DavidO
Příspěvky: 980
Registrován: 01 kvě 2013, 21:27

Re: Arduino teploměr

Příspěvek od DavidO » 22 pro 2020, 20:53

Ten test na spodní hranici máš obráceně, LED1 ti to rozsvítí, když teplota bude bude větší nebo rovna 20, ne když bude pod 20.

Místo celého řádku s ifem to můžeš napsat i takhle krátce: digitalWrite(led1, teplota <=20); a nemusíš mít if a vypisovat zvlášť volání pro HIGH a v else větvi pro LOW.

PS:
1. Ve tvém původním programu to digitalWrite(led1 = HIGH); je blbě; když už, tak mělo být digitalWrite(led1, HIGH);, protože tak jak to tam je, by sis přepsal hodnotu led1 neboli číslo pinu. Martin ti to opravil, ale radši na to upozorňuju, protože by sis toho teď nemusel všimnout a příště bys to napsal zase tak. (kdyby sis ovšem to číslo pinu, kam je led připojená, nadeklaroval takhle: const int led1=6;, tj. označil to za konstantu, tak by tě na to upozornil už překladač, že se to pokoušíš měnit)
2. Pro vkládání programu do příspěvku použij značku [code], má v editoru tlačítko </>. Taky jde použít pro kód přímo v textu značka [c], jako jsem udělal tady o kousek výše)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti