samozavlažovací systém by noobie - problémy, kam se podíváš

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.
MaroNeumiProgramovat
Příspěvky: 7
Registrován: 26 zář 2019, 20:20
Reputation: 0

samozavlažovací systém by noobie - problémy, kam se podíváš

Příspěvek od MaroNeumiProgramovat » 26 zář 2019, 20:37

(pro netrpělivé a ty, kteří mají málo času, po "Dobrý den" prosím číst až od 3. odstavce, děkuji. :) )

Dobrý den,
na úvod řeknu, že jsem začátečník okolo elektrotechniky (...teda, kdysi jsem měl voltíka, jestli se to počítá :) ) a co se týče programování...no, myslím si, že můj nick to vystihuje docela dobře. Ale než otočíte oči vsloup a kliknete na šipku "ZPĚT", řeknu rychle, že základy programování ze střední a vysoké stále mám a nějaké programátorské evergreeny typu "Ahoj světe!" po dnech a nocích úmorného programování jsem schopný stvořit. No a nechybí mi nadšení a touha se něčemu novému naučit, která u nového koníčku je vždy důležitá :)

Abych ale vysvětlil proč píšu - jako spousta lidí jsem si vymyslel projekt, který se mi zdá užitečný a zároveň i ne nemožný naprogramovat. Jedná se o samozalévací systém. Nějakou základní kostru první verze programu jsem si vymyslel a začal po malých částech programovat...Bohužel, mé začátečnické znalosti mě zastavily poměrně záhy. Sedím nad tímhle poměrně dlouho a protože doopravdy nevím už kudy kam, tak jsem spolkl všechnu svou pýchu a rozhodl se, že se zeptám Vás - zkušenějších a moudřejších.

Bude se jednat o samozavlažovací systém, kde bude celkově 5 rostlin- všechny budou mít svůj vlhkoměr v hlíně. Ze začátku vše testuju ale pouze na 1 - 2 rostlinách, kde již mám zastrčené senzory vlhkosti v půdě. Z nějakého předchozího testování vím, že na nějakou konkrétní hodnotu se nedá spolehnout a proto chci počítat nějakou průměrnou hodnotu všech truhlíků. Pokud bude překročena určitá průměrná hodnota, program bude pokračovat dál...

Konktrétní problém se jedná v tom, že jsem si vytvořil return funkci (zjistiVlhkost, viz. níže přiložená část kódu), která mi načítá během zadaného časového úseku v určitých intervalech hodnotu vlhkosti z jednoho vlhkoměru. Return je průměr naměřených hodnot. Funkce funguje ok, ale pouze pro jeden vlhkoměr. Pokud mám zapojené na arduinu vlhkoměry dva, tak první se změrí v pohodě (rozsah se pohybuje cca od 200 - 1000), ale druhý už naměří hodnoty, které ne, že jsou odchýlené- jsou úplně mimo. A taky se nemění v čase. Hodnoty se pobybují od 8 - 18 a výše nejdou ani po několika dnech.

Má otázka zní následovně. Co dělám špatně, že arduino mi nedokáže změřit dvě najednou zapojená čidla? Předem děkuji za jakoukoliv reakci. Přeji hezký den
P.S. omlouvám se za tu roztahanost textu, je to holt můj styl vyjadřování se na papíře :)

Ještě pár poznámek:
- napájení vlhkoměrů řeším pomocí digitálních pinů 2 a 4, místo 3.3V, protože nechci aby jely nonstop a tím bych zkracoval jejich životnost. Vždy jen zapnu na změření a opět je vypínám.
- zjisťuji analogovou hodnotu vlhkoměru
- nemyslím si, že by problém by ve funkci, spíš ve špatném zapojení vlhkoměrů na arduino. Mohl bych je zapojit na 3.3V, nicméně nevím, jak bych je vypnul aby nejely nonstop, popřípadě jak se v programu adresovat na konkrétní vlhkoměr.
- jsem začátečník, ale rozhodně nehodlám s tím seknout, protože mi někdo na netu řekne ať to udělám, když nic nevím, tak prosím na to myslete při tvorby odpovědi :-)
- o vadné vlhkoměry se nejedná, dohromady jich mám už doma 5 ks a samostatně fungujou všechny OK
arduino.png

Kód: Vybrat vše

void setup() {
  Serial.begin(9600);
  pinMode(vlhA0, INPUT);
  pinMode(vlhA1, INPUT);
  pinMode(vlh0VCC, OUTPUT);
  pinMode(vlh1VCC, OUTPUT);
  digitalWrite(vlh0VCC, LOW);
  digitalWrite(vlh1VCC, LOW);
}

//Kód funkce
int zjistiVlhkost(int vlhkomerVcc, int vlhkomerAnalog, int interval, int pocetOpak){
  int opak = 0;                                        
  long int prubeznaHodnota = 0;
  int prumernaHodnota = 0;
  while(opak != pocetOpak){                             
      digitalWrite(vlhkomerVcc, HIGH);                  
      int analog = analogRead(vlhkomerAnalog);          
      digitalWrite(vlhkomerVcc, LOW);      
      prubeznaHodnota = prubeznaHodnota + analog;
      delay(interval);
      opak = opak + 1;
    }
    prumernaHodnota = prubeznaHodnota / pocetOpak;
    return prumernaHodnota;
}

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

Re: samozavlažovací systém by noobie - problémy, kam se podíváš

Příspěvek od KamilV » 26 zář 2019, 21:42

Co tam máš za vlhkoměry? Píšeš o 3.3 V, ale na digitálním pinu ArduUNO je 5 V.
Záleží také, kolik mA si vezmou.
Jiná cesta by byla připojit je na 5 V (nebo 3.3 V) přes tranzistor a ten ovládat z digitálního pinu.
Jinak v kódu bych asi zkusil dát krátký delay mezi řádky:

Kód: Vybrat vše

digitalWrite(vlhkomerVcc, HIGH);                  
int analog = analogRead(vlhkomerAnalog);
Je možné, že vlhkoměr nedodá přesný výsledek ihned po dodání VCC.

MaroNeumiProgramovat
Příspěvky: 7
Registrován: 26 zář 2019, 20:20
Reputation: 0

Re: samozavlažovací systém by noobie - problémy, kam se podíváš

Příspěvek od MaroNeumiProgramovat » 26 zář 2019, 22:08

Díky za odpověď!
Mám 3x https://www.gme.cz/modul-pudniho-vlhkom ... tal-vystup (Modům se omlouvám, klidně to pak odstraním, ale nevím co přesně za údaj mám dodat .D ). + 2 x ten samý ale od firmy ESES.
Co se týče napájení, tak vlhkoměry mají napsáno že pracují od 3,3 do 5 V, tak sem (asi dost blbě) zvolil tu nižší hranici .D...no nicméně, pokud pracuje ten vlhkoměr až na 5v a já mu z digitálního pinu posílám 5v, tak by asi neměl být problém, ne? .)
Delay jsem dal, ale bohužel to neřešilo můj problém :( Jde o to, že zatímco průměrná hodnota na truhlíku 1 byla predevčírem 400, včera 550, dneska 680 (zkrátka to funguje) tak na druhém je to 16-18 a prakticky nic to nedělá.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: samozavlažovací systém by noobie - problémy, kam se podíváš

Příspěvek od AstroMiK » 26 zář 2019, 22:15

Vlhkoměry nemám, abych to mohl vyzkoušet v reálu, ale v podprogramu žádnou vyloženou chybu nevidím.

Snad jen s tím napájením bych necvičil při každém vzorku, ale jen bych ho na začátku podprogramu zapnul a před returnem bych ho zase vypnul.

Zkus sem hodit ještě ty dva řádky, kterými tu funkci voláš pro první a pro druhé čidlo.

Třeba tohle by mohlo fungovat:

Kód: Vybrat vše

    Serial.print("Prvni: ");
    Serial.println(zjistiVlhkost(vlh0VCC, vlhA0, 500, 3));
    Serial.print("Druhy: ");
    Serial.println(zjistiVlhkost(vlh1VCC, vlhA1, 500, 3));

Jestli to nepůjde, tak bych se v první řadě podíval, jestli je na tom druhém vlhkoměru přítomné to pulzující napájení.



EDIT:
Teď jsem koukal na ten odkaz a napadlo mě, jestli nemáš zapojený u toho modulu vllhkosti místo analogového výstupu ten digitální.

MaroNeumiProgramovat
Příspěvky: 7
Registrován: 26 zář 2019, 20:20
Reputation: 0

Re: samozavlažovací systém by noobie - problémy, kam se podíváš

Příspěvek od MaroNeumiProgramovat » 26 zář 2019, 22:20

Díky za odpověď! :)
Jestli máš na mysli mé volání funkce v loopu, tak je to prakticky to samé, co jsi poslal ty, se mi zdá..nu posuď sám a já jdu projistotu zkusit Tvou verzi a opravit to napájení :)

Kód: Vybrat vše

void loop() {
  int vlhkost = zjistiVlhkost(vlh1VCC, vlh1A0, 1000, 10);
  Serial.print("vlhkost z return: ");
  Serial.println(vlhkost);
  Serial.println("------------------------------");
  delay(5000);
  int vlhkost2 = zjistiVlhkost(vlh2VCC, vlh2A1, 1000, 10);
  Serial.print("vlhkost z return: ");
  Serial.println(vlhkost2);
  Serial.println("------------------------------");
  delay(5000);

}

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: samozavlažovací systém by noobie - problémy, kam se podíváš

Příspěvek od AstroMiK » 26 zář 2019, 22:26

Když porovnám ten tvůj původní příspěvek a pak to volání funkcí, tak tam vůbec nemáš definované ty konstanty 'vlh2VCC' a 'vlh2A1'.
To by ti ale mělo vyhodit chybu už při kompilaci.

MaroNeumiProgramovat
Příspěvky: 7
Registrován: 26 zář 2019, 20:20
Reputation: 0

Re: samozavlažovací systém by noobie - problémy, kam se podíváš

Příspěvek od MaroNeumiProgramovat » 26 zář 2019, 22:34

Pánové, to teda čumím. že problém, který mně zabral fakt asi 2 týdny bez úspěchu, tak vy jste vyřešili asi za hodinu a půl :D nakonec se ukázalo, že je to vážně to manipulování s napájením. Projistotu jsem to celé trochu prodloužil podle rady a vše funguje, tak jak jsem si představoval :) Mockrát Vám děkuji :) Ještě jednu věc...vzhledem k tomu, že ten projekt je dost obsáhlý, vím určitě, že tohle není první zakousnutí...má smysl pokračovat v tomhle threadu, nebo radši založit pak nový pro nový problém? Ještě jednou děkuji :)

A tady je opravený code:

Kód: Vybrat vše

int zjistiVlhkost(int vlhkomerVcc, int vlhkomerAnalog, int interval, int pocetOpak){
  int opak = 0;                                        
  long int prubeznaHodnota = 0;
  int prumernaHodnota = 0;
  digitalWrite(vlhkomerVcc, HIGH);                  
  delay(500);
  while(opak != pocetOpak){                             
      int analog = analogRead(vlhkomerAnalog);             
      prubeznaHodnota = prubeznaHodnota + analog;
      delay(interval);
      opak = opak + 1;
    }
    digitalWrite(vlhkomerVcc, LOW);   
    prumernaHodnota = prubeznaHodnota / pocetOpak;
    return prumernaHodnota;
}

MaroNeumiProgramovat
Příspěvky: 7
Registrován: 26 zář 2019, 20:20
Reputation: 0

Re: samozavlažovací systém by noobie - problémy, kam se podíváš

Příspěvek od MaroNeumiProgramovat » 26 zář 2019, 22:35

AstroMiK píše:
26 zář 2019, 22:26
Když porovnám ten tvůj původní příspěvek a pak to volání funkcí, tak tam vůbec nemáš definované ty konstanty 'vlh2VCC' a 'vlh2A1'.
To by ti ale mělo vyhodit chybu už při kompilaci.
Ty definuju hned na začátku programu.

Kód: Vybrat vše

#include <Arduino.h>
#define vlh1A0 A0      // analogový vstup vlhkoměru 1
#define vlh1VCC 2      // vcc vlhkoměr 1
#define vlh2A1 A1      // analogový vstup vlhkoměru 2
#define vlh2VCC 4      // vcc vlhkoměr 2

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: samozavlažovací systém by noobie - problémy, kam se podíváš

