
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.
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);
}
}
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.
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).