#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
uint8_t arrowUp[8] = {
0b00100,
0b01110,
0b11111,
0b00100,
0b00100,
0b00100,
0b00100,
0b00100,
};
uint8_t arrowDown[8] = {
0b00100,
0b00100,
0b00100,
0b00100,
0b00100,
0b11111,
0b01110,
0b00100,
};
uint8_t znak_o[8] = {
0b00010,
0b00100,
0b01110,
0b10001,
0b10001,
0b10001,
0b01110,
0b00000,
};
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 5
#define DHT_PIN 13
#define POTENT_PIN A0
#define PWM_PIN 3
#define LED_PIN 2
#define HistLengh 3
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// arrays to hold device addresses
DeviceAddress Thermometer[4];
int numberOfDevices;
unsigned long actTime = 0;
unsigned long prevTime = 0;
unsigned long diffTime = 0;
int measureCnt = 0;
int state = 0;
float arrTemperature[HistLengh];
void setup() {
pinMode(PWM_PIN, OUTPUT);
pinMode(POTENT_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
lcd.begin(20, 4);
// Start up the library
sensors.begin();
digitalWrite(LED_PIN, LOW);
lcd.createChar(3, arrowDown);
lcd.createChar(4, arrowUp);
lcd.createChar(6, znak_o);
// locate devices on the bus
lcd.setCursor(0,0);
Serial.print("Szukanie czujników...");
lcd.print("Szukanie czujnik\x06w..");
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
lcd.setCursor(0,2);
Serial.print("Znaleziono ");
lcd.print("Znaleziono ");
Serial.print(numberOfDevices, DEC);
lcd.print(numberOfDevices, DEC);
lcd.setCursor(0,3);
Serial.println(" czujniki.");
lcd.println("czujniki.");
delay(500);
lcd.clear();
// Loop through each device, print out address
for(int i=0;i<numberOfDevices; i++){
// Search the wire for address
if(sensors.getAddress(Thermometer[i], i)){
Serial.print("Znaleziono czujnik ");
Serial.print(i, DEC);
Serial.print(" adress: ");
printAddress(Thermometer[i]);
Serial.println();
lcd.setCursor(0,0);
lcd.print("Znaleziono czujnik ");
lcd.print(i, DEC);
lcd.setCursor(0,1);
lcd.print("adress:");
lcd.setCursor(0,2);
printAddressLCD(Thermometer[i]);
} else {
lcd.clear();
Serial.print("Znaleziono czujnik ");
Serial.print(i, DEC);
Serial.println("brak adresu.");
lcd.setCursor(0,0);
lcd.print("Znaleziono czujnik ");
lcd.print(i, DEC);
lcd.setCursor(0,1);
lcd.print("brak adresu.");
}
}
delay(500);
lcd.clear();
}
void loop() {
float PWM_Percent;
float temperature;
float t1,t2,t3;
int potentiometer = analogRead(POTENT_PIN);
bool TempRappidDown;
bool TempUp;
sensors.requestTemperatures();
if (!sensors.isConnected(Thermometer[0])) {
Serial.println("Awaria czujnika");
state=100;
}
for(int i=0;i<numberOfDevices; i++){
// Search the wire for address
if(sensors.isConnected(Thermometer[i])){
Serial.print("Czujnik ");
Serial.print(i, DEC);
Serial.println(" OK");
} else {
Serial.print("Awaria czujnika ");
Serial.println(i, DEC);
}
}
Serial.print("T1: ");
Serial.println(sensors.getTempCByIndex(0));
Serial.print("T2: ");
Serial.println(sensors.getTempCByIndex(1));
Serial.print("T3: ");
Serial.println(sensors.getTempCByIndex(2));
Serial.print("T4: ");
Serial.println(sensors.getTempCByIndex(3));
temperature=sensors.getTempCByIndex(0);
t1=sensors.getTempCByIndex(1);
t2=sensors.getTempCByIndex(2);
t3=sensors.getTempCByIndex(3);
actTime = millis();
diffTime = actTime - prevTime;
if (diffTime >= 5000UL) {
for (byte i = 0; i < HistLengh - 1; i = i + 1) {
arrTemperature[i+1] = arrTemperature[i];
}
if (measureCnt<4){
measureCnt=measureCnt+1;
}
arrTemperature[0]=temperature;
prevTime = actTime;
}
TempRappidDown = (arrTemperature[0] - temperature) > 2;
TempUp = (arrTemperature[0] - temperature) < 0;
switch (state) {
case 0:
PWM_Percent=(potentiometer/1023.0)*100.0;
analogWrite(PWM_PIN, potentiometer/ 4);
digitalWrite(LED_PIN, HIGH);
if (TempRappidDown == true || temperature < 15.0){
state=1;
}
break;
case 1:
PWM_Percent=100.0;
analogWrite(PWM_PIN, 255);
digitalWrite(LED_PIN, LOW);
if (/*TempUp == true && */temperature > 27.0){
state=0;
}
break;
default:
PWM_Percent=100.0;
analogWrite(PWM_PIN, 255);
digitalWrite(LED_PIN, LOW);
if (sensors.isConnected(Thermometer[0])){
state=0;
}
break;
}
/* lcd.setCursor(0,0);
for (byte i = 0; i < HistLengh; i = i + 1) {
lcd.print(arrTemperature[i],1);
if (i<HistLengh-1)
{
lcd.print(",");
}
}
lcd.print((char)223);
lcd.println("C");
*/
lcd.setCursor(0,0);
lcd.print("T0:");
lcd.print(temperature,1);
lcd.print(", T1:");
lcd.print(t1,1);
lcd.print((char)223);
lcd.println("C");
lcd.setCursor(0,1);
lcd.print("T2:");
lcd.print(t2,1);
lcd.print(", T3:");
lcd.print(t3,1);
lcd.print((char)223);
lcd.println("C");
lcd.setCursor(0,2);
lcd.print("Tryb:");
switch (state) {
case 0:
lcd.println("normalny");
break;
case 1:
if (TempRappidDown==true){
lcd.println("defrost \x03");
}
else if(TempUp==true){
lcd.println("defrost \x04");
}
else{
lcd.println("defrost");
}
break;
default:
lcd.println("awaryjny");
break;
}
lcd.setCursor(0,3);
lcd.print("PWM:");
lcd.print(PWM_Percent);
lcd.println("%");
// Wait a few seconds between measurements.
}
// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
// function to print a device address
void printAddressLCD(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress[i] < 16) Serial.print("0");
lcd.print(deviceAddress[i], HEX);
}
}