Arduino měření teploty
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
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
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
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();
}
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
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
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);
}
Na konci poznávacího procesu je omyl zcela vyvrácen a my nevíme nic. Zato to víme správně.
ahoj děkuju.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); }
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
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 "???";
}
}
Dej vědět, T.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
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
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
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
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
Možná změnit
Kód: Vybrat vše
lcd.setPrintPos(0, i * 9);
Kód: Vybrat vše
lcd.setPrintPos(0, (i + 1) * 9);
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
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.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
jasný....nevypisoval se kanál 0 ledniceThomeeque píše: ↑8. 1. 2021, 11:15Možná změnit
naKód: Vybrat vše
lcd.setPrintPos(0, i * 9);
Kód: Vybrat vše
lcd.setPrintPos(0, (i + 1) * 9);
zatím mockrát děkuju....já s tím mám nervy 4 dny....a ty to uděláš za 10 minut....
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
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).
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.
Naposledy upravil(a) Thomeeque dne 9. 1. 2021, 9:39, celkem upraveno 1 x.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino