Stránka 2 z 3

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

Napsal: 01 led 2020, 16:14
od gilhad
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

Napsal: 01 led 2020, 16:15
od ArduXPP
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

Napsal: 01 led 2020, 17:21
od KamilV
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...

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

Napsal: 01 led 2020, 17:39
od ondraN
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

Napsal: 02 led 2020, 20:14
od ondraN
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á.

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

Napsal: 02 led 2020, 20:21
od jankop
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
                                           };

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

Napsal: 03 led 2020, 07:02
od ondraN
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

Napsal: 12 led 2020, 15:08
od dusanr
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

Napsal: 12 led 2020, 16:19
od kiRRow
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.

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

Napsal: 12 led 2020, 16:32
od dusanr
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....