this is my project:
ac voltage monitor and cut ac voltage if is below 180 and more than 240 ac volts, I used ZMPT101B to get ac voltage.
after reading ac voltage from sensor display does not update and it's freeze.
Here is my code:
#include <ZMPT101B.h>
#define timer_value 300000
#define SENSITIVITY 500.0f
#define Relay 4
#define a 5
#define b 6
#define c 7
#define d 8
#define e 9
#define f 10
#define g 11
#define dot 12
#define com1 13
#define com2 14
#define com3 15
#define com4 16
ZMPT101B voltageSensor(A5, 50.0);
unsigned long int last_cheked_millis = 0;
bool time_passed = false;
float values[] = {220.0, 220.0, 220.0, 220.0, 220.0};
int counter = 0;
float voltage = 0.0;
float value = 0.0;
void setup() {
voltageSensor.setSensitivity(SENSITIVITY);
pinMode(Relay, OUTPUT);
digitalWrite(Relay, LOW);
dislplay_init();
}
void loop() {
//display_value(123.4);
//delay(5);
value = sensor_read();
display_value(value);
//main_job(value);
}
short int mode_display = 0;
void dislplay_init(){
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(dot, OUTPUT);
pinMode(com1, OUTPUT);
pinMode(com2, OUTPUT);
pinMode(com3, OUTPUT);
pinMode(com4, OUTPUT);
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dot, HIGH);
digitalWrite(com1, LOW);
digitalWrite(com2, LOW);
digitalWrite(com3, LOW);
digitalWrite(com4, LOW);
}
void display_single_com_Anode(int character){
//common positive
switch (character){
case 0:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case 1:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 2:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case 3:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case 4:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 5:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 6:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 7:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 8:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 9:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
}
}
void display_value(float number){
// display_number((int(number / 100 ) ) ,(int(number) / 10) % 10, int(number) % 10, int(number * 10) % 10);
switch (mode_display){
case 0:
//display_single(int(number / 100), 0);
digitalWrite(com4, LOW);
display_single_com_Anode(number / 100);
digitalWrite(com1, HIGH);
mode_display++;
break;
case 1:
//display_single( (int(number)/10) % 10, 1);
digitalWrite(com1, LOW);
display_single_com_Anode( (int(number)/10) %10 );
digitalWrite(com2, HIGH);
mode_display++;
break;
case 2:
//display_single( (int(number) % 10) + 1, 2);
digitalWrite(com2, LOW);
display_single_com_Anode( int(number)%10 );
digitalWrite(dot, LOW);
digitalWrite(com3, HIGH);
mode_display++;
break;
case 3:
//display_single(int(number * 10) % 10, 3);
digitalWrite(com3, LOW);
digitalWrite(dot, HIGH);
display_single_com_Anode( int(number *10) %10 );
digitalWrite(com4, HIGH);
mode_display = 0;
break;
}
}
float sensor_read() {
float voltage = voltageSensor.getRmsVoltage();
values[counter] = voltage;
counter++;
if (counter >= 6) {
counter = 0;
}
int sum = 0;
for (int i = 0; i < 6; i++) {
sum += values[i];
}
return sum / 6;
}
void main_job(float voltage) {
if (time_passed) {
if ( (voltage < 180) || (voltage > 240) ) {
digitalWrite(Relay, LOW);
last_cheked_millis = millis();
time_passed = false;
} else {
digitalWrite(Relay, HIGH);
}
} else {
if ( millis() >= (timer_value + last_cheked_millis) ) {
time_passed = true;
}
}
}
display works perfectly fine if i don't use float voltage = voltageSensor.getRmsVoltage();
and any body can check my mathematics? needs to be sure Atmega chip process every value as float