#include <LiquidCrystal_I2C.h>
#include <I2CKeyPad.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4
uint8_t sens1[8]{0x10, 0x6F, 0x9D, 0x87, 0x67, 0x99, 0xC4, 0x1D};
uint8_t sens2[8]{0x10, 0x7F, 0x9D, 0x87, 0x67, 0x99, 0xC4, 0x46};
uint8_t sens3[8]{0x10, 0x5F, 0x9D, 0x87, 0x67, 0x99, 0xC4, 0xF0};
uint8_t sens4[8]{0x10, 0x8F, 0x9D, 0x87, 0x67, 0x99, 0xC4, 0x34};
uint8_t sens5[8]{0x10, 0x4F, 0x9D, 0x87, 0x67, 0x99, 0xC4, 0xAB};
uint8_t sens6[8]{0x10, 0x9F, 0x9D, 0x87, 0x67, 0x99, 0xC4, 0x6F};
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
I2CKeyPad keyPad(0x38);
char keypad_layout[19] = "123A456B789C.0#DNF";
char chOld='F';
LiquidCrystal_I2C lcd(0x27, 20, 4);
unsigned long lastTempRequest;
unsigned int delayInMillis;
unsigned int workTimeOld=0;
int radPlus=5;
int radMinus=6;
int floorPlus=7;
int floorMinus=8;
void setup(){
sensors.begin();
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
lastTempRequest = millis();
delayInMillis = 1000;
lcd.init();
lcd.backlight();
//lcd.setCursor(0,3);
//lcd.print("12345678901234567890");
keyPad.loadKeyMap(keypad_layout);
pinMode(radPlus, OUTPUT);
pinMode(radMinus, OUTPUT);
pinMode(floorPlus, OUTPUT);
pinMode(floorMinus, OUTPUT);
digitalWrite(radPlus, LOW);
digitalWrite(radMinus, LOW);
digitalWrite(floorPlus, LOW);
digitalWrite(floorMinus, LOW);
}
int workTime=0;
unsigned int chars=0;
float t1, t2, t3, t4, t5, t6;
float t1o, t2o, t3o, t4o, t5o, t6o=-300.00;
int printDiff;
char ch;
char usrInput[5];
unsigned int menuMem=0;
bool usrInputComma=0;
unsigned int usrInputLength=0;
unsigned long currentMillis;
unsigned long radTurnStart;
unsigned long lastRadTurn;
unsigned long turnDur=1000;
unsigned long turnInterval=10000;
unsigned long floorTurnStart;
unsigned long lastFloorTurn;
float radInTemp=60.00;
float radMin=15.00;
float radMax=90.00;
float floorInTemp=30.00;
float floorMin=15.00;
float floorMax=45.00;
bool radStatus=0;
bool floorStatus=0;
float radHyst=10.00;
float floorHyst=10.00;
int usrCursor;
void loop(){
currentMillis=millis();
if(millis()-lastTempRequest>=delayInMillis){
t1=(sensors.getTempC(sens1)+90)*0.4;
t2=(sensors.getTempC(sens2)+55)*0.5;
t3=sensors.getTempC(sens3)/2+55;
t4=sensors.getTempC(sens4)/2+55;
t5=sensors.getTempC(sens5)/2+55;
t6=sensors.getTempC(sens6)/2+55;
sensors.requestTemperatures();
lastTempRequest=millis();
}
if(t1o!=t1){
lcd.setCursor(0,0);
lcd.print(t1);
lcd.write('C');
if(String(t1o).length()>String(t1).length()){
printDiff=String(t1o).length()-String(t1).length();
for(int i=0; i<printDiff; i++){
lcd.write(' ');
}
}
t1o=t1;
}
if(t2o!=t2){
lcd.setCursor(12,0);
lcd.print(t2);
lcd.write('C');
if(String(t2o).length()>String(t2).length()){
printDiff=String(t2o).length()-String(t2).length();
for(int i=0; i<printDiff; i++){
lcd.write(' ');
}
}
t2o=t2;
}
if(t3o!=t3){
lcd.setCursor(0,1);
lcd.print(t3);
lcd.write('C');
if(String(t3o).length()>String(t3).length()){
printDiff=String(t3o).length()-String(t3).length();
for(int i=0; i<printDiff; i++){
lcd.write(' ');
}
}
t3o=t3;
}
if(t4o!=t4){
lcd.setCursor(12,1);
lcd.print(t4);
lcd.write('C');
if(String(t4o).length()>String(t4).length()){
printDiff=String(t4o).length()-String(t4).length();
for(int i=0; i<printDiff; i++){
lcd.write(' ');
}
}
t4o=t4;
}
if(t5o!=t5){
lcd.setCursor(0,2);
lcd.print(t5);
lcd.write('C');
if(String(t5o).length()>String(t5).length()){
printDiff=String(t5o).length()-String(t5).length();
for(int i=0; i<printDiff; i++){
lcd.write(' ');
}
}
t5o=t5;
}
if(t6o!=t6){
lcd.setCursor(12,2);
lcd.print(t6);
lcd.write('C');
if(String(t6o).length()>String(t6).length()){
printDiff=String(t6o).length()-String(t6).length();
for(int i=0; i<printDiff; i++){
lcd.write(' ');
}
}
t6o=t6;
}
/*workTime=millis()-workTime;
if(workTime!=workTimeOld && workTime>0){
lcd.setCursor(0,3);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(workTime);
workTimeOld=workTime;
}*/
ch = keyPad.getChar();
if(ch!='F' && ch!=chOld){
chOld=ch;
if(ch=='A'){
menuMem++;
for(int i=0; i<5; i++){
usrInput[i]='\0';
}
for(int i=0; i<20; i++){
lcd.setCursor(i,3);
lcd.write(' ');
}
if(menuMem>2){
menuMem=0;
}
}
if(menuMem>0){
if(isdigit(ch) || ch=='.'){
if(usrInputLength==4){
usrInputLength=0;
usrInputComma=0;
for(int i=0; i<4; i++){
usrInput[i]='\0';
lcd.setCursor(usrCursor+i,3);
lcd.write(' ');
}
}
if(usrInputLength==0){
for(int i=0; i<4; i++){
lcd.setCursor(usrCursor+i,3);
lcd.write(' ');
}
}
if(ch=='.'){
usrInput[usrInputLength]='.';
if(usrInputComma==1){
usrInputLength--;
}
usrInputLength++;
usrInputComma=1;
}else{
usrInput[usrInputLength]=ch;
usrInputLength++;
}
lcd.setCursor(usrCursor,3);
lcd.print(usrInput);
}
lcd.setCursor(0,3);
if(menuMem==1){
lcd.print("Set Floor: ");
usrCursor=11;
lcd.setCursor(16,3);
lcd.print(floorInTemp,1);
if(ch=='#'){
if(atof(usrInput)>=floorMin && atof(usrInput)<=floorMax){
floorInTemp=atof(usrInput);
lcd.setCursor(16,3);
lcd.print(floorInTemp,1);
for(int i=0; i<4; i++){
lcd.setCursor(usrCursor+i,3);
lcd.write(' ');
}
}
if(atof(usrInput)<floorMin){
lcd.setCursor(0,3);
lcd.print("Floor min: ");
lcd.print(floorMin,1);
}
if(atof(usrInput)>floorMax){
lcd.setCursor(0,3);
lcd.print("Floor max: ");
lcd.print(floorMax,1);
}
for(int i=0; i<4; i++){
usrInput[i]='\0';
}
usrInputLength=0;
usrInputComma=0;
}
}
if(menuMem==2){
lcd.print("Set Rad: ");
usrCursor=9;
lcd.setCursor(16,3);
lcd.print(radInTemp,1);
if(ch=='#'){
if(atof(usrInput)>=radMin && atof(usrInput)<=radMax){
radInTemp=atof(usrInput);
lcd.setCursor(16,3);
lcd.print(radInTemp,1);
for(int i=0; i<4; i++){
lcd.setCursor(usrCursor+i,3);
lcd.write(' ');
}
}
if(atof(usrInput)<radMin){
lcd.setCursor(0,3);
lcd.print("Rad min: ");
lcd.print(radMin,1);
}
if(atof(usrInput)>radMax){
lcd.setCursor(0,3);
lcd.print("rad max: ");
lcd.print(radMax,1);
}
for(int i=0; i<4; i++){
usrInput[i]='\0';
}
usrInputLength=0;
usrInputComma=0;
}
}
}
}
if(ch=='F'){
chOld='F';
}
if(radStatus==0 && millis()-lastRadTurn>=turnInterval){
if(t1<=radInTemp-radHyst){
digitalWrite(radPlus, HIGH);
radTurnStart=millis();
radStatus=1;
}
if(t1>=radInTemp+radHyst){
digitalWrite(radMinus, HIGH);
radTurnStart=millis();
radStatus=1;
}
}
if(radStatus==1 && millis()-radTurnStart>=turnDur){
digitalWrite(radPlus, LOW);
digitalWrite(radMinus, LOW);
lastRadTurn=millis();
radStatus=0;
}
if(floorStatus==0 && millis()-lastFloorTurn>=turnInterval){
if(t2<=floorInTemp-floorHyst){
digitalWrite(floorPlus, HIGH);
floorTurnStart=millis();
floorStatus=1;
}
if(t2>=floorInTemp+floorHyst){
digitalWrite(floorMinus, HIGH);
floorTurnStart=millis();
floorStatus=1;
}
}
if(floorStatus==1 && millis()-floorTurnStart>=turnDur){
digitalWrite(floorPlus, LOW);
digitalWrite(floorMinus, LOW);
lastFloorTurn=millis();
floorStatus=0;
}
}
/*
* Rui Santos
* Complete Project Details http://randomnerdtutorials.com
*
/*
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 4 on the Arduino
#define ONE_WIRE_BUS 4
// 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);
int numberOfDevices; // Number of temperature devices found
DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address
void setup(void) {
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(numberOfDevices, DEC);
Serial.println(" devices.");
// Loop through each device, print out address
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i)) {
Serial.print("Found device ");
Serial.print(i, DEC);
Serial.print(" with address: ");
printAddress(tempDeviceAddress);
Serial.println();
} else {
Serial.print("Found ghost device at ");
Serial.print(i, DEC);
Serial.print(" but could not detect address. Check power and cabling");
}
}
}
void loop(void) {
/* sensors.requestTemperatures(); // Send the command to get temperatures
// Loop through each device, print out temperature data
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i)){
// Output the device ID
Serial.print("Temperature for device: ");
Serial.println(i,DEC);
// Print the data
float tempC = sensors.getTempC(tempDeviceAddress);
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}
}
delay(5000);
}
// 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);
}
}*/
/*
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 4
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// variable to hold device addresses
DeviceAddress Thermometer;
int deviceCount = 0;
void setup(void)
{
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
// locate devices on the bus
Serial.println("Locating devices...");
Serial.print("Found ");
deviceCount = sensors.getDeviceCount();
Serial.print(deviceCount, DEC);
Serial.println(" devices.");
Serial.println("");
Serial.println("Printing addresses...");
for (int i = 0; i < deviceCount; i++)
{
Serial.print("Sensor ");
Serial.print(i+1);
Serial.print(" : ");
sensors.getAddress(Thermometer, i);
printAddress(Thermometer);
}
}
void loop(void)
{}
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
Serial.print("0x");
if (deviceAddress[i] < 0x10) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
if (i < 7) Serial.print(", ");
}
Serial.println("");
}*/