Příspěvek od pavel1tu » 27 zář 2019, 09:06

Zdar,

já bych všechny vlhkoměry napájel z jedné nožičky a přes tranzistor.
Také bych do konečného provedení dal buď tavnou (trubičkovou) nebo vratnou pojistku na + (vlastní zkušenost), až ti sluníčko a vlhkost zničí kabel, mne se to několikrát i zkratovalo.

Jak je psáno výše - je dobré vlhkoměry "zapnout" a měřit až za chvilku (1s asi bude málo možná),
já bych prostě udělal po zapnutí vlhkoměru test měření po 100ms - za jak dlouho se měřená hodnota "ustálí",
dále bych se hned z počátku vyhnul funkci delay() ... já používám https://github.com/arkhipenko/TaskScheduler, ale je mnoho jiných možností samozřejmě.

Jako jeden z lidí co má zalévání již funkční, jsem hlavně zvědav na HW provedení - ventily atd. - tady se každý lišíme provedením a kolikráte se najde i zajímavé řešení které by nás nenapadlo.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

MaroNeumiProgramovat
Příspěvky: 7
Registrován: 26 zář 2019, 20:20
Reputation: 0

Re: samozavlažovací systém by noobie - problémy, kam se podíváš

Příspěvek od MaroNeumiProgramovat » 27 zář 2019, 12:21

@pavel1tu
Díky za odpověď! :)
Co se týče ochrany nožiček a drátků. Uvažoval jsem asi podobně jako ty, jen Teda bez know-how znalostí, které jistě máš. :) takže se rád nechám opravit, zda jsem udělal nějakou botu opět. Bál jsem se toho zkratovani a proto jsem samotné vidlice zatavil tavnym lepidlem.. Nicméně jsem zatavil celou plosku konektoru, jak +, tak i -(ne, pouze +, jak se zmiňujes ty). Šlo mi o to, aby se voda a vlhkost na ně nedostala a aby se nedostala na samotné dráty. Tohle řešení mi zatím funguje. Uvidíme, jak dlouho.

Zaujala mě jedna věc, říkal jsi, že by jsi všechny vlhkoměry zapojil na jednu nozicku s pomocí tranzistorů. Lze se takto pak v programu adresovat na konkrétní jeden vlhkoměr a pracovat s ním, zatímco ostatní budou čekat? Když jsem si to zkoušel nějak takto zapojit, vždy sem docílil jen toho, že jsem buď zapl všechny vlhkoměry najednou a nebo žádný. Proto si nechám rád poradit.

Co se týče samotného hw řešení. Vím, že, jak jsem si to vymyslel je takové vidlacke řešení- v hlavě už mám X iteraci, jak to celé zlepšit. Ale precijen, jsem začátečník a proto to k tomu tak pristupuju. Napřed udělat hloupé a levné řešení a pak můžu prikrocit k něčemu tezsimu.

Ale abych ti odpověděl. Celý systém si představuju tak, že budu mít externí zásobník, do kterého ručně budu dolevat vodu. V zásobníku bude čerpadlo, které bude čerpat vodu. Aby počítač věděl, který truhlík se má teď zalévat, chtěl jsem si vytvořit nějaký prvek (možná něco takového existuje, ale nic jsem takového nenašel), kterému pracovně říkám "křižovatka". To by vesměs měla být uzavřená nádobka s trubickovymi výstupy (počet výstupů se rovná počtu truhlíků). Za křižovatkou bude u každého výstupu servo, které bude skrtit proud vody, dokud nebude servo spuštěné - tzn. začne zalévání.

Vesměs celý systém mám nějak vymyšlený a dokážu si reálné představit, jak a proč by mělo fungovat. Problém bude trochu s tou křižovatkou, abych dokázal říct, který konkrétní truhlík se bude zalévat teď. Tady precijen cítím prostor pro nějaké lepší řešení. Takže rád si opět nechám poradit. :)

Ale to je zatím pro mě hudba budoucnosti, zatím se chci po malých kruccich dostat k první funkční verzi pro testovací truhlíky a pak můžu řešit dál.

Odpovědět

Kdo je online

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