Knihovna RPLCD je velmi intuitivní, protože se snaží emulovat chování standardního terminálu. Zde je přehled nejdůležitějších příkazů pro ovládání displeje LCD2004.
Zobrazují se příspěvky se štítkemLCD. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemLCD. Zobrazit všechny příspěvky
pondělí 11. května 2026
Knihovna RPLCD pro LCD2004 pro Raspberry Pi
středa 9. října 2019
Teploměr & vlhkoměr se spínáním ventilátoru do garáže.
V garáži pozoruji již delší dobu zvýšenou vlhkost. Ta působí zvýšený výskyt koroze na brzdových kotoučích i jiných částech automobilu. Proto jsem se rozhodnul vytvořit nejen dva větrací otvory, ale i podpořit cirkulaci vzduchu pomocí ventilátoru spínaném v okamžiku, kdy vlhkost stoupne.
Použité součástky:
Arduino Nano
DHT 11
Rezistor 10kΩ
LCD 20x4
Relé modul 5V, 4-kanálový
Ventilátor průměr 80 mm; 12V
Zapojení je vlastně úplně jednoduché. DHT11 měří vlhkost (teplota je v podstatě bonus). Pokud vlhkost stoupne, nastavená hanice je 40%, zapne se ventilátor. Hystereze je nastavená tak, aby se ventilátor vypnul při vlhkosti nižší, než 35%.
Využil jsem však dostatku místa na CD displeji a trošku si pohrál s kódem. Je zde zobrazena nejen aktuální teplota a vlhkost, ale i minimální a maximální dosažená hodota vlhkosti a také zda od posledního měření klesá, stoupá, nebo je stálá. Rovněž je zde signalizován stav ventilátoru ON/OFF.
![]() |
| LCD displej |
Výpis kódu:
-------------------------------------------------------------------------------------------------------------------------------
// **************Teploměr a vlhkoměr s DHT11/22 *****************
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
LiquidCrystal_I2C lcd(0x27,20,4);
// nastavení čísla pinu s připojeným DHT senzorem
#define pinDHT 5
// odkomentování správného typu čidla
#define typDHT11 DHT11 // DHT 11
//#define typDHT22 DHT22 // DHT 22 (AM2302)
// inicializace DHT senzoru s nastaveným pinem a typem senzoru
DHT mojeDHT(pinDHT, typDHT11);
int tep;
int vlh;
const int rele_vetrak = 13;
boolean vetrak_toci = false;
int vlh_vyp = 35;
int vlh_zap = 40;
int vlh_stara = 0;
int vlh_max = 0;
int vlh_min = 100;
void setup() {
Serial.begin(9600);
// zapnutí komunikace s teploměrem DHT
mojeDHT.begin();
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("---------------------");
lcd.setCursor(0,1);
lcd.print("| Teplomer a |");
lcd.setCursor(0,2);
lcd.print("| vlhkomer |");
lcd.setCursor(0,3);
lcd.print("---------------------");
delay(5000);
test_ventilatoru();
}
void loop() {
mereni();
//serialovy_vypis();
vypis_lcd();
hystereze_vlhkost();
stav_vlhkosti();
vlhkost_max();
vlhkost_min();
delay(5000); // pauza pro dalsi mereni
}
// funce mereni
void mereni(){
tep = mojeDHT.readTemperature();
vlh = mojeDHT.readHumidity();
}
// funkce vypis serial
void serialovy_vypis(){
if (isnan(tep) || isnan(vlh)) {
Serial.println("Chyba při čtení z DHT senzoru!"); // při chybném čtení vypiš hlášku
} else { // pokud jsou hodnoty v pořádku, vypiš je po sériové lince
Serial.print("Teplota: ");
Serial.print(tep);
Serial.print(" stupnu Celsia, ");
Serial.print("vlhkost: ");
Serial.print(vlh);
Serial.println(" %");
}
}
void hystereze_vlhkost() {
if ((vlh < vlh_vyp) && (vetrak_toci))
{
digitalWrite(rele_vetrak, LOW);
vetrak_toci = false;
}
else if ((vlh > vlh_zap) && (!vetrak_toci))
{
digitalWrite(rele_vetrak, HIGH);
vetrak_toci = true;
}
if (vetrak_toci == true)
{
lcd.setCursor(17,3);
lcd.print(" ON");
}
else {
lcd.setCursor(17,3);
lcd.print("OFF");
}
}
void vypis_lcd(){
lcd.setCursor(0,0);
lcd.print("Teplota:");
lcd.setCursor(16,0);
lcd.print(tep);
lcd.print((char)223); // symbol "°" (stupne)
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Vlhkost:");
lcd.setCursor(17,1);
lcd.print(vlh);
lcd.print("%");
lcd.setCursor(0,3);
lcd.print("Ventilator:");
}
void stav_vlhkosti(){
if(vlh_stara == 0){
lcd.setCursor(14,1);
lcd.print(" ");
}
else if(vlh_stara > vlh){
lcd.setCursor(9,1);
lcd.print("klesa ");
}
else if(vlh_stara < vlh){
lcd.setCursor(9,1);
lcd.print("stoupa");
}
else if(vlh_stara == vlh){
lcd.setCursor(9,1);
lcd.print("stala ");
}
vlh_stara = vlh;
}
void vlhkost_max(){
if(vlh > vlh_max){
vlh_max = vlh;
lcd.setCursor(2,2);
lcd.print("Max:");
lcd.setCursor(7,2);
lcd.print(vlh_max);
lcd.print("%");
}
}
void vlhkost_min(){
if(vlh < vlh_min){
vlh_min = vlh;
lcd.setCursor(12,2);
lcd.print("Min:");
lcd.setCursor(17,2);
lcd.print(vlh_min);
lcd.print("%");
}
}
void test_ventilatoru(){
digitalWrite(rele_vetrak, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Test ventilatoru ");
for (int i=1; i<19; i++){
lcd.setCursor(i,2);
lcd.print("|");
delay(250);
}
digitalWrite(rele_vetrak, LOW);
delay(1000);
lcd.clear();
delay(1000);
}
#include "DHT.h"
LiquidCrystal_I2C lcd(0x27,20,4);
// nastavení čísla pinu s připojeným DHT senzorem
#define pinDHT 5
// odkomentování správného typu čidla
#define typDHT11 DHT11 // DHT 11
//#define typDHT22 DHT22 // DHT 22 (AM2302)
// inicializace DHT senzoru s nastaveným pinem a typem senzoru
DHT mojeDHT(pinDHT, typDHT11);
int tep;
int vlh;
const int rele_vetrak = 13;
boolean vetrak_toci = false;
int vlh_vyp = 35;
int vlh_zap = 40;
int vlh_stara = 0;
int vlh_max = 0;
int vlh_min = 100;
void setup() {
Serial.begin(9600);
// zapnutí komunikace s teploměrem DHT
mojeDHT.begin();
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("---------------------");
lcd.setCursor(0,1);
lcd.print("| Teplomer a |");
lcd.setCursor(0,2);
lcd.print("| vlhkomer |");
lcd.setCursor(0,3);
lcd.print("---------------------");
delay(5000);
test_ventilatoru();
}
void loop() {
mereni();
//serialovy_vypis();
vypis_lcd();
hystereze_vlhkost();
stav_vlhkosti();
vlhkost_max();
vlhkost_min();
delay(5000); // pauza pro dalsi mereni
}
// funce mereni
void mereni(){
tep = mojeDHT.readTemperature();
vlh = mojeDHT.readHumidity();
}
// funkce vypis serial
void serialovy_vypis(){
if (isnan(tep) || isnan(vlh)) {
Serial.println("Chyba při čtení z DHT senzoru!"); // při chybném čtení vypiš hlášku
} else { // pokud jsou hodnoty v pořádku, vypiš je po sériové lince
Serial.print("Teplota: ");
Serial.print(tep);
Serial.print(" stupnu Celsia, ");
Serial.print("vlhkost: ");
Serial.print(vlh);
Serial.println(" %");
}
}
void hystereze_vlhkost() {
if ((vlh < vlh_vyp) && (vetrak_toci))
{
digitalWrite(rele_vetrak, LOW);
vetrak_toci = false;
}
else if ((vlh > vlh_zap) && (!vetrak_toci))
{
digitalWrite(rele_vetrak, HIGH);
vetrak_toci = true;
}
if (vetrak_toci == true)
{
lcd.setCursor(17,3);
lcd.print(" ON");
}
else {
lcd.setCursor(17,3);
lcd.print("OFF");
}
}
void vypis_lcd(){
lcd.setCursor(0,0);
lcd.print("Teplota:");
lcd.setCursor(16,0);
lcd.print(tep);
lcd.print((char)223); // symbol "°" (stupne)
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Vlhkost:");
lcd.setCursor(17,1);
lcd.print(vlh);
lcd.print("%");
lcd.setCursor(0,3);
lcd.print("Ventilator:");
}
void stav_vlhkosti(){
if(vlh_stara == 0){
lcd.setCursor(14,1);
lcd.print(" ");
}
else if(vlh_stara > vlh){
lcd.setCursor(9,1);
lcd.print("klesa ");
}
else if(vlh_stara < vlh){
lcd.setCursor(9,1);
lcd.print("stoupa");
}
else if(vlh_stara == vlh){
lcd.setCursor(9,1);
lcd.print("stala ");
}
vlh_stara = vlh;
}
void vlhkost_max(){
if(vlh > vlh_max){
vlh_max = vlh;
lcd.setCursor(2,2);
lcd.print("Max:");
lcd.setCursor(7,2);
lcd.print(vlh_max);
lcd.print("%");
}
}
void vlhkost_min(){
if(vlh < vlh_min){
vlh_min = vlh;
lcd.setCursor(12,2);
lcd.print("Min:");
lcd.setCursor(17,2);
lcd.print(vlh_min);
lcd.print("%");
}
}
void test_ventilatoru(){
digitalWrite(rele_vetrak, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Test ventilatoru ");
for (int i=1; i<19; i++){
lcd.setCursor(i,2);
lcd.print("|");
delay(250);
}
digitalWrite(rele_vetrak, LOW);
delay(1000);
lcd.clear();
delay(1000);
}
--------------------------------------------------------------
V části LOOP používám jen funkce, přijde mi tak celý kód přehlednější.
![]() | |||||
| Jednoduché schéma zapojení. (Chybí tu rezistor 10kΩ zapojený mezi datovým vodičem na 5 a napájením 5V na DHT11). |
Postupem času jsem zařízení několikrát aktualizoval nyní (9/20)už j v provozu verze 4 s dvema dht senzory, webovým serverem, ovládáním otáček ventilátoru pomocí PWM a chlazením, protože teplo z Arduina a ethernetshieldu ovlivňovalo měření teploty i vlhkosti. Bude li čas, zaktualizuji i tady.
Knihovny:
DHT-sensor-library.zip
LiquidCrystal_I2C-1.1.2.zip
Knihovny:
DHT-sensor-library.zip
LiquidCrystal_I2C-1.1.2.zip
čtvrtek 5. dubna 2018
Pokojový termostat s arduinem, ovládaný Telegramem
Termostat je ovládaný přes Telegram.
Smart Thermostat Connect your home heater to Internet and chat with it via Telegram!
A jeste nejaky Telegram a arduino,
sobota 24. března 2018
úterý 19. ledna 2016
LCD displej 1602 a 2004 na I2C sběrnici
Jak připojit LCD k Arduinu na I2C sběrnici? Stačí čtyři vodiče.
LCD displej 1602 a 2004 na I2C sběrnici
Přihlásit se k odběru:
Příspěvky (Atom)





