Stránka 1 z 2
Arduino měření teploty
Napsal: 8. 1. 2021, 7:43
od Modros
Zdravím...už nějakou dobu se trápím s měřením teploty...
Nenašla by se dobrá duše která by mě pomohla s kodem?....věnuji se arduinu krátkou dobu takže tápu
Mám display 128x64
a teplotní senzory DS18B20
mám vzorové kody...kde dokážu provozovat 7 čidel( potřebuji měřit 7 teplot) a v seriálu si je vypisuju
na display dokážu vepsat jednoduchý text
umím si vybrat font aby se vešlo 7 hodnot na display
neumím naprogramovat aby se při určité teplotě seplo relé které sepne alarm
neumí složit oba kody tak aby se seriál print vypsal na display...
neumím upravit kod aby mělo každé čidlo svůj název
neumím programovat...jsem lama
jednoduché programy už zvládnu...mám nekolik knižek ale tohle je na mě moc
toto spojení senzorů a displaye sem na netu nenašel.....ale tuto velikost potřebuji
https://dratek.cz/arduino/1187-teplotni ... 18b20.html
https://dratek.cz/arduino/1157-graficky ... iceni.html
Re: Arduino měření teploty
Napsal: 8. 1. 2021, 8:22
od Thomeeque
Myslíš tydle dva programy:
Kód: Vybrat vše
// Grafický LCD display 128x64
// řadič ST7920
// připojení knihovny U8glib
#include "U8glib.h"
// nastavení propojovacích pinů
#define EN 13
#define RW 12
#define RS 11
// inicializace OLED displeje z knihovny U8glib
U8GLIB_ST7920_128X64_1X lcd(EN, RW, RS);
// proměnná pro uchování času poslední obnovy displeje
long int prepis = 0;
void setup(void) {
// nastavení bílé barvy pro výpis
if ( lcd.getMode() == U8G_MODE_R3G3B2 ) {
lcd.setColorIndex(255);
}
// nastavení maximální intenzity svitu
else if ( lcd.getMode() == U8G_MODE_GRAY2BIT ) {
lcd.setColorIndex(3);
}
// nastavení viditelnosti pixelů
else if ( lcd.getMode() == U8G_MODE_BW ) {
lcd.setColorIndex(1);
}
// pro otočení displeje o 180 stupňů
// stačí odkomentovat řádek níže
// lcd.setRot180();
}
void loop(void) {
// porovnání uloženého a aktuálního času,
// při rozdílu větším než 100 ms se provede
// obnovení displeje, čas můžeme nastavit dle potřeby
if (millis()-prepis > 100) {
// následující skupina příkazů
// obnoví obsah OLED displeje
lcd.firstPage();
do {
// funkce vykresli vykreslí žádanou obsah
vykresli();
} while( lcd.nextPage() );
// uložení posledního času obnovení
prepis = millis();
}
// zde je místo pro další příkazy pro Arduino
// volitelná pauza 10 ms pro demonstraci
// vykonání dalších příkazů
delay(10);
}
// funkce vykresli pro nastavení výpisu informací na OLED
void vykresli(void) {
// nastavení písma, toto písmo umožní vypsat
// přibližně 15x4 znaků
lcd.setFont(u8g_font_unifont);
// nastavení pozice výpisu v pixelech
// souřadnice jsou ve tvaru x, y
// souřadnice 0, 0 je v levém horní rohu
// OLED displeje, maximum je 128, 64
lcd.setPrintPos(0, 10);
// výpis textu na zadanou souřadnici
lcd.print("Arduino navody");
lcd.setPrintPos(0, 25);
lcd.print("arduino-shop.cz");
lcd.setPrintPos(0, 40);
lcd.print("Cas od zapnuti:");
lcd.setPrintPos(40, 55);
lcd.print(millis()/1000);
lcd.print(" vterin");
}
Kód: Vybrat vše
#include <OneWire.h>
#include <DallasTemperature.h>
#define BUS_PIN 4
#define ADR_SIZE 8 //byte
//vytvoreni instanci
OneWire Bus(BUS_PIN);
DallasTemperature Sensors(&Bus);
DeviceAddress DevAdr;
uint8_t nSensors = 0;
void printAddress(DeviceAddress devAdr, uint8_t idx);
void getTemp();
void printAddress(DeviceAddress devAdr, uint8_t idx)
{
Serial.print("Adresa senzoru ");
Serial.print(idx + 1);
Serial.print(": ");
for (uint8_t i = 0; i < ADR_SIZE; i++)
{
if (devAdr[i] < 16) Serial.print("0");
Serial.print(devAdr[i], HEX);
}
Serial.println();
}
void getTemp(){
Sensors.requestTemperatures();
for (uint8_t i = 0; i < nSensors; i++)
{
Serial.print("Teplota cidla ");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(Sensors.getTempCByIndex(i));
}
Serial.println("****************************");
delay(2000);
}
void setup(void) {
Serial.begin(9600);
Sensors.begin();
//pocet senzoru
nSensors = Sensors.getDeviceCount();
//vypis poctu senzoru
Serial.print("Pocet senzoru: ");
Serial.println(nSensors);
//vypis adres senzoru
for (uint8_t i = 0; i < nSensors; i++)
{
Sensors.getAddress(DevAdr, i);
printAddress(DevAdr, i);
}
Serial.println("****************************");
}
void loop(void) {
//cteni teploty
getTemp();
}
?
Re: Arduino měření teploty
Napsal: 8. 1. 2021, 8:23
od Modros
Ano to jsou ty programy
Re: Arduino měření teploty
Napsal: 8. 1. 2021, 9:34
od Cjuz
Zatím bez komentáře bo není čas, ale tohle jsem slepil nedávno za 5 minut z šuplíkových zásob abych si mohl měřit teplotu a vlhkost na půdě.
měří a ukazuje aktuální min a max
Prozkoumej jako inspiraci, třeba se chytíš a případně se pak na to co chceš, mrkneme
Kód: Vybrat vše
// LCD displej
// navody.arduino-shop.cz
/*
* LCD RS pin na digital pin 3
* LCD Enable pin na digital pin 4
* LCD D4 pin na digital pin 5
* LCD D5 pin na digital pin 8
* LCD D6 pin na digital pin 9
* LCD D7 pin na digital pin 10
* LCD R/W pin na GND
* LCD VSS pin na GND
* LCD VCC pin na 5V
* LCD V0 pin přes odpor na zem
* (kontrast)
*/
// knihovna pro LCD displej
#include <LiquidCrystal.h>
// inicializace pinu, lze vyměnit za jiné volné
LiquidCrystal lcd(3, 4, 5, 8, 9, 10);
#include <SimpleDHT.h>
int pinDHT22 = 13;
SimpleDHT22 dht22;
float temp_max = 0;
float temp_min = 0;
float humi_max = 0;
float humi_min = 0;
float temperature = 0;
float humidity = 0;
int err = SimpleDHTErrSuccess;
void setup() {
lcd.begin(20, 4);
delay(100);
Serial.begin(9600);
// temp_max = temperature;
temp_min = 100;
humi_min = 100;
// humi_max = humidity;
}
void loop() {
if ((err = dht22.read2(pinDHT22, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT22 failed, err="); Serial.println(err);delay(1000);
return;
}
Serial.print((float)temperature);
Serial.print(",");
Serial.println((float)humidity);
if (temp_max < temperature){
temp_max = temperature;
}
if (temp_min > temperature){
temp_min = temperature;
}
if (humi_min > humidity){
humi_min= humidity;
}
if (humi_max < humidity){
humi_max = humidity;
}
lcd.clear();
lcd.setCursor ( 0, 0 );
lcd.print("Teplota ");
lcd.print((float)temperature, 1);
lcd.print("C");
lcd.setCursor ( 15, 0 );
lcd.print((float)temp_max, 1);
lcd.setCursor ( 15, 1 );
lcd.print((float)temp_min, 1);
lcd.setCursor ( 0, 2 );
lcd.print("Vlhkost ");
lcd.print((float)humidity, 1);
lcd.print("%");
lcd.setCursor ( 15, 2 );
lcd.print((float)humi_max, 1);
lcd.setCursor ( 15, 3 );
lcd.print((float)humi_min, 1);
// DHT22 sampling rate is 0.5HZ.
delay(1000);
}
Re: Arduino měření teploty
Napsal: 8. 1. 2021, 9:52
od Modros
Cjuz píše: ↑8. 1. 2021, 9:34
Zatím bez komentáře bo není čas, ale tohle jsem slepil nedávno za 5 minut z šuplíkových zásob abych si mohl měřit teplotu a vlhkost na půdě.
měří a ukazuje aktuální min a max
Prozkoumej jako inspiraci, třeba se chytíš a případně se pak na to co chceš, mrkneme
Kód: Vybrat vše
// LCD displej
// navody.arduino-shop.cz
/*
* LCD RS pin na digital pin 3
* LCD Enable pin na digital pin 4
* LCD D4 pin na digital pin 5
* LCD D5 pin na digital pin 8
* LCD D6 pin na digital pin 9
* LCD D7 pin na digital pin 10
* LCD R/W pin na GND
* LCD VSS pin na GND
* LCD VCC pin na 5V
* LCD V0 pin přes odpor na zem
* (kontrast)
*/
// knihovna pro LCD displej
#include <LiquidCrystal.h>
// inicializace pinu, lze vyměnit za jiné volné
LiquidCrystal lcd(3, 4, 5, 8, 9, 10);
#include <SimpleDHT.h>
int pinDHT22 = 13;
SimpleDHT22 dht22;
float temp_max = 0;
float temp_min = 0;
float humi_max = 0;
float humi_min = 0;
float temperature = 0;
float humidity = 0;
int err = SimpleDHTErrSuccess;
void setup() {
lcd.begin(20, 4);
delay(100);
Serial.begin(9600);
// temp_max = temperature;
temp_min = 100;
humi_min = 100;
// humi_max = humidity;
}
void loop() {
if ((err = dht22.read2(pinDHT22, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT22 failed, err="); Serial.println(err);delay(1000);
return;
}
Serial.print((float)temperature);
Serial.print(",");
Serial.println((float)humidity);
if (temp_max < temperature){
temp_max = temperature;
}
if (temp_min > temperature){
temp_min = temperature;
}
if (humi_min > humidity){
humi_min= humidity;
}
if (humi_max < humidity){
humi_max = humidity;
}
lcd.clear();
lcd.setCursor ( 0, 0 );
lcd.print("Teplota ");
lcd.print((float)temperature, 1);
lcd.print("C");
lcd.setCursor ( 15, 0 );
lcd.print((float)temp_max, 1);
lcd.setCursor ( 15, 1 );
lcd.print((float)temp_min, 1);
lcd.setCursor ( 0, 2 );
lcd.print("Vlhkost ");
lcd.print((float)humidity, 1);
lcd.print("%");
lcd.setCursor ( 15, 2 );
lcd.print((float)humi_max, 1);
lcd.setCursor ( 15, 3 );
lcd.print((float)humi_min, 1);
// DHT22 sampling rate is 0.5HZ.
delay(1000);
}
ahoj děkuju.
Re: Arduino měření teploty
Napsal: 8. 1. 2021, 10:26
od Thomeeque
Modros píše: ↑8. 1. 2021, 8:23
Ano to jsou ty programy
Hmm, možná nějak takto (doufám, že jsem jakž takž pochopil tu lcd do-while
smyčku):
Kód: Vybrat vše
#include <OneWire.h>
#include <DallasTemperature.h>
#include "U8glib.h"
#define PIN_LCD_EN 13
#define PIN_LCD_RW 12
#define PIN_LCD_RS 11
#define SENSOR_BUS_PIN 4
#define ALARM_PIN 5
#define ALARM_TEMPERATURE 50.0
OneWire Bus(SENSOR_BUS_PIN);
DallasTemperature Sensors(&Bus);
DeviceAddress DevAdr;
U8GLIB_ST7920_128X64_1X lcd(PIN_LCD_EN, PIN_LCD_RW, PIN_LCD_RS);
uint8_t nSensors = 0;
float temperatures[7]; // for nSensors <= 7
void setup(void) {
pinMode(ALARM_PIN, OUTPUT);
digitalWrite(ALARM_PIN, LOW);
if (lcd.getMode() == U8G_MODE_R3G3B2) {
lcd.setColorIndex(255);
} else if (lcd.getMode() == U8G_MODE_GRAY2BIT) {
lcd.setColorIndex(3);
} else if (lcd.getMode() == U8G_MODE_BW) {
lcd.setColorIndex(1);
}
//lcd.setRot180();
Serial.begin(9600);
Sensors.begin();
nSensors = Sensors.getDeviceCount();
Serial.print("Pocet senzoru: ");
Serial.println(nSensors);
Serial.println("****************************");
}
void loop(void) {
readoutTemperatures();
renderToSerialAndResolveAlarmSignal();
renderToLcd();
delay(1000);
}
void readoutTemperatures(){
Sensors.requestTemperatures();
for (uint8_t i = 0; i < nSensors; i++) {
temperatures[i] = Sensors.getTempCByIndex(i);
}
}
void renderToSerialAndResolveAlarmSignal() {
for (uint8_t i = 0; i < nSensors; i++) {
float temperature = temperatures[i];
boolean alarm = temperature >= ALARM_TEMPERATURE;
Serial.print(getSensorName(i));
Serial.print(": ");
Serial.println(temperature);
if (alarm) {
Serial.println("!!! ALARM !!!");
digitalWrite(ALARM_PIN, HIGH);
}
}
Serial.println("****************************");
}
void renderToLcd() {
lcd.firstPage();
do {
renderToLcdSub();
} while(lcd.nextPage());
}
void renderToLcdSub() {
lcd.setFont(u8g_font_unifont);
for (uint8_t i = 0; i < nSensors; i++) {
float temperature = temperatures[i];
boolean alarm = temperature >= ALARM_TEMPERATURE;
lcd.setPrintPos(0, i * 9);
lcd.print(getSensorName(i));
lcd.print(": ");
lcd.print(temperature);
if (alarm) {
lcd.print(" !!!");
}
}
}
String getSensorName(uint8_t i) {
switch (i) {
case 0: return "Lednice";
case 1: return "Spizirna";
case 2: return "Sklep";
case 3: return "Puda";
case 4: return "Garaz";
case 5: return "Frezka";
case 6: return "Kocour";
default:
return "???";
}
}
Je to nástřel, minimálně ta
renderToLcdSub bude chtít poladit..
Dej vědět, T.
Re: Arduino měření teploty
Napsal: 8. 1. 2021, 10:59
od Modros
Tak to je mazec...nechápu....funguje to....mám teda ted připojene 4 čidla a na serial se ukazoujou 4 a na displayi jen 3 ale zitra udělám komplet 7 čidel a budu testovat...změnil sem unifont na helvR8 a ted mám cca 8 řádků....zatím tisíckrát děkuju
Re: Arduino měření teploty
Napsal: 8. 1. 2021, 11:10
od Modros
Po alarmu který sem nastavil na 25 stupnu se zobrazej vykřičníky u příslušné teploty a dal sem si na pin 5 diodu...zapne jí to...ale po opadnutí teploty už nezhasne.....možná to nechám a dám resetovací tlačítko dokud to nevyresetuju tak to bude řvát
Re: Arduino měření teploty
Napsal: 8. 1. 2021, 11:15
od Thomeeque
Modros píše: ↑8. 1. 2021, 10:59
na serial se ukazoujou 4 a na displayi jen 3
Možná změnit
na
Re: Arduino měření teploty
Napsal: 8. 1. 2021, 11:20
od Thomeeque
Modros píše: ↑8. 1. 2021, 11:10
Po alarmu který sem nastavil na 25 stupnu se zobrazej vykřičníky u příslušné teploty a dal sem si na pin 5 diodu...zapne jí to...ale po opadnutí teploty už nezhasne.....možná to nechám a dám resetovací tlačítko dokud to nevyresetuju tak to bude řvát
Jj, přesně tak jsem to pojal (jakože shození alarmu je na obsluze). Taková improvizace, nijak jsi to nespecifikoval.
Jinak těší mě, že to fachčí, rádo se stalo
Dobrou, T.
Re: Arduino měření teploty
Napsal: 8. 1. 2021, 11:23
od Modros
Thomeeque píše: ↑8. 1. 2021, 11:15
Modros píše: ↑8. 1. 2021, 10:59
na serial se ukazoujou 4 a na displayi jen 3
Možná změnit
na
jasný....nevypisoval se kanál 0 lednice
zatím mockrát děkuju....já s tím mám nervy 4 dny....a ty to uděláš za 10 minut....

Re: Arduino měření teploty
Napsal: 9. 1. 2021, 8:13
od Modros
Ahoj jeste otazka...ted to mam nabastleny na original Uno, pujde tenhle komplet kod na Nano? mam Nano se sroubovacim terminalem a zastavbove by se me to vychazelo lip
Re: Arduino měření teploty
Napsal: 9. 1. 2021, 8:49
od Mex
Já jsem se na tom SW pro tvůj teploměr nijak nepodílel.
Ale Uno a Nano je to samé, jenom na jiném formátu desky. Takže ano, pojede to i na desce Nano.
Re: Arduino měření teploty
Napsal: 9. 1. 2021, 8:57
od Modros
Mex píše: ↑9. 1. 2021, 8:49
Já jsem se na tom SW pro tvůj teploměr nijak nepodílel.
Ale Uno a Nano je to samé, jenom na jiném formátu desky. Takže ano, pojede to i na desce Nano.
dekuji moc.
Re: Arduino měření teploty
Napsal: 9. 1. 2021, 9:33
od Thomeeque
Modros píše: ↑8. 1. 2021, 11:23
jasný....nevypisoval se kanál 0 lednice
Jj, musí se pozicovat levý
spodní roh prvního písmene, já pozicoval horní (display má y=0 nahoře, tak by to taky dávalo smysl).
Modros píše: ↑8. 1. 2021, 11:23
zatím mockrát děkuju....já s tím mám nervy 4 dny....a ty to uděláš za 10 minut....
Ten umí to a ten zas tohle

Ale trvalo mi to trochu dýl, práce s tím displayem je trochu zvláštní, zatím jsem se s něčím takovým nesetkal (mluvím o té do-while smyčce). To je celkem komplikace, jinak by se to dalo napsat o dost jednodušeji.
Teď, když si to čteš, chápeš, jak to funguje? Klidně se zeptej. Určitě je na tom co vylepšovat (aby třeba i z displaye bylo jasné, z kterého senzoru vzešel alarm i potom, co teplota opět klesla atp.).
Zatim, T.