19-04-2016, 22:13
Kod:
// Jest to franke-zlepek różnych projektów. Chcę tym sterować centralą wentylacyjną .
// Na obecnym etapie nie potrafię samodzielnie od podstaw napisać kodu, bo od paru dni siedzę przy arduino uno.
// Dziwne, jakoś działa, ale z przerwą . Na czas otwarcia bay-pas zablokowane są zmiany prędkosci wentylatorów.
// Arduino 1.6.7 . Biblioteki chyba nowe bo były auto aktualizacje. Siłownik bay-pas to Belimo i czas otwarcia-zamknięcia to 120 s.
// I tu pytanie.
// Da się uprościć kod do płynności działania i poprawności ogólnej?
#include "DHT.h" // DHT 22 (AM2302)
#include <OneWire.h>
#include <DallasTemperature.h> //4 ds18d20
#include <PCD8544.h> //lcd nokia 5110
#define ONE_WIRE_BUS 2 //1-Wire
#define DHTPIN 1 // pin wejście dla DHT 22 (AM2302)
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define wilgoc 9 // alarm wilgoci np. buzer //
int maxHum = 60; // nastawa alarmu wilgoci 60% //
int one_wire = 2; //Transmisja 1-Wire na pinie 2
OneWire oneWire(one_wire);
DallasTemperature sensors(&oneWire); //4 ds18d20
int b1 = 13; // PRZEKAZNIK bay-pas auto
int b2 = 12; // PRZEKAZNIK bay-pas auto
int bp1; // PRZEKAZNIK bay-pas auto
int bp2; // PRZEKAZNIK bay-pas auto
static PCD8544 lcd; // lcd nokia 5110 pin 3,4,5,6,7
DHT dht(DHTPIN, DHTTYPE); // DHT 22 (AM2302)
volatile int power=55; // nastawa momentu załączenia zasilania.(obroty wentylatorów).
// wartość power=55;1;200 są dla transoptora, który steruje napięcie falownika wentylatorów.
void setup() {
lcd.clear();
pinMode(wilgoc, OUTPUT); // alarm wilgoci np. buzer //
pinMode( bp1, OUTPUT); // PRZEKAZNIK bay-pas auto
pinMode( bp2, OUTPUT); // PRZEKAZNIK bay-pas auto
pinMode(A5, OUTPUT); //Dioda jako wyjście RĘCZNY Bay-Pas
pinMode(A3, INPUT_PULLUP); //Przycisk jako wejście
digitalWrite(A5, LOW); //Wyłączenie diody
pinMode(8, OUTPUT); //Dioda jako wyjście RĘCZNY Bay-Pas
pinMode(A4, INPUT_PULLUP); //Przycisk jako wejście
digitalWrite(8, LOW); //Wyłączenie diody
pinMode(A0,INPUT);digitalWrite(A0,HIGH); // klawisz MIN OBROTY
pinMode(A1,INPUT);digitalWrite(A1,HIGH); // klawisz ŚRED OBROTY
pinMode(A2,INPUT);digitalWrite(A2,HIGH); // klawisz MAX OBROTY
dht.begin(); // DHT 22 (AM2302)
sensors.begin();
lcd.begin(84,48); // LCD
}
void loop(){
delay(50);
if (digitalRead(A2)==LOW)power=200; //OBROTY wentylatora//
if (digitalRead(A1)==LOW)power=55; //OBROTY wentylatora//
if (digitalRead(A0)==LOW)power=1; //OBROTY wentylatora //
delay(50);
analogWrite(11,power); // tu dioda //OBROTY //
float t = dht.readTemperature(); // DHT 22 (AM2302)
float h = dht.readHumidity(); // DHT 22 (AM2302)
if (digitalRead(A3) == LOW) { //Jeśli przycisk wciśnięty bay-pas
digitalWrite(A5, HIGH); //Włącz diodę przekaznik bay-pas
delay(120000); //Czekamy x sekund na siłownik bay-pas
digitalWrite(A5, LOW); //Wyłączamy diodę przekaznik bay-pas
}
if (digitalRead(A4) == LOW) { //Jeśli przycisk wciśnięty bay-pas
digitalWrite(8, HIGH); //Włącz diodę przekaznik bay-pas
delay(120000); //Czekamy x sekund na siłownik bay-pas
digitalWrite(8, LOW); //Wyłączamy diodę przekaznik bay-pas
}
// Ostatnie dwa polecenia if z delay(120000) blokują wszystko na dwie minuty. Założenie spełniają (120 s tylko wysterowany
//jest siłownik) i tu pytanie, czy można to naprawić innymi poleceniami, aby nie blokowało reszty?
sensors.requestTemperatures(); //4 ds18d20
digitalWrite( bp2,b1); // PRZEKAZNIK bay-pas auto
digitalWrite( bp2,b2); // PRZEKAZNIK bay-pas auto
float DOM = sensors.getTempCByIndex(0); //czujnik ds18d20 dom (0)do sterowania auto bay-pas
float ZEWNATRZ = sensors.getTempCByIndex(3); // czujnik ds18d20 zewnątrz (3)do sterowania auto bay-pas
// Tu dwa ds 18d20 mają sterować siłownikiem już w automacie czyli: w domu temp. jest powyżej zadanej a na zewnątrz
// mniejsza, to następuje otwarcie bay-pas by schłodzić i tak w koło. Tu też chciałbym otwierać i zamykać przez 120 s
// aby przekazniki nie pracowały ciągle. Siłownik i tak odcina zasilanie a praca długa przekaznika jest bez celowa.
if(DOM <= 22) //temp.zamknięcie bay-pas
{
bp1 = LOW;
}
else if(DOM > 23 && DOM < 24) //temp. otwarcia bay-pas
{
bp1 = HIGH;
}
else if (DOM > 25) //temp.zamknięcie bay-pas
{
bp1 = LOW;
}
if(DOM > 26 && DOM < 27) //temp. otwarcia bay-pas
{
bp1 = HIGH;
}
if (DOM > 28) //temp.zamknięcie bay-pas
{
bp1 = LOW;
}
//***********************************************************//
if(ZEWNATRZ <= 22) //czujnik ds18d20 zewnątrz (3) do sterowania auto bay-pas
{ //temp.zamknięcie bay-pas
bp2 = LOW;
}
else if(ZEWNATRZ > 23 && ZEWNATRZ < 24) //temp. otwarcia bay-pas
{
bp2 = HIGH;
}
else if(ZEWNATRZ > 25) //temp.zamknięcie bay-pas
{
bp2 = LOW;
}
if(ZEWNATRZ >26 && ZEWNATRZ < 27) //temp. otwarcia bay-pas
{
bp2 = HIGH;
}
if(ZEWNATRZ > 28) //temp.zamknięcie bay-pas
{
bp2 = LOW;
}
// Wyświetlane są temp. ds18d20.
lcd.setCursor(0,0); //ustaw kursor w pozycji 0,0
lcd.print("CZER:"); //wyswietl "Temperatura: "
lcd.print(sensors.getTempCByIndex(3)); //wyswietl wartosc z czujnika 3
lcd.print((char)0); //wyswietl znak stopnia
lcd.print("C ");
lcd.setCursor(0,1); //ustaw kursor w pozycji 0,1
lcd.print("WYRZ:"); //wyswietl "Temperatura: "
lcd.print(sensors.getTempCByIndex(1)); //wyswietl wartosc z czujnika 1
lcd.print((char)0); //wyswietl znak stopnia
lcd.print("C ");
lcd.setCursor(0,2); //ustaw kursor w pozycji 0,2
lcd.print("NAWI:"); //wyswietl "Temperatura: "
lcd.print(sensors.getTempCByIndex(2)); //wyswietl wartosc z czujnika 2
lcd.print((char)0); //wyswietl znak stopnia
lcd.print("C ");
lcd.setCursor(0,3); //ustaw kursor w pozycji 0,3
lcd.print("WYWI:"); //wyswietl "Temperatura: "
lcd.print(sensors.getTempCByIndex(0)); //wyswietl wartosc z czujnika 0
lcd.print((char)0); //wyswietl znak stopnia
lcd.print("C ");
//Wyświetlana jest wilgoć i temp. czujnika o raz awaria DHT 22 (AM2302).
if(h > maxHum ) { // DHT 22 (AM2302)
digitalWrite(wilgoc, HIGH);
} else { // przekroczenie wilgoci
digitalWrite(wilgoc, LOW);
}
lcd.setCursor(0,4);
lcd.print(""); //wyswietl WILG z czujnika
lcd.print(h); //wyswietl wartosc z czujnika
lcd.print("% ");
lcd.setCursor(45,4);
lcd.print(""); //wyswietl Temp z czujnika
lcd.print(t); //wyswietl wartosc z czujnika
lcd.print("c ");
if (isnan(h) || isnan(t)) { // DHT 22 (AM2302)
lcd.setCursor(0,4);
lcd.print("NAJEBAL SENSOR"); //powiadomienie o awarii dth22
delay(5000);
return;
}
}
// Na końcu mam pytanie. Jest możliwość zgrania z procka kodu programem. Przykład. Te wypociny wgram np. do UNO i z UNO
// chcę programem odczytać .Pozdrowienia.
Nie wiem co i jak zmienić aby dobrze działało. Może ktoś doradzi?