Propagátor na klíčení semen
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.
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.
Re: Propagátor na klíčení semen
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...
Re: Propagátor na klíčení semen
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Ů ?
Re: Propagátor na klíčení semen
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...
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...
Re: Propagátor na klíčení semen
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.
Re: Propagátor na klíčení semen
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:
je ekvivalentní
a vliv na obsazení RAM to nemá.
Takže:
Kód: Vybrat vše
#define HODNOTA 250
Kód: Vybrat vše
const byte HODNOTA=250;
-
- Příspěvky: 1029
- Registrován: 06 zář 2017, 20:04
- Reputation: 0
- Bydliště: Brno
- Kontaktovat uživatele:
Re: Propagátor na klíčení semen
Dík za vysvětlení i za experimentální ověření
Ovšem tahle definice pole si RAM nevezme:
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.
Re: Propagátor na klíčení semen
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.
Re: Propagátor na klíčení semen
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);
}
}
Re: Propagátor na klíčení semen
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.
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.
Re: Propagátor na klíčení semen
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....
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 19 hostů