04-04-2022, 13:51
Jeszcze raz ja proszę o pomoc. Może ktoś przeanalizuje mój kod i pomoże wychwycić błędy. Kod się wgrywa i działa ale nie wiem czy gdzieś nie namieszałem z logiką. Układ zrobiłem na LGT8F328. Czy to jest dobry układ do takich zastosowań czy lepiej na innym? Pozdrawiam
Kod:
#include <avr/wdt.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS D7 // Pin OneWire
#define TEMPERATURE_PRECISION 9
byte znak0[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000 }; // znak Ę i °C
byte znak1[8] = { 0b11111, 0b10000, 0b10000, 0b11111, 0b10000, 0b10000, 0b11111, 0b00010 };
int przekaznikGaz = D9;
int przekaznikPG = D10;
int przekaznikPW = D11;
int buzer = D4;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress DS_NR1 = { 0x28, 0x32, 0xFD, 0x48, 0xF6, 0xA8, 0x3C, 0xF2 }; // Tu wpisać adresy czujników
DeviceAddress DS_NR2 = { 0x28, 0x6F, 0x82, 0x95, 0xF0, 0x01, 0x3C, 0x85 };
LiquidCrystal_I2C lcd(0x27,16,2);
float tempW = 0;
float tempG = 0;
float hist = 1.5;
float tG = 31.5;
float tW = 31.5;
float histGaz = 15;
float tPG = 55;
void setup()
{
wdt_enable(WDTO_4S);
// lcd.noBacklight(); //wyłącza podświetlenie
sensors.begin();
lcd.init();
lcd.backlight();
lcd.clear();
//przekaznikGaz jako wyjście
pinMode(przekaznikGaz, OUTPUT); //przekaznikGaz jako wyjście
pinMode(przekaznikPG, OUTPUT);
pinMode(przekaznikPW, OUTPUT);
pinMode(buzer, OUTPUT);
digitalWrite(przekaznikGaz, HIGH); //Włączenie pieca GAZ
digitalWrite(przekaznikPG, LOW); // Włączenie cyrkulacji GAZ
digitalWrite(przekaznikPW, LOW); // Włączenie cyrkulacj Węgiel
digitalWrite(buzer, LOW); // ALARM!
sensors.setResolution(DS_NR1, TEMPERATURE_PRECISION);
sensors.setResolution(DS_NR2, TEMPERATURE_PRECISION);
}
void loop()
{
sensors.requestTemperatures();
tempW = sensors.getTempC(DS_NR1); // pobierz temperaturę po kolei z termometrów
tempG = sensors.getTempC(DS_NR2);
// ===============================================================================
if(tempW> (tW+hist)) // temperatura większa od
{
digitalWrite(przekaznikPW, HIGH);
// digitalWrite(przekaznikGaz, LOW);
}
else if (tempW< (tW-hist)) // mniejsza od
{
digitalWrite(przekaznikPW, LOW);
// digitalWrite(przekaznikGaz, HIGH);
}
//====================================================
if((tempG>(tPG+histGaz)) || (tempW> 35))
{
digitalWrite(przekaznikGaz, LOW);
}
else if (tempG<(tPG-histGaz))
{
digitalWrite(przekaznikGaz, HIGH);
}
//================================================
if(tempG> (tG+hist))
{
digitalWrite(przekaznikPG, HIGH);
}
else if (tempG< (tG-hist))
{
digitalWrite(przekaznikPG, LOW);
}
if((tempG>80) || (tempW>85))
{
digitalWrite(buzer, HIGH);
digitalWrite(przekaznikPG, HIGH);
digitalWrite(przekaznikPW, HIGH);
digitalWrite(przekaznikGaz, LOW);
}
else if((tempG<50) || (tempW<60))
{
digitalWrite(buzer, LOW);
}
//=======================================
lcd.createChar(0, znak0);
lcd.createChar(1, znak1);
lcd.setCursor(0,0);
lcd.print("PIEC GAZ: ");
lcd.setCursor(10,0);
lcd.print(tempG,1);
lcd.print((char)0);
lcd.print("C");
//======================================
lcd.setCursor(0,1);
lcd.print("PIEC W");
lcd.print((char)1);
lcd.print("G: ");
lcd.setCursor(10,1);
lcd.print(tempW,1);
lcd.print((char)0);
lcd.print("C");
//=====================================
delay (3000);
wdt_reset();
}
//=================================
Z kodem sprawdzającym błąd czujników sobie nie poradziłem :(