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.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
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
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
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
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

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.

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.

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