Propagátor na klíčení semen

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.
gilhad
Příspěvky: 508
Registrován: 07 bře 2018, 11:22
Reputation: 5

Re: Propagátor na klíčení semen

Příspěvek od gilhad » 01 led 2020, 16:14

Bylo v tom doporuceni taky proc by to melo byt lepsi? Ono se na netu vyskytuji doporuceni dost ruzne kvality, obzvlaste co se Arduina tyce...

ArduXPP
Příspěvky: 307
Registrován: 14 pro 2017, 19:31
Reputation: 0

Re: Propagátor na klíčení semen

Příspěvek od ArduXPP » 01 led 2020, 16:15

Tak zas u definování pinu bych využil #define. Proč zabírat ramku :) Nebo bude se ještě něco jiného využívat s názvem PINŮ ?

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

Re: Propagátor na klíčení semen

Příspěvek od KamilV » 01 led 2020, 17:21

C++ (a potažmo i Wiring) je silně typový jazyk. Při použití #define se tím zanese do kódu netypovost. Čistě teoreticky po #define PIN 5 může přijít #undef PIN a #define PIN X a je zle.

Ale ta "výhoda" je značně diskutabilní. Já na číslování pinů také používám #define. Předefinování lze uhlídat snadno. Raději mám úsporu v proměnných, třebaže konstantních...

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

Re: Propagátor na klíčení semen

Příspěvek od ondraN » 01 led 2020, 17:39

define je vhodný u jazyku C. U C++ je doporučení define nepoužívat (na konstanty), kvůli již zmińované nemožnosti typové kontroly. Správně by se mělo používat const typ název=hodnota; Překladač to pochopí a nezabere to žádnou RAM a také to nelze omylem změnit za chodu programu. Dokonce to je možné udělat i pro pole, aniž by byla alokovaná RAM.

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

Re: Propagátor na klíčení semen

Příspěvek od ondraN » 02 led 2020, 20:14

V předchozím příspěvku jsem napsal, že jako symbolickou konstantu lze použít i pole, aniž by sežralo RAM. Bohužel to ale není pravda (u kompilátoru pro arduino), sežere to stejně RAMky, jako běžné pole. Omlouvám se za mystifikaci. Nicméně ale platí (ověřeno), že jednoduché typy paměť nealokují.
Takže:

Kód: Vybrat vše

#define HODNOTA  250 
je ekvivalentní

Kód: Vybrat vše

const byte HODNOTA=250;
a vliv na obsazení RAM to nemá.

jankop
Příspěvky: 658
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Propagátor na klíčení semen

Příspěvek od jankop » 02 led 2020, 20:21

Dík za vysvětlení i za experimentální ověření :)

Ovšem tahle definice pole si RAM nevezme:

Kód: Vybrat vše

const uint8_t DefaultRegisters[] PROGMEM = {0, 0, 0, 0, 0, 0, 0, DATA_CAP_SETUP, DATA_VT_SETUP, DATA_EXC_SETUP, DATA_CFG,
                                            DATA_CAPDACA, DATA_CAPDACB, DATA_CAP_OFFH, DATA_CAP_OFFL, 0, 0, 0, 0
                                           };
Naposledy upravil(a) jankop dne 02 led 2020, 20:46, celkem upraveno 1 x.

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

Re: Propagátor na klíčení semen

Příspěvek od ondraN » 03 led 2020, 07:02

Tahle definice je ale díky PROGMEM přesunuta do flash paměti, takže paměť si vezme, ale není ro RAM ale Flash. Kdežto symbolické konstanty (náhrada za define), jejichž hodnota je známa v okamžiku překladu, se stanou vlastně součástí kódu. Pokud přesuneme pole do Flash, je to vykoupeno náročnějším přístupem k němu. Takže pro aplikace, které vyžadují co nejrychlejší zpracování, bych to nedělal.

dusanr
Příspěvky: 8
Registrován: 29 pro 2019, 13:43
Reputation: 0

Re: Propagátor na klíčení semen

Příspěvek od dusanr » 12 led 2020, 15:08

