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.
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:
no a ještě by to šlo sofistikovaněji:
Zkusil jsem přidat tu podmínku, ale nemůžu si pomoct.. Mám na začátku loopu výpis na sériovku jen jednoduché Serial.print("ahoj"); v momentě kdy tento výpis smažu, všechno chodí..
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);
}
}
Co to je za arduino?
Mega 2560
Zkus jiný seriový port.
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 druhého příkladu.
Pin 52 je podle mapy Mega2560 SCK, což by mohlo dělat problém. Zkus kotel přepojit třeba na pin 42, to je obyčejný bit portu L.
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?
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.
aha, už to vidím, mě nenapadlo, že vezmeš doslova co jsem ti psal ve volným textu a prdneš to do programu. Ta podmínka byla správně napsaná v tom zeleným kódu.
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 ne CerP ale Cerk (čerpadlo krb).
Urob si pravdivostnu tabulku. Od toho sa uci na skolach boolova algebra, aby to potom dotycny vedel naprogramovat.
(btw. predpokladam ze to bude tupa logika, a ne sekvencny automat)
A vysledok bude program na 4 riadky
digitalWrite(Kot, Ter1 | Ter2);
digitalWrite(VenP, Ter1);
digitalWrite(Cerp, Ter1); //toto si ale asi blbo zadefinoval v dotaze (?)
digitalWrite(VenR, Ter2);
a nebudu v tom ziadne if.
Ještě jinak:
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
Nakresli si pravdivostnu tabulku. Taketo zapisy su a)nepochopitelne, b)stejne si tu tabulku budes muset nakreslit aby si neprogramoval somariny
P.S. inac na to stacia 2tranzistory a 3draty, nepotrebujes arduino.
Neříkám že na to dva tranzistory nestačí ale rád se to naučím bohužel to dneska nedám, už odpadám, zítra si to tu všechno zpětně pročtu a pozkouším, zatím díky a pěkný večer přeju.
... toto predpoklada ze VenP a VenR mozu byt zopnute sucasne. Neni to jasne z chaos-zapisu. Ked si nakreslis tabulku, tak tam bude vsetko tak jak si chcel, a odvodis si z toho logicke funkcie.
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ší pozor...