V chodbě mám UNO s LCD displayem a červenou ledkou. Měření z jednotlivých místností si posílám přes 433 Mhz a zobrazuju na LCD. Když v některé z místností klesne nebo stoupne vlhkost mimo ideální mez, rožne se červená ledka (takový tichý alarm, který jen upozorňuje, že je potřeba větrat).
Na 433 Mhz používám tyto moduly: https://navody.arduino-shop.cz/navody-k ... 3-mhz.html
Nejsou sice moc dobré, ale měl jsem jich pár v šuplíku z dřívějška a na ty malé vzdálenosti mi stačí, celé to měl být projektík na půl dne z toho, co se doma našlo
Objevila se mi ale jedna záludnost. To UNO má na sobě 433 Mhz receiver, LCD a ledku. Celé to funguje jen a pouze za předpokladu, že mám v Arduino IDE otevřený Serial Monitor. Testoval jsem to několikrát, když Serial Monitor neotevřu, tak to nefunguje, když ho otevřu, tak to fungovat začne, když ho zavřu, fungovat to přestane. Nenapadá mě, co by mohl Serial Monitor ovlivňovat a hlavně bych čekal, že UNO ani nemůže tušit, že je Serial Monitor otevřený nebo ne. Vždyť z UNO odchází data po serialu a je mu jedno, jestli někdo na druhé straně naslouchá, ne?
Docela obtížně se to ladí, protože když si chci něco vypsat na Serial Monitor, tak to samozřejmě funguje. Na UNO ale bliká built-in ledka RX, takže radio asi přijme. Display ale u všech senzorů hlásí "Cekam na senzor", tzn. že v naměřené hodnotě zůstane 0. Takže buď se nepřijala msg, nebo selhalo její parsování, nebo její konverze do pole. Nic z toho mi ale nedává smysl, proč by mělo být závislé na otevřeném Serial Monitoru...
Kód UNO:
Kód: Vybrat vše
#include <LiquidCrystal.h>
#include <VirtualWire.h>
#define PIN_RADIO_RX 7
#define PIN_LCD_RS 12
#define PIN_LCD_E 8
#define PIN_LCD_D4 5
#define PIN_LCD_D5 4
#define PIN_LCD_D6 3
#define PIN_LCD_D7 2
#define PIN_LED_ALARM 6
#define SENZOR_LOZNICE 1
#define SENZOR_KUCHYNE 2
#define SENZOR_PRACOVNA 3
#define SENZOR_OBYVAK 4
// do techto poli ukladam namerene hodnoty jednotlivych DHT22
float tep[5];
float vlh[5];
// tady mi jen rotuje rozlisovac pro zobrazeni na LCD
byte bview = 1;
uint8_t msg[VW_MAX_MESSAGE_LEN];
LiquidCrystal lcd(PIN_LCD_RS, PIN_LCD_E, PIN_LCD_D4, PIN_LCD_D5, PIN_LCD_D6, PIN_LCD_D7);
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("### Vlhkomer ###");
vw_set_ptt_inverted(true);
vw_setup(1000);
vw_set_rx_pin(PIN_RADIO_RX);
vw_rx_start();
tep[SENZOR_LOZNICE] = 0.00; vlh[SENZOR_LOZNICE] = 0.00;
tep[SENZOR_KUCHYNE] = 0.00; vlh[SENZOR_KUCHYNE] = 0.00;
tep[SENZOR_PRACOVNA] = 0.00; vlh[SENZOR_PRACOVNA] = 0.00;
tep[SENZOR_OBYVAK] = 0.00; vlh[SENZOR_OBYVAK] = 0.00;
pinMode(PIN_LED_ALARM, OUTPUT);
digitalWrite(PIN_LED_ALARM, LOW);
delay(2000);
}
void loop() {
if (vw_get_message(msg, VW_MAX_MESSAGE_LEN)) {
for (int i = 0; i < VW_MAX_MESSAGE_LEN; i++) {
Serial.print((char)msg[i]);
}
Serial.println("");
// msg z 433 MHz mam ve tvaru ID_SENZORU|TEPLOTA|VLHKOST
char* id = strtok(msg, "|");
char* ctep = strtok(NULL, "|");
char* cvlh = strtok(NULL, "|");
Serial.print("Senzor: ");
Serial.print(id);
Serial.print(", teplota: ");
Serial.print(ctep);
Serial.print(", vlhkost: ");
Serial.print(cvlh);
Serial.println("");
tep[atoi(id)] = atof(ctep);
vlh[atoi(id)] = atof(cvlh);
}
if (millis() % 5000 == 0) {
view(bview);
bview += 1;
if (bview > 4) {
bview = 1;
}
// "alarm" rozinam, kdyz opustim idealni mez, v kazde mistnosti muze byt jina (napr. v kuchyni se vari a muze se tam objevit vyssi vlhkost)
digitalWrite(PIN_LED_ALARM, LOW);
if (vlh[SENZOR_LOZNICE] > 0 && (vlh[SENZOR_LOZNICE] < 40.00 || vlh[SENZOR_LOZNICE] > 60.00)) {
digitalWrite(PIN_LED_ALARM, HIGH);
}
else if (vlh[SENZOR_KUCHYNE] > 0 && (vlh[SENZOR_KUCHYNE] < 40.00 || vlh[SENZOR_KUCHYNE] > 80.00)) {
digitalWrite(PIN_LED_ALARM, HIGH);
}
else if (vlh[SENZOR_PRACOVNA] > 0 && (vlh[SENZOR_PRACOVNA] < 40.00 || vlh[SENZOR_PRACOVNA] > 50.00)) {
digitalWrite(PIN_LED_ALARM, HIGH);
}
else if (vlh[SENZOR_OBYVAK] > 0 && (vlh[SENZOR_OBYVAK] < 40.00 || vlh[SENZOR_OBYVAK] > 60.00)) {
digitalWrite(PIN_LED_ALARM, HIGH);
}
}
}
void view(byte tsenzor) {
lcd.setCursor(0, 0);
if (tsenzor == SENZOR_LOZNICE) {
lcd.print("### LOZNICE ####");
}
else if (tsenzor == SENZOR_KUCHYNE) {
lcd.print("### KUCHYNE ####");
}
else if (tsenzor == SENZOR_PRACOVNA) {
lcd.print("### PRACOVNA ###");
}
else if (tsenzor == SENZOR_OBYVAK) {
lcd.print("#### OBYVAK ####");
}
else {
lcd.print("###### _ #######");
}
lcd.setCursor(0, 1);
if (tep[tsenzor] == 0) {
lcd.print("Cekam na senzor ");
}
else {
lcd.print(tep[tsenzor]);
lcd.setCursor(5, 1);
lcd.print(" C / ");
lcd.setCursor(10, 1);
lcd.print(vlh[tsenzor]);
lcd.setCursor(15, 1);
lcd.print("% ");
}
}