A mai nappal tuti biztos szintet léptem, ami a programozást illeti, mert 2,5 óra alatt megcsináltam a hőmérséklet- és páratartalomszenzor a ledekkel együtt. Ebben benne volt kb. egy óra guglizás árnyékra vetődés miatt, mert ugyan volt egy olyan sejtésem már legutóbb is, hogy a breadboard-on nem véletlenül van a szélső sínnél középen megszakítva a folyamatos vonal, de ma bebizonyítottam :D
Ami elindított a töprengés útján, az a DHT11-es által mutatott -999 C és -999.0 páratartalom volt, és mikor ML-t is megkértem, hogy adjon ötleteket, mondta, hogy valamiért nem érzékeli a szenzor a dolgokat, mellesleg a bekötött ledeknek is már illene világítaniuk.
Régi vicc, miszerint a hullát legbiztosabban a google második oldalán lehet elrejteni, el lehet képzelni, hogy mennyire lehettem már tanácstalan, ha már ott is jártam, mikor végre fogtam a vörösen villogó jelet az agyamban, és próbaképpen az egyik ledet átraktam arra a részre, ahol még tarthatott a föld és az 5V. Akkor világítottak, így levontam azt az elég egyértelmű következtetést, hogy át kell vezetnem a túloldalra ezt a két tényezőt, naná, hogy technikailag meg is oldódott a ledkérdés - ezt mutatja a két rövid vonal a breadboard kb. közepén.
Sajnos nem sikerült átvezetékeznem kevésbé zavarosra, mert egyszerűen nem ette meg az új portokat az LCD, úgyhogy kénytelen voltam a legutóbbi rajzot használni, a három piros színű led viszont a rajzolóprogram miatt van, nem találtam zöld és kék ledeket :(
A hőmérőhöz megint library-t kellett letölteni, és a tegnapi (tegnapelőtti?) LCD-s kódokhoz fűztem hozzá a neten talált megfejtéseket. Kivételesen ezt az oldalt használtam, örömmel látom, hogy már ki tudok lépni az Adafruit megszokott szövegkörnyezetéből, és megértem azt is, amit máshol olvasok :)
Szóval hozzá kellett adni a dht-hez tartozó library-t (#include), aztán jön a példányosítás a dupla dht-vel, majd a pin, amire a szenzort kötöttem.
Ehhez írtam még be azt, hogy a ledeket melyik lábakon lehet találni (jelen esetben az analóg portok), igaz, ezt nem elsőre, mert már eltévedtem a fejezetek között, és simán beírtam a setup-ba...holott oda az kellett, hogy azokat a portokat írni szeretném (output).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <LiquidCrystal.h> #include "dht.h" const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 11, d7 = 12; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); dht DHT; #define DHT11_PIN 7 int piros = A2; int zold = A1; int kek = A0; void setup() { lcd.begin(16, 2); pinMode(9, OUTPUT); analogWrite(9, 105); pinMode(piros, OUTPUT); pinMode(zold, OUTPUT); pinMode(kek, OUTPUT); } |
Röpke megjegyzés a szenzorhoz, hogy ehhez az egy típushoz is találtam úgy három bekötési verziót, de sima digitális portot használ, és a képen balról jobbra a lábak sorrendben az adat, az 5V és a föld.
A loop-ban a serialport-ra már nem volt szükség, a helyére írtam egy az egyben a kódot, amit találtam, viszont a legvégén a delay-t 1000-ről 2000-re kellett emelni, mert 1000-nél nem tudta elég gyorsan olvasni az adatokat a szenzorról, és felváltva ugrált -999 és a helyes hőmérséklet között.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void loop() { delay(1000); int chk = DHT.read11(DHT11_PIN); lcd.setCursor(0,0); lcd.print("Temp: "); lcd.print(DHT.temperature); lcd.print((char)223); lcd.print("C"); lcd.setCursor(0,1); lcd.print("Humidity: "); lcd.print(DHT.humidity); lcd.print("%"); delay(2000); |
A legutolsó részlet pedig az volt, hogy kikeressem, hogyan tudom a ledeket a kiír hőmérséklet alapján bekapcsolni. A terv az volt, hogy ha meleg van, a piros világítson, ha hideg, akkor a kék, ha pedig az ideális hőfokot méri, akkor a zöld. Szerencsére nem én vagyok az első ember, aki ezt kigondolta, így csak át kellett variálni a számokat, és ahhoz, hogy tudja, hol keresse a hőmérsékletet, a t-t határoztam még meg. Itt is volt egy kis töprengés, mert nem jöttem rá elsőre, hogy pontosan melyik lesz az igazi, de ML kedvesen rámutatott a fára, amit már nem láttam az erdőtől :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
float t = DHT.temperature; if (t<=21){ digitalWrite(kek, HIGH); digitalWrite(piros, LOW); digitalWrite(zold, LOW); } else if (t>21 && t<26){ digitalWrite(zold, HIGH); digitalWrite(kek, LOW); digitalWrite(piros, LOW); } else if (t>=26){ digitalWrite(piros, HIGH); digitalWrite(kek, LOW); digitalWrite(zold, LOW); } |
A végeredmény ismételten csodálatos lett, és nem azért, mert elfogult vagyok, hanem mert tényleg az :)
A végleges program itt taláható.
E.