Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Arduino - podmínky

Ahoj,
je tu někdo kdo se zabývá blíže programováním Arduina? Potřebuji poradit ohledně poskládání podmínek aby se mi vzájemně nekopaly. Mám dva termostaty a na základě dvou získaných hodnot nahazuji určité výstupy.

když Ter1 = log1
-Kot => log1
-VenP => log1
-Cerp => log1

když Ter2 = log1
-Kot => log1
-VenR => log1

Po shození signálu na Ter se výstupy nastaví na log 0. Samostatné podmínky pro každý termostat mě fungují ale nevím jak se zkombinovat dohromady.

Předmět Autor Datum
Asi to nějak nechápu čeho chceš docílit. Přece, když ten program pojede od shora, tak si nejdříve ov…
antibalda 28.02.2016 10:00
antibalda
Nevím jak to odmzal jsem nějaké výpisy na lcd a měření teploty a teď mi ty podmínky chodí, zkusím je…
Nitram18 28.02.2016 11:26
Nitram18
zkusil jsem přidat měření teploty jeho odeslání na sériovku, druhá podmínka pro ter2 funguje ale při…
Nitram18 28.02.2016 11:43
Nitram18
První chyba - nedefinuješ základní stav zařízení (ve void setup() dopsat digitalWrite(výstup, LOW) p…
mia 28.02.2016 13:10
mia
Zkusil jsem přidat tu podmínku, ale nemůžu si pomoct.. Mám na začátku loopu výpis na sériovku jen je…
Nitram18 28.02.2016 13:53
Nitram18
Když tady na začátku loopu odmažu serial print tak to chodí.. když tam je tak ten výstup 52 prostě n…
Nitram18 28.02.2016 13:56
Nitram18
Co to je za arduino?
bahno 28.02.2016 14:07
bahno
Mega 2560
Nitram18 28.02.2016 14:09
Nitram18
Zkus jiný seriový port.
Prim 28.02.2016 20:23
Prim
V těch podmínkách zbytečně duplikuješ spínání a rozpínání kotle. Zkus to tam napsat podle toho mého…
mia 28.02.2016 22:29
mia
Měp jsem tam víc chyb. Za prvné jsem v podmínkách porovnával ne stavy termostatů (1,0) ale čísla jej…
Nitram18 29.02.2016 00:19
Nitram18
Tak teď trochu nechápu čeho chceš dosáhnout. Pokud je některý termostat sepnutý, zapne se kotel a v…
mia 29.02.2016 15:38
mia
Jinak jsem nepostřehl, že bys porovnával čísla pinů aha, už to vidím, mě nenapadlo, že vezmeš doslo…
mia 29.02.2016 18:50
mia
K tomu CerK tam mám v pondmínce chybu. u té podmínky krbt >= 23 a zároveň je ter1 log 1 se nahazuje… poslední
Nitram18 29.02.2016 22:48
Nitram18
Urob si pravdivostnu tabulku. Od toho sa uci na skolach boolova algebra, aby to potom dotycny vedel…
MM.. 29.02.2016 19:45
MM..
A vysledok bude program na 4 riadky digitalWrite(Kot, Ter1 | Ter2); digitalWrite(VenP, Ter1); digit…
MM.. 29.02.2016 19:54
MM..
Ještě jinak: digitalWrite(Kot, digitalRead(Ter1) | digitalRead(Ter2)); digitalWrite(VenP, digitalRe…
mia 29.02.2016 21:31
mia
Ano sorry blbo som to pomenoval, ale ja som to mal tak schvalne - myslel som tym nejaku premennu do…
MM.. 29.02.2016 21:37
MM..
Děkuju že to tu tak žije, byl jsem na služebce tak to musím pozpátku všechno vstřebat a dík za ochot…
Nitram18 29.02.2016 21:54
Nitram18
Nakresli si pravdivostnu tabulku. Taketo zapisy su a)nepochopitelne, b)stejne si tu tabulku budes mu…
MM.. 29.02.2016 21:58
MM..
if(teplota>23) digitalWrite(Kot, LOW); else digitalWrite(Kot, digitalRead(Ter1) | digitalRead(Ter2))…
MM.. 29.02.2016 22:00
MM..
Neříkám že na to dva tranzistory nestačí ale rád se to naučím ;-) bohužel to dneska nedám, už odpadá…
Nitram18 29.02.2016 22:05
Nitram18
... toto predpoklada ze VenP a VenR mozu byt zopnute sucasne. Neni to jasne z chaos-zapisu. Ked si n…
MM.. 29.02.2016 22:07
MM..
Ano nad tou tabulkou ještě přemýšlím a vím že sme je dělali ve škole O:) asi sem měl dávat větší poz…
Nitram18 29.02.2016 22:09
Nitram18

