7-segment display stops

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

What does the display show when that voltageSensor line is present?

Read
"How to get the best out of this forum

Which arduino are you using?
Post a schematic of your project.

Is the displayed voltage the same as the measured voltage, and is that voltage unchanging, and only appears to not update? Your code works well, [EDIT] but this was commented-out[/EDIT], not allowing the voltage cut below 180 and above 240.

And the timeout here was 5 minutes (300000ms = 300 seconds) Warmup time?

Here it is in the simulation (I made the above two changes)

... and substituted a potentiometer for ZMPT101B

  // float voltage = voltageSensor.getRmsVoltage(); // FOR SIMULATION
  float voltage = map(analogRead(A5), 0, 1023, 150, 300); //  FOR SIMULATION

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.