/*
MODIFICA ADC I2C
http://forum.rcl-radio.ru/viewtopic.php?id=620&p=4
T:\Progetti\Programmazione\Arduino - Sorgenti\SK90 Project\SK90 - CONNESSIONE UDP FUNZIONANTE
*/
//#include <ESP8266WiFi.h>
//#include <WiFiUdp.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
//#include <Adafruit_ADS1X15.h>
//#include <Adafruit_MCP4725.h>
#include <OneButton.h>
#include "GyverEncoder.h"
#include <EEPROM.h>
#include <Wire.h>
#include <SPI.h>
// ENCODER
#define CLK 7 //pin D7
#define DT 5 //pin D5
#define SW 6 //pin D6
// BUTTON 1
#define btn1 4 //
OneButton btnEn(btn1, false, false); // button, active low, internal pullup
// ADC internal
//#define adc_batt 0 //pin A0
// OLED
#define SCREEN_ADDRESS 0x3C
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // -1 reset con arduino
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// EPROM
#define EEPROM_SIZE 1
#define KALL_I_IZ 1.020
#define KALL_U_IZ 0.970
#define KALL_I_DAC 410.00
#define KALL_U_DAC 395.00
#define ADDR1 0x60 // I
#define ADDR2 0x61 // U
// INPUT & OUTPUT
#define led1 2 // D4
#define powerEn 3 // D3
//#define led2 4 // D4
//Adafruit_MCP4725 dac1;
//Adafruit_MCP4725 dac2;
//Adafruit_ADS1015 ADS;
Encoder enc1(CLK, DT, SW);
int n, m, m1, page=0;
float tempRead, battRead;
float i_dig, u_dig, i_dig1;
float u_iz, i_iz, i_iz1;
long i_sum, u_sum, i_sum1;
bool w=1, w1, iu, power, enable, ledCheck;
long times, refresh_oled, flashTime, readTempTime, readAnalogTime, adsReadTime;
int setU, setI;
void setup(){
Serial.begin(115200);
//EEPROM.begin(EEPROM_SIZE); // !!!!decommentare su arduino!!!!
// ENCODER SETUP
enc1.setType(TYPE2);
//BUTTON SETUP
btnEn.attachClick(click1);
btnEn.attachDoubleClick(doubleClick1);
btnEn.attachLongPressStart(longPressStart1);
Wire.begin();
//ADS.begin();
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.display();
delay(200);
display.clearDisplay();
//pinMode(A0,INPUT);
//pinMode(7,INPUT);
pinMode(led1, OUTPUT);
pinMode(powerEn, OUTPUT);
//pinMode(led2, OUTPUT);
boot();
delay(2500);
firstPage();
delay(2500);
display.clearDisplay();
//dac1.begin(ADDR1);
//dac2.begin(ADDR2);
setU = EEPROM.read(0);
setI = EEPROM.read(1);
}
void loop(){
enc1.tick();
btnEn.tick();
//********* ENCODER SWITCH - SELEZIONE TENSIONE O CORRENTE *************************************************************************************************
if(enc1.isClick()){
if(iu==false){
iu=true;
w=1;
//w1=1;
} else {
iu=false;
w=1;
//w1=1;
}
}
//**********************************************************************************************************
//********** ENCODER - IMPOSTAZIONE TENSIONE E CORRENTE ************************************************************************************************
if(iu==true){
if(enc1.isRight()){setI++;page=0;w1=1;times=millis();}
if(enc1.isLeft()){setI--;page=0;w1=1;times=millis();}
if(setI<0){setI=0;}
if(setI>250){setI=250;}
w=1;
//w1=1;
}
if(iu==false){
if(enc1.isRight()){setU++;page=0;w1=1;times=millis();}
if(enc1.isLeft()){setU--;page=0;w1=1;times=millis();}
if(setU<0){setU=0;}
if(setU>250){setU=250;}
w=1;
//w1=1;
}
//********* LETTURA ANALOGICA TENSIONE E CORRENTE IN USCITA *************************************************************************************************
if((millis() - adsReadTime) > 1000){
adsReadTime = millis();
//i_dig = ADS.readADC_Differential_0_1();
i_sum = i_sum+i_dig;
n++;
if(n>9){
n=0;
i_iz=i_sum/10;
i_sum=0;} // 10 letture dell' ADC
//u_dig = ADS.readADC_Differential_2_3();
u_sum = u_sum+u_dig;
m++;
if(m>9){
m=0;
u_iz=u_sum/10;
u_sum=0;
w=1;} // 10 letture dell' ADC
}
//********** AGGIORNO PARAMTRI SUL DISPLAY ************************************************************************************************
//********** VISUALIZZO PAGAINA 0 ************************************************************************************************
if(w==1){
if((millis() - refresh_oled) > 200){
refresh_oled = millis();
display.clearDisplay();
if(page==0){
display.clearDisplay();
display.setTextSize(1); //font singolo
display.setCursor(97, 8);
display.print((setU/10.0),2); // scrivo Tensione impostata
display.setCursor(97, 25);
display.print((setI/100.00),2); // scrivo Corrente impostata
/*if(power == true){
display.setCursor(60, 4);
display.print("|");
}else{
display.setCursor(60, 4);
display.print("*");
}
if(power == HIGH){
display.setCursor(60, 4); // a lato della tensione letta
display.print("|");
}else{
display.setCursor(60, 4);
display.print("*");
}
*/
//**********************************************************************************************************
if(iu==false){ // set su Tensione "U"
display.setCursor(81,8); //x y
display.print(">");
display.setCursor(88,8);
display.print("U");
display.setCursor(81,25);
display.print(" ");
display.setCursor(88,25);
display.print("I");}
if(iu==true){ // set su Corrente "I"
display.setCursor(81,25);
display.print(">");
display.setCursor(88,25);
display.print("I");
display.setCursor(81,8);
display.print(" ");
display.setCursor(88,8);
display.print("U");}
//**********************************************************************************************************
//if(w1==1){dacV.setVoltage(4095.00/KALL_U_DAC*setU, false);} // DAC scrive valore tensione in uscita
//if(w1==1){dacI.setVoltage(4095.00/KALL_I_DAC*setI, false);} // DAC scrive valore corrente in uscita
//delay(10);
display.setTextSize(2); //font doppio
display.setCursor(0, 1);
display.println(u_iz*KALL_U_IZ/100.0,2);
display.setCursor(50,1);
display.println("V"); // scrivo lettura tensione in uscita
display.setCursor(0, 18);
display.println(i_iz*KALL_I_IZ/1000.0,2);
display.setCursor(50,18);
display.println("A");
display.display(); // scrivo lettura corrente in uscita
}
if(page==1){
display.clearDisplay();
display.setTextSize(2); //font singolo
display.setCursor(4, 4);
display.print("Temp");
//display.setTextSize(2);
display.setCursor(4, 25);
display.print(tempRead,1);
display.setCursor(60, 25);
display.print("C");
display.display();
}
if(page==2){
display.clearDisplay();
display.setTextSize(2); //font singolo
display.setCursor(4, 4);
display.print("Battery");
//display.setTextSize(2);
display.setCursor(4, 25);
display.print(battRead,2);
display.setCursor(60, 25);
display.print("V");
display.display();
}
}
}
//********** SALVO PARAMETRI SU EPROM ************************************************************************************************
if(millis()-times>5000 && w1==1){
times=millis();
EEPROM.write(0,setU);
EEPROM.write(1,setI);
ledFlash();
w1=0;
w=1;
//EEPROM.commit();
digitalWrite(led1, HIGH);
}
//******** BMP READINGS **************************************************************************************************
//if((millis() - readTempTime) > 2000){
//readTempTime = millis();
//tempRead = bmpTemp.readTemperature();
//}
/* Serial.print(F("Temperature = "));
Serial.print(bmpTemp.readTemperature());
Serial.println(" *C");
Serial.print(F("Pressure = "));
Serial.print(bmpTemp.readPressure());
Serial.println(" Pa");
Serial.print(F("Approx altitude = "));
Serial.print(bmpTemp.readAltitude(1017.7)); /* Adjusted to local forecast!
Serial.println(" m");
Serial.println();
delay(1000);
*/
//******** ANALOG READINGS **************************************************************************************************
//if((millis() - readAnalogTime) > 5000){
//readAnalogTime = millis();
//battRead = ((analogRead(adc_batt)*3.3)/1024);
//}
}
//**********************************************************************************************************
//********* VISUALIZZO LOGO DI AVVIO *************************************************************************************************
void boot(){
display.setTextColor(SSD1306_WHITE);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(29, 25);
display.print("SerTech");
display.display();
}
//********* VISUALIZZO LA PRIMA PAGINA INFO ALL'AVVIO *************************************************************************************************
void firstPage(){
display.clearDisplay();
display.setTextSize(1);
display.setCursor(30,25);
display.print("Power Supply");
display.setCursor(30,40);
display.print("0-25V 0-2.5A");
display.display();
}
//********* VISUALIZZO INFORMAZIONI PER FALLITA CONNESSIONE WIFI *************************************************************************************************
void wifiScreen(){
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.print("WiFi ERROR");
display.setTextSize(1);
display.setCursor(0,16);
display.print("Starting AP: ");
display.setCursor(0,30);
//display.print(WiFi.softAPIP());
display.display();
}
//********* VISUALIZZO INFORMAZIONI PER FALLITA CONNESSIONE ADS1115 *************************************************************************************************
void adsError(){
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.print("ADSxx ERROR");
display.setTextSize(1);
display.setCursor(0,16);
display.print("Check conn. ADS1115");
display.setCursor(0,30);
display.print("Restart device");
display.display();
}
//********* VISUALIZZO INFORMAZIONI PER FALLITA CONNESSIONE DAC MCP4725 *************************************************************************************************
void dacVError(){
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.print("DAC_V ERROR");
display.setTextSize(1);
display.setCursor(0,16);
display.print("Check conn. MCP4725");
display.setCursor(0,30);
display.print("Restart device");
display.display();
}
//********* VISUALIZZO INFORMAZIONI PER FALLITA CONNESSIONE DAC MCP4725 *************************************************************************************************
void dacIError(){
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.print("DAC_I ERROR");
display.setTextSize(1);
display.setCursor(0,16);
display.print("Check conn. MCP4725");
display.setCursor(0,30);
display.print("Restart device");
display.display();
}
//********** ACCESS POINT CALLBACK ************************************************************************************************
//void configModeCallback (WiFiManager *myWiFiManager){ // MODIFICHE VERSINE V2.
//wifiScreen();
//Serial.print("Modalità configurazione WIFI: ");
//Serial.println(WiFi.softAPIP());
//Serial.println(myWiFiManager->getConfigPortalSSID());
//}
//********** LAMPEGGIO LED FUNZIONE ************************************************************************************************
void ledFlash(){
if(millis()-flashTime > 100 && w1==1){
flashTime = millis();
digitalWrite(led1, LOW);
}
}
//********** GESTIONE SINGOLO CLICK PULSNTE 1 ************************************************************************************************
void click1(){
Serial.println("pulsante premuto!");
digitalWrite(powerEn,!digitalRead(powerEn));
power = !power;
}
//********** GESTIONE DOPPIO CLICK PULSNTE 1 ************************************************************************************************
void doubleClick1(){
if(page < 2){
page++;}
else {
page = 0;
}
Serial.println("pulsante premuto due volte!");
}
//********** GESTIONE CLICK LUNGO PULSNTE 1************************************************************************************************
void longPressStart1(){
Serial.println("Reset Credenziali AP-ESP");
//WiFi.disconnect(false,true);
delay(1000);
//ESP.reset();
}
//**********************************************************************************************************
//display.drawLine(0, 15, 126, 15, WHITE);
//display.drawLine(69, 17, 69, 63, WHITE); //vertical line
//display.drawRect(0, 0, 127, 15, WHITE);
//display.drawRect(0, 17, 127, 47, WHITE);