Asi to nějak nechápu čeho chceš docílit. Přece, když ten program pojede od shora, tak si nejdříve ověří jestli platí "když Ter1 = log1" - pokud ano vykoná tělo podmínky, pokud ne, pokračuje na další podmínku "když Ter2 = log1" a opět si zjistí jestli platí nebo ne.

Směr programu :
-Kot => log0
-VenP => log0
-Cerp => log0
-VenR => log0

když Ter1 = log1
-Kot => log1
-VenP => log1
-Cerp => log1

když Ter2 = log1
-Kot => log1
-VenR => log1

Pokud není splněna ani jedna podmínka, všechny proměnné zůstanou v log0.

Nevím jak to odmzal jsem nějaké výpisy na lcd a měření teploty a teď mi ty podmínky chodí, zkusím je postupně dopisovat a uvidím, dám pak vedět. Opis programu:
int Ter1 = 22;
int Ter2 = 24;
int CerP = 30;
int CerK = 32;
int VenP = 34;
int VenR = 36;
int Kot = 52;
int stavter1;
int stavter2;

void setup()
{
pinMode(Ter1, INPUT);
pinMode(Ter2, INPUT);
pinMode(CerP, OUTPUT);
pinMode(CerK, OUTPUT);
pinMode(VenP, OUTPUT);
pinMode(VenR, OUTPUT);
pinMode(Kot, OUTPUT);

}
//smyčka
void loop(void)
{
// termostat prizemi
stavter1 = digitalRead(Ter1);
if (stavter1 == HIGH)
{
digitalWrite(Kot, HIGH);
digitalWrite(VenP, HIGH);
digitalWrite(CerP, HIGH) ;
}else
{
digitalWrite(Kot, LOW);
digitalWrite(VenP, LOW);
digitalWrite(CerP, LOW);
}
//termostat patro
stavter2 = digitalRead(Ter2);
if (stavter2 == HIGH)
{
digitalWrite(Kot, HIGH);
digitalWrite(VenR, HIGH);
}else
{
digitalWrite(Kot, LOW);
digitalWrite(VenR, LOW);
}

}

zkusil jsem přidat měření teploty jeho odeslání na sériovku, druhá podmínka pro ter2 funguje ale při podmínce ter1 = log1 se nenahodí výstup 52. Program:
#include <OneWire.h> //knihovna sběrnice
#include <DallasTemperature.h> //knihovna snímač
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int Ter1 = 22;
int Ter2 = 24;
int CerP = 30;
int CerK = 32;
int VenP = 34;
int VenR = 36;
int Kot = 52;
int stavter1;
int stavter2;
float temp = 0;

