Vlhkoměr se vzdálenými senzory

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Vlhkoměr se vzdálenými senzory

Příspěvek od KamilV » 21 lis 2019, 09:26

Trápí nás v bytě vzdušná vlhkost. Do krizových místností jsem si dal NANO s DHT22 a 433 Mhz.
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("% ");
  }
}

KarelBrno
Příspěvky: 40
Registrován: 05 kvě 2019, 15:12
Reputation: 0

Re: Vlhkoměr se vzdálenými senzory

Příspěvek od KarelBrno » 21 lis 2019, 09:48

Tak v prvé řadě bych vyhodil ty 433 RF moduly, to jsou hrozné šmejdy, nemám s nima zrovna dobré zkušenosti :) Za stejné prachy máš třeba z číny dvojici nRF24, což je úplně jiná liga.

Jinak koukám, že
#define PIN_LCD_D6 3
#define PIN_LCD_D7 2

Piny 2 a 3 jsou RX a TX sériové linky, tak jestli tohle nemůže být ten problém? Nebo to tak máš schválně?

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Vlhkoměr se vzdálenými senzory

Příspěvek od KamilV » 21 lis 2019, 09:56

Jsou, proto se mi válely v šuplíku a toto je asi jediná aplikace, kde se je nebojím použít :) Jinde právě používám nRD24 nebo HC-12. Bylo mi líto je úplně vyhodit.

Seriová linka IMHO jede na pinech 0 a 1 (a ty mám volné, abych mohl pohodlně aktualizovat přes USB). Navíc LCD funguje správně i bez otevření Serial Monitoru...

KarelBrno
Příspěvky: 40
Registrován: 05 kvě 2019, 15:12
Reputation: 0

Re: Vlhkoměr se vzdálenými senzory

Příspěvek od KarelBrno » 21 lis 2019, 10:15

Možná jsem z toho už doblbnutý a píšu nesmysly (nemůžu teď kouknout do zdrojáků a ověřit si to), ale není to tak, že RX = D0 = 2, TX = D1 = 3? Resp. že pin 2 a D2, nebo 3 a D3 není totéž?

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Vlhkoměr se vzdálenými senzory

Příspěvek od KamilV » 21 lis 2019, 10:33


KarelBrno
Příspěvky: 40
Registrován: 05 kvě 2019, 15:12
Reputation: 0

Re: Vlhkoměr se vzdálenými senzory

Příspěvek od KarelBrno » 21 lis 2019, 10:42

To sice ano, ale
http://www.learningaboutelectronics.com ... pinout.php

Podle mě pokud máš PIN_LCD_D6 a PIN_LCD_D7 zadrátován na piny označené na UNO desce jako 2 a 3, měly by to být v programu piny D2 a D3, ne?

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Vlhkoměr se vzdálenými senzory

Příspěvek od KamilV » 21 lis 2019, 11:00

No já nevím, vždycky čísluju piny v kódu tak jak jsou na UNO desce a nikdy jsem s tím neměl problém.

Každopádně zkusil jsem každý Serial.print() obalit do if (Serial), to nepomohlo.
Tak jsem zkusil všechny Serial.print() zakomentovat a najednou to samozřejmě celé jede.

Tedy, pokud se dělá print() na Serial, který nikam nevede, tak tam něco zhaprovalo. Což je minimálně zajímavé, nikdy před tím jsem se s tím nesetkal, Serial.print() běžně v kódu nechávám, přišlo mi vždy praktické mít to jako "diagnostiku", když se někde něco rozbije, připojím USB a vidím. Hned v setup() jsem si posílal verzi a datum buildu...

KarelBrno
Příspěvky: 40
Registrován: 05 kvě 2019, 15:12
Reputation: 0

Re: Vlhkoměr se vzdálenými senzory

Příspěvek od KarelBrno » 21 lis 2019, 11:48

A když zkusíš definice těch pinů přepsat do tvaru Dxx misto samotného čísla, tak se to chová pořád stejně?

KarelBrno
Příspěvky: 40
Registrován: 05 kvě 2019, 15:12
Reputation: 0

Re: Vlhkoměr se vzdálenými senzory

Příspěvek od KarelBrno » 21 lis 2019, 12:41

Tak jsem asi vážně doblbý, sorry :) Asi si to už celé pletu s ESP, kde se zápis Dxx používá. Tady na Arduinu ne (možná až na analog Axx), takže beru vše zpět, máš to dobře :)

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Vlhkoměr se vzdálenými senzory

Příspěvek od ondraN » 22 lis 2019, 07:10

Na podobnou věc jsem už narazil a pomohlo Tx a Rx dát přes vnější rezistory (2k2) na 5V.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 12 hostů