Ahoj, tak jsem si vzal všechny rady k srdci, načetl si další teorii a upravil kód. Ale stejně mám problém, že to nedělá co by mělo. Dokonce jsem zkoušel vypisovat přes Serial.Print stavy kam až program dojde, abych ověřil plnění/neplnění podmínek If, ale prostě to nejde. Dělá to nesmysly a nMůžete mi mkrnout na kód a zkusit poradit, kde mám chybu? Pro zjednodušení jsem funkce programu zakomentoval a nechal funkce jen na topení a větrání, ale stejně jsem na nic nepřišel. Přijde mi, že je tam vše správně.. :(

Kód: Vybrat vše

//const int mlha = 2;
//boolean mlhaZapnuto = false;
//const int vytapeni = 3;
//boolean vytapeniZapnuto = false;
//const int zalivka = 4;//
//boolean zalivkaZapnuto = false;//
int ventilator = 5;
int vytapeni = 3;
int hysTep = 1; //hystereze pro teplotu
int hysVlh = 5; //hystereze pro vlhkost
int Teplota = 27; //požadovaná teplota v pěstírně
int Vlhkost = 70; //požadovaná vlhkost v pěstírně

#include <Wire.h>
#include "DHT.h"
#define pinDHT 6
#define typDHT11 DHT11
DHT mojeDHT(pinDHT, typDHT11);


void setup() {
  pinMode(ventilator, OUTPUT);
  //pinMode(mlha, OUTPUT);
  pinMode(vytapeni, OUTPUT);
  //pinMode(zalivka, OUTPUT);//
  Serial.begin(9600);
  mojeDHT.begin();
 
}

void loop() {
  {
  float tep = mojeDHT.readTemperature();
  float vlh = mojeDHT.readHumidity();

    Serial.print("Teplota: "); 
    Serial.print(tep);
    Serial.print(" stupnu Celsia, ");
    Serial.print("vlhkost: "); 
    Serial.print(vlh);
    Serial.println("  %");
  }
  
  if ((Vlhkost-mojeDHT.readHumidity()) > hysVlh)
  {
    digitalWrite(ventilator, HIGH);
    //Serial.print("Ventilátor zapnut, snižuji vlhkost v pěstírně");
  }

  else if ((Vlhkost-mojeDHT.readHumidity()) < (-1*hysVlh))
  {
    digitalWrite(ventilator, LOW);
    //Serial.print("Ventilátor vypnut");
  }  

 
  if ((Teplota-mojeDHT.readTemperature()) < hysTep)
  {
    digitalWrite(vytapeni, HIGH);
    //Serial.print((Teplota-mojeDHT.readTemperature()) < hysTep);
    //Serial.print("Vytápění zapnuto, zvyšuji teplotu v pěstírně");
  }
 else if ((Teplota-mojeDHT.readTemperature()) < (-1*hysTep))
  {
    digitalWrite(vytapeni, LOW);
    //Serial.print((Teplota-mojeDHT.readTemperature()) < (-1*hysTep));
    //Serial.print("Vytápění vypnuto");
  }  
  {
  delay(1000);
  }
  
  
}

kiRRow
Příspěvky: 485
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Propagátor na klíčení semen

Příspěvek od kiRRow » 12 led 2020, 16:19

Když už si jednou v loopu načtu stavy z nějakých čidel

float tep = mojeDHT.readTemperature();
float vlh = mojeDHT.readHumidity();

tak dále pracuji s tep a vlh ...

if ((Vlhkost-mojeDHT.readHumidity()) > hysVlh)

ty si tady v podstatě znovu zažádáš o měření a to co jsis vypsal na seriovou linku už není to s čím dále pracuješ ...
další chyba je pak v tom zadání podmínky (ne téhle, ale těch dalších) ... chci-li držet 25 +- 1 ... tak se ptám jestli je naměřená hodnota větší než 25 + 1 ... jo, vypnu topení a zeptám se jestli je naměřená hodnota menší než 25 - 1 a jestli jo, zapnu topení .... atp.

dusanr
Příspěvky: 8
Registrován: 29 pro 2019, 13:43
Reputation: 0

Re: Propagátor na klíčení semen

Příspěvek od dusanr » 12 led 2020, 16:32

Ahoj moc díky za odpověď. Důvod je, že když jsem zadal tep a vlh, tak to nefungovalo:( Jinak logika je mi jasná, ale uměl by jsi mi poradit kódem? Dle mého testu vypisování přes serialprint jsem zjistil, že program nedojede na další podmínky, takže bych tipoval, že mám někde špatně závorky....

Odpovědět

Kdo je online

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