void setup()
{
pinMode(Ter1, INPUT);
pinMode(Ter2, INPUT);
pinMode(CerP, OUTPUT);
pinMode(CerK, OUTPUT);
pinMode(VenP, OUTPUT);
pinMode(VenR, OUTPUT);
pinMode(Kot, OUTPUT);

}
//smyčka
void loop(void)
{
// termostat prizemi
stavter1 = digitalRead(Ter1);
if (stavter1 == HIGH)
{
digitalWrite(Kot, HIGH);
digitalWrite(VenP, HIGH);
digitalWrite(CerP, HIGH) ;
}else
{
digitalWrite(Kot, LOW);
digitalWrite(VenP, LOW);
digitalWrite(CerP, LOW);
}
//termostat patro
stavter2 = digitalRead(Ter2);
if (stavter2 == HIGH)
{
digitalWrite(Kot, HIGH);
digitalWrite(VenR, HIGH);
}else
{
digitalWrite(Kot, LOW);
digitalWrite(VenR, LOW);
}
sensors.begin();
Serial.begin(9600);
sensors.requestTemperatures();
delay(100);
temp = sensors.getTempCByIndex(0);
Serial.print(temp);

}

První chyba - nedefinuješ základní stav zařízení (ve void setup() dopsat digitalWrite(výstup, LOW) pro ty výstupy, které mají být v základu vypnuté...)
Druhá chyba - pokud je splněna podmínka Ter1=HIGH a zároveň podmínka Ter1=LOW, tak se Kot (předpokládám že je to kotel) nejdřív zapne, ale hned nato se vypne. Měl bys tam zavést podmínku if(Ter1==HIGH||Ter2==HIGH) {digitalWrite(Kot,HIGH);}

Takže asi takhle:

// termostat prizemi
stavter1 = digitalRead(Ter1);
//termostat patro
stavter2 = digitalRead(Ter2);
if(stavter1 == HIGH || stavter2 == HIGH)
{
digitalWrite(Kot, HIGH);
}
else
{
digitalWrite(Kot, LOW);
}
if(stavter1 == HIGH)
{
digitalWrite(VenP, HIGH);
digitalWrite(CerP, HIGH);
}else
{
digitalWrite(VenP, LOW);
digitalWrite(CerP, LOW);
}
if(stavter2 == HIGH)
{
digitalWrite(VenR, HIGH);
}else
{
digitalWrite(VenR, LOW);
}
........

no a ještě by to šlo sofistikovaněji:

// termostat prizemi
stavter1 = digitalRead(Ter1);
//termostat patro
stavter2 = digitalRead(Ter2);
if(stavter1 == HIGH || stavter2 == HIGH)
{
digitalWrite(Kot, HIGH);
}
else                   //jelikož není ani jeden termostat aktivní, vypne se všechno
{
digitalWrite(Kot, LOW);
digitalWrite(VenP, LOW);
digitalWrite(CerP, LOW);
digitalWrite(VenR, LOW);
}
if(stavter1 == HIGH)
{
digitalWrite(VenP, HIGH);
digitalWrite(CerP, HIGH);
}
if(stavter2 == HIGH)
{
digitalWrite(VenR, HIGH);
}
........

Když tady na začátku loopu odmažu serial print tak to chodí.. když tam je tak ten výstup 52 prostě nesepne, ale má jakoby snahu.. na výstupu měřím 33mV takže ledka "prosvěcuje" pinu jako takovému bych to nezazlíval když p zrušení výpisu na sériovku normálně spíná..
#include <OneWire.h> //knihovna sběrnice
#include <DallasTemperature.h> //knihovna snímač
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int Ter1 = 22;
int Ter2 = 24;
int CerP = 30;
int CerK = 32;
int VenP = 34;
int VenR = 36;
int Kot = 52;
int stavter1;
int stavter2;
float temp = 0;

