#include <SerialCommand.h>
#include <SPI.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h> //https://github.com/milesburton/Arduino-Temperature-Control-Library
#include <Adafruit_GFX.h> //https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_SSD1306.h> //https://github.com/adafruit/Adafruit_SSD1306
#include <PID_v1.h> //https://github.com/br3ttb/Arduino-PID-Library
#define encoder0PinA 2
#define encoder0PinB 3
#define ONE_WIRE_BUS 8
#define OLED_RESET 4
#define WindowSize 4000
#define screenSaverDelay 30000
#define gX0 59 //Screen saver max left so that text is not going into new line
#define gY0 8
#define gH 25
#define gW 6
#define RelayPin 13
byte ssaverx= 40;
byte ssavery= 20;
boolean LCDPC=0;
boolean stringComplete = false;
unsigned long windowStartTime;
byte screenSaverStartTime;
byte tempStartTime;
unsigned long now;
double Setpoint, Input, Output;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);
Adafruit_SSD1306 display(OLED_RESET);
SerialCommand sCmd;
void setup(){
//Set ENCODER
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // turn on pullup resistor
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // turn on pullup resistor
attachInterrupt(0, doEncoder, CHANGE);
//END Set ENCODER
Serial.begin(9600);
Serial.println(F("Online\r\n"));
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
display.display();
sensors.begin();
sensors.requestTemperatures();
Input = sensors.getTempCByIndex(0);
windowStartTime = millis();
Setpoint = 10.0;
screenSaverStartTime=0;
tempStartTime=0;
myPID.SetOutputLimits(0, WindowSize);
myPID.SetMode(AUTOMATIC);
sCmd.addCommand("!1", Temperatura);
//sCmd.addCommand("!2", setLCDPC); //Comented because there is not enough SRAM !2,0\n\r turns on temperature info from arduino !2,1\n\r clears display and then you can draw or display custom text
//sCmd.addCommand("!3", setLCDTXT); //set OLED custom text in format !3, X position, Y postion, Font size (1-4), text message (!3,0,0,1,test message\n\r)
//sCmd.addCommand("!4",setLCDPIXEL); // !4,0,0\n\r turns on pixel on first pixel top left. Can be used to draw custom images from PC or...
//sCmd.addCommand("!5", setLCDC); // !5\n\r Clears display
sCmd.addCommand("!6", setDisplayData);
pinMode(RelayPin, OUTPUT);
delay(4000);
display.clearDisplay();
}
void doEncoder() { //Read encoder and set manualy defined temperature.
screenSaverStartTime=0; //Turn off screen saver
if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
Setpoint=Setpoint+0.05;
}
else {
Setpoint=Setpoint-0.05;
}
}
void loop() {
sCmd.readSerial();
myPID.Compute();
now = millis();
if(now - windowStartTime>WindowSize)
{
windowStartTime += WindowSize;
ssaverx=random(5,68);
ssavery=random(0,43);
screenSaverStartTime++;
tempStartTime++;
if (tempStartTime>4){
sensors.requestTemperatures();
Input = sensors.getTempCByIndex(0);
tempStartTime=0;
}
if (screenSaverStartTime>10){
screenSaverStartTime=100;
}
}
if(Output > now - windowStartTime){
digitalWrite(RelayPin,HIGH);
}
else {
digitalWrite(RelayPin,LOW);
}
if (LCDPC == 0){
if (screenSaverStartTime>10){
screensaver();
}
else{
powerGraph();
}
}
}
void screensaver(){
setBrightness(display,1);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(ssaverx,ssavery);
display.print(Input,1);
display.setTextSize(1);
display.print(F("o"));
display.setCursor(ssaverx-2,ssavery+15);
display.print(Setpoint,1);
display.print(F("C-"));
display.print(map(Output,0,WindowSize,0,100));
//display.print(F("%"));
if (digitalRead(RelayPin)==HIGH){
display.print(F("H"));
}
else{
display.print(F("L"));
}
// display.print(freeMemory());
display.display();
}//*********************************************END screensaver
void powerGraph(){
setBrightness(display,255);
display.fillRect(0,0, 127, 63, BLACK);
display.setTextColor(WHITE);
display.drawRect(0,6, 50, 27, WHITE);
display.setTextSize(1);
display.setCursor(2,8);
display.print(F("Temp"));
display.setCursor(2,17);
display.setTextSize(2);
display.print(Input,1);
display.drawRect(77,6, 50, 27, WHITE);
display.setTextSize(1);
display.setCursor(78,8);
display.print(F("Def"));
display.setCursor(78,17);
display.setTextSize(2);
display.print(Setpoint,1);
display.fillRect(gX0, gY0, gW, gH, BLACK);
display.drawRect(gX0, gY0, gW, gH, WHITE);
display.fillRect(gX0,gY0+gH-map(Output,0,WindowSize,0,gH),gW,map(Output,0,WindowSize,0,gH),WHITE);
display.setTextSize(1);
display.setCursor(52,0);
if (map(Output,0,WindowSize,0,100)<100) display.setCursor(55,0);
if (map(Output,0,WindowSize,0,100)<10) display.setCursor(57,0);
display.print(map(Output,0,WindowSize,0,100));
display.print(F("%"));
if (digitalRead(RelayPin)==HIGH){
display.fillCircle(62,38,4,WHITE);
}
else{
display.fillCircle(62,38,4,BLACK);
}
// display.setCursor(0,50);
// display.print(freeMemory());
display.display();
}//*********************************************END powerGraph
void setBrightness(Adafruit_SSD1306 display, uint8_t brightness)
{
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(brightness);
}//*********************************************END setBrightness
void Temperatura() {
char *arg;
arg = sCmd.next();
if (arg != NULL) {
Setpoint = atoi(arg);
Setpoint = Setpoint/10;
Serial.print(F("print\""));
Serial.print(Setpoint);
Serial.println(F("\""));
}
}//*********************************************END Temperatura
// Code commented because of insuficient SRAM :(
// void setLCDPC(){
// char *arg;
// arg = sCmd.next();
// if (arg != NULL) {
// LCDPC = atoi(arg);
// }
// if (LCDPC == 1){
// display.fillRect(0, 0, 127, 63, BLACK);
// display.display();
// }
// else{
// screenSaverStartTime=0;
// }
// Serial.print(F("print\""));
// Serial.print(LCDPC,DEC);
// Serial.println(F("\""));
// }//*********************************************END setLCDPC
// void setLCDC(){
// display.fillRect(0,0, 127, 63, BLACK);
// display.display();
// Serial.println(F("print\"OK\""));
// }//*********************************************END setLCDC
// void setLCDTXT(){
// byte lcdtxtv1;
// byte lcdtxtv2;
// setBrightness(display,255);
// display.setTextColor(WHITE);
// char *arg;
// arg = sCmd.next();
// if (arg != NULL) {
// lcdtxtv1 = atoi(arg);
// }
// arg = sCmd.next();
// if (arg != NULL) {
// lcdtxtv2 = atoi(arg);
// }
// display.setCursor(lcdtxtv1,lcdtxtv2);
// arg = sCmd.next();
// if (arg != NULL) {
// lcdtxtv1 = atoi(arg);
// }
// display.setTextSize(lcdtxtv1);
// arg = sCmd.next();
// if (arg != NULL) {
// }
// display.print(arg);
// display.display();
// Serial.println(F("print\"OK\""));
// }
//*********************************************END setLCDTXT
void setDisplayData(){
Serial.print(F("print\""));
Serial.print(Input,2);
Serial.print(F(","));
Serial.print(Output,0);
Serial.print(F(","));
Serial.print(Setpoint,1);
Serial.println(F("\""));
}//*********************************************END setDisplayData
// void setLCDPIXEL(){
// byte lcdtxtv1;
// byte lcdtxtv2;
// char *arg;
// arg = sCmd.next();
// if (arg != NULL) {
// lcdtxtv1 = atoi(arg);
// }
// arg = sCmd.next();
// if (arg != NULL) {
// lcdtxtv2 = atoi(arg);
// }
// display.drawPixel(lcdtxtv1,lcdtxtv2,WHITE);
// display.display();
// }