#include <SPI.h>

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
constexpr uint8_t Sync = 2;
int sensorValue;
int cyccnt = 0;
byte stcur = 1; // stato corrente di fase
int Volt_pin = A0;
int MaxVolt = 0;
long MedVolt = 0;
double Volt;
int DeVolt;
int Amp2_pin=A2; // corrente assorbita
int MinAmp2 = 1023;
int MaxAmp2 = 0;
long MedAmp2 = 0;
double Amp2 = 0;
int DeAmp2;
byte MaxVerso2;
byte AMax2 = 0;
unsigned int WattSec2;
void setup()
{
pinMode(Sync, INPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
while(digitalRead(Sync) == LOW){} // Attende di sincronizzarsi alla fase positiva
}
void loop()
{
if(stcur == 0){
if (digitalRead(Sync) == HIGH){ // Registra la transizione a fase positiva
stcur = 1; // fase positiva diventa la fase corrente
cyccnt = cyccnt + 1; // conta il numero di cicli
DeVolt = MaxVolt;
MedVolt = MedVolt + DeVolt;
DeAmp2 = MaxAmp2 - MinAmp2;
MedAmp2 = MedAmp2 + DeAmp2;
AMax2 = AMax2 + MaxVerso2;
MaxVolt = 0;
MinAmp2 = 1023;
MaxAmp2 = 0;
if(cyccnt == 48){ // Ha effettuato medie per un secondo
MedVolt = MedVolt + 2*DeVolt;
MedAmp2 = MedAmp2 + 2*DeAmp2;
Volt = 0.004711*double(MedVolt) + 35; // taratura corrente
Amp2 = 0.0010255*double(MedAmp2) - 0.045; // taratura corrente
WattSec2 = int((Volt*Amp2) + 0.5);
display.clearDisplay();
display.setCursor(0,0);
display.print("V");
display.println(int(Volt + 0.5));
if(AMax2 < 25) display.print(" -");
else display.print(" +");
display.print("C");
display.println(WattSec2);
MedVolt = 0;
MedAmp2 = 0;
AMax2 = 0;
cyccnt = 0;
while(digitalRead(Sync) == LOW){ // Risincronizzazione
}
stcur = 1;
}
}
}
else {
if (digitalRead(Sync) == 0){
stcur = 0;
}
}
sensorValue = analogRead(Volt_pin);
if(sensorValue>MaxVolt) MaxVolt=sensorValue;
sensorValue = analogRead(Amp2_pin);
if(sensorValue if(sensorValue>MaxAmp2) {
MaxAmp2=sensorValue;
MaxVerso2 = stcur;
}
}