void setup()
{
pinMode(Ter1, INPUT);
pinMode(Ter2, INPUT);
pinMode(CerP, OUTPUT);
pinMode(CerK, OUTPUT);
pinMode(VenP, OUTPUT);
pinMode(VenR, OUTPUT);
pinMode(Kot, OUTPUT);
sensors.begin();
Serial.begin(9600);
digitalWrite(CerP, LOW);
digitalWrite(CerK, LOW);
digitalWrite(VenP, LOW);
digitalWrite(VenR, LOW);
digitalWrite(Kot, LOW);

}
//smyčka
void loop(void)
{
Serial.print("ahoj");
// termostat prizemi
stavter1 = digitalRead(Ter1);
if (stavter1 == HIGH)
{
digitalWrite(Kot, HIGH);
digitalWrite(VenP, HIGH);
digitalWrite(CerP, HIGH) ;
}else
{
digitalWrite(Kot, LOW);
digitalWrite(VenP, LOW);
digitalWrite(CerP, LOW);
}
//termostat patro
stavter2 = digitalRead(Ter2);
if (stavter2 == HIGH)
{
digitalWrite(Kot, HIGH);
digitalWrite(VenR, HIGH);
}else
{
digitalWrite(Kot, LOW);
digitalWrite(VenR, LOW);
}
if ((Ter1 == HIGH) || (Ter2 == HIGH))
{
digitalWrite(Kot, HIGH);
}else
{
digitalWrite(Kot, LOW);
}

}

Měp jsem tam víc chyb. Za prvné jsem v podmínkách porovnával ne stavy termostatů (1,0) ale čísla jejich pinů a v proměných jsem měl pro definice pinů použitý typ boolean přitom čísla pinů jsou třeba 22. Teď jsem dodělal na konci pomínku která pro změnu taky nechodí. Předchozí podmínky už ano a to i s výpisem na sériovku a lcd.

#include <LiquidCrystal.h>
#include <OneWire.h> //knihovna sběrnice
#include <DallasTemperature.h> //knihovna snímač
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
const int Ter1 = 22;
const int Ter2 = 24;
const int CerP = 30;
const int CerK = 32;
const int VenP = 34;
const int VenR = 36;
const int Kot = 45;
boolean stavter1 = 0;
boolean stavter2 = 0;
float temp = 0;

void setup()
{
pinMode(Ter1, INPUT);
pinMode(Ter2, INPUT);
pinMode(CerP, OUTPUT);
pinMode(CerK, OUTPUT);
pinMode(VenP, OUTPUT);
pinMode(VenR, OUTPUT);
pinMode(Kot, OUTPUT);
sensors.begin();
lcd.begin(16,2);
Serial.begin(9600);
digitalWrite(CerP, LOW);
digitalWrite(CerK, LOW);
digitalWrite(VenP, LOW);
digitalWrite(VenR, LOW);
digitalWrite(Kot, LOW);

}
//smyčka
void loop()
{
// termostat prizemi
stavter1 = digitalRead(Ter1);
if (stavter1 == HIGH)
{
digitalWrite(Kot, HIGH);
digitalWrite(VenP, HIGH);
digitalWrite(CerP, HIGH) ;
}else
{
digitalWrite(Kot, LOW);
digitalWrite(VenP, LOW);
digitalWrite(CerP, LOW);
}
//termostat patro
stavter2 = digitalRead(Ter2);
if (stavter2 == HIGH)
{
digitalWrite(Kot, HIGH);
digitalWrite(VenR, HIGH);
}else
{
digitalWrite(Kot, LOW);
digitalWrite(VenR, LOW);
}
Serial.println(stavter1);
Serial.println(stavter2);
if ((stavter1 == HIGH) || (stavter2 == HIGH))
{
digitalWrite(Kot, HIGH);
}else
{
digitalWrite(Kot, LOW);
}
sensors.requestTemperatures();
temp = sensors.getTempCByIndex(0);
lcd.setCursor(0,0);
lcd.print(temp);
lcd.setCursor(6,0);
lcd.print((char)223);
lcd.setCursor(7,0);
lcd.print("C");
if (temp >= 23)
{
if (stavter1 == HIGH)
{
digitalWrite(CerP, HIGH);
digitalWrite(VenP, HIGH);
}else
{ digitalWrite(CerP, LOW);
digitalWrite(CerP, LOW);
}
if (stavter2 == HIGH)
{
digitalWrite(VenR, HIGH);
}else
{
digitalWrite(VenR, LOW);
}
}
}

Tak teď trochu nechápu čeho chceš dosáhnout. Pokud je některý termostat sepnutý, zapne se kotel a v závislosti na tom, který termostat je sepnutý, tak se zapne buď přízemí nebo patro nebo oboje. A když je teplota větší než 23°C, tak se stane co?

/*před testem podmínek by měly být načteny stavter1, stavter2 a temp
a taky udělané všechny výstupy na serial, případně na LCD - to znamená testy až nakonec! */

if((temp < 23 && stavter1 == HIGH) || (temp < 23 && stavter2 == HIGH)) {
   digitalWrite(Kot, HIGH); }  //pokud je teplota nižší než 23°C a některý z termostatů sepne, zapni kotel
else {
   digitalWrite(Kot, LOW);     //jinak bude kotel vypnutý
   digitalWrite(CerP, LOW);    //a všechno ostatní taky
   digitalWrite(VenP, LOW);    
   digitalWrite(CerK, LOW);
   digitalWrite(VenR, LOW);
   }
if(stavter1 == HIGH) {
   digitalWrite(CerP, HIGH);   //Pokud je sepnutý spodní termostat, zapni CerP
   digitalWrite(VenP, HIGH);   //a VenP, ať už to znamená cokoliv
   }
else {
   digitalWrite(CerP, LOW);
   digitalWrite(VenP, LOW);    //jinak ty věci vypni
   }
if(stavter2 == HIGH) {
   digitalWrite(VenR, HIGH);   //Pokud je sepnutý horní termostat, zapni VenR
   }
else {
   digitalWrite(VenR, LOW);    //jinak vypni VenR
   }
/* K čemu slouží CerK? neměl by být taky někde zapnutý/vypnutý? */

Jinak jsem nepostřehl, že bys porovnával čísla pinů, digitalRead ti přece zjistí stav na pinu. Je vcelku jedno, jestli máš deklarovaný stavter jako boolean nebo int, taky v podmínce nemusíš explicitně psát if(stavter1 == HIGH), stačí if(stavter1), protože pokud je cokoliv jiného než nula, tak bude podmínka platit.

Ještě jinak:

digitalWrite(Kot, digitalRead(Ter1) | digitalRead(Ter2));
digitalWrite(VenP, digitalRead(Ter1));
digitalWrite(CerP, digitalRead(Ter1));
digitalWrite(VenR, digitalRead(Ter2));

páč tak jak jsi to napsal, by zapisoval čísla vstupů, ne hodnoty na nich.

Ano sorry blbo som to pomenoval, ale ja som to mal tak schvalne - myslel som tym nejaku premennu do ktorej to predtym nacital. Pretoze vstup sa zasadne cita len raz pred tym, ptz. sa moze zmenit trebars po 3.riadku a nebude to potom suhlasit, ale ak je to v loope tak je to fuk pri dalsom priebehu sa to nastavi spravne. Ale lepsie je precitat to raz do premennej pred tymi 4 riadkami.

Děkuju že to tu tak žije, byl jsem na služebce tak to musím pozpátku všechno vstřebat a dík za ochotu, začínám stím. Napíšu zatím aspoň co po tom vubec chci jak tu někdo vzpoměl tu teplotu..

když Ter1 = log1
-Kot => log1
-VenP => log1
-Cerp => log1

když Ter2 = log1
-Kot => log1
-VenR => log1

když Ter1 a zárověň je teplota KrbT větší jak 23 (příklad.. teplota je teplota vody v krbové vložce)
-CerP=>log1
-VenP=>log1

když Ter2 a zároveň je teplota KrbT větší jak 23
-VenR=>log1

if(teplota>23)
 digitalWrite(Kot, LOW);
else
 digitalWrite(Kot, digitalRead(Ter1) | digitalRead(Ter2));
digitalWrite(VenP, digitalRead(Ter1));
digitalWrite(CerP, digitalRead(Ter1));
digitalWrite(VenR, digitalRead(Ter2));

P.S. inac na to stacia 2tranzistory a 3draty, nepotrebujes arduino.

Zpět do poradny Odpovědět na původní otázku Nahoru