While true problem

i cant put break in the while loop because the result changes, as i have had researched i can put break to exit the loop but the reading of the sensor zmpt101b is wrong.

#include <SPI.h>
#include <Wire.h>
#include <Filters.h>
#include <LiquidCrystal_I2C.h> // Add the LCD library

#define TEMPERATURE1_IN_PIN A0
#define HUMIDITY1_PIN A1
#define TEMPERATURE2_IN_PIN A2
#define HUMIDITY2_PIN A3
#define ACSensor_PIN A6

float temperature1;
float humidity1;
float temperature2;
float humidity2;
float acsenosor2;

// Floats for resistor values in divider (in ohms)
float R1 = 30000.0;
float R2 = 7500.0;

// Float for Reference Voltage
float ref_voltage = 5.0;

// Integer for ADC values
int temperature1_adc_value = 0;
int humidity1_adc_value = 0;
int temperature2_adc_value = 0;
int humidity2_adc_value = 0;

// LCD display variables
LiquidCrystal_I2C lcd2(0x27, 16, 2); // I2C address may vary, use the correct address for your module
LiquidCrystal_I2C lcd1(0x26, 16, 2); // I2C address may vary, use the correct address for your module

// Custom character data
byte waterDroplet[] = {
  B00100,
  B00100,
  B01010,
  B01010,
  B10001,
  B10001,
  B10001,
  B01110
};

byte thermometer[] = {
  B00100,
  B01010,
  B01010,
  B01110,
  B01110,
  B11111,
  B11111,
  B01110
};

const int numSamples = 10; // Number of samples for moving average
float temperatureSamples1[numSamples];
float humiditySamples1[numSamples];
float temperatureSamples2[numSamples];
float humiditySamples2[numSamples];
int currentIndex = 0;

float testFrequency = 50;
float windowLength = 40.0 / testFrequency;

int Sensor = 0;

float intercept = -0.04;
float slope = 0.0405;
float current_Volts;

unsigned long printPeriod = 1000;
unsigned long previousMillis = 0;

void setup() {
  Serial.begin(9600);

  // Initialize LCD display
  lcd1.init();
  lcd1.backlight();
  lcd2.init();
  lcd2.backlight();

  // Create custom characters
  lcd1.createChar(0, waterDroplet);
  lcd1.createChar(1, thermometer);
  lcd2.createChar(0, waterDroplet);
  lcd2.createChar(1, thermometer);

  // Display custom characters
  lcd1.setCursor(0, 0);
  lcd1.write((uint8_t)0); // Water droplet character
  lcd1.setCursor(1, 0);
  lcd1.write((uint8_t)1); // Thermometer character
  lcd2.setCursor(0, 0);
  lcd2.write((uint8_t)0); // Water droplet character
  lcd2.setCursor(1, 0);
  lcd2.write((uint8_t)1); // Thermometer character
}

void loop() {
  // Read the analog inputs
  temperature1_adc_value = analogRead(TEMPERATURE1_IN_PIN);
  humidity1_adc_value = analogRead(HUMIDITY1_PIN);
  temperature2_adc_value = analogRead(TEMPERATURE2_IN_PIN);
  humidity2_adc_value = analogRead(HUMIDITY2_PIN);

  // Determine voltage at temperature1 ADC input
  float temperature1_adc_voltage = (temperature1_adc_value * ref_voltage) / 1023.0;
  // Calculate voltage at temperature divider input
  float temperature1_in_voltage = temperature1_adc_voltage / (R2 / (R1 + R2));

  // Determine voltage at humidity1 ADC input
  float humidity1_adc_voltage = (humidity1_adc_value * ref_voltage) / 1023.0;
  // Calculate humidity voltage
  float humidity1_in_voltage = humidity1_adc_voltage / (R2 / (R1 + R2));

  // Determine voltage at temperature2 ADC input
  float temperature2_adc_voltage = (temperature2_adc_value * ref_voltage) / 1023.0;
  // Calculate voltage at temperature divider input
  float temperature2_in_voltage = temperature2_adc_voltage / (R2 / (R1 + R2));

  // Determine voltage at humidity2 ADC input
  float humidity2_adc_voltage = (humidity2_adc_value * ref_voltage) / 1023.0;
  // Calculate humidity voltage
  float humidity2_in_voltage = humidity2_adc_voltage / (R2 / (R1 + R2));

  // Calculate temperature
  float x1 = (temperature1_in_voltage) * 100;
  float temperature1 = map(x1, 0, 1000, -2000, 6000) / 100.0;
  float x2 = (temperature2_in_voltage) * 100;
  float temperature2 = map(x2, 0, 1000, -2000, 6000) / 100.0;

  // Calculate humidity
  float y1 = (humidity1_in_voltage) * 1000;
  float humidity1 = map(y1, 0, 100000, 0, 10000);
  humidity1 = humidity1 / 10;
  float y2 = (humidity2_in_voltage) * 1000;
  float humidity2 = map(y2, 0, 100000, 0, 10000);
  humidity2 = humidity2 / 10;

  // Store the current readings in the array
  temperatureSamples1[currentIndex] = temperature1;
  humiditySamples1[currentIndex] = humidity1;
  temperatureSamples2[currentIndex] = temperature2;
  humiditySamples2[currentIndex] = humidity2;

  // Increment the index, and wrap around if necessary
  currentIndex = (currentIndex + 1) % numSamples;

  // Calculate the moving average for temperature
  float temperatureSum1 = 0;
  for (int i = 0; i < numSamples; i++) {
    temperatureSum1 += temperatureSamples1[i];
  }
  float temperatureMovingAverage1 = temperatureSum1 / numSamples;

  // Calculate the moving average for humidity
  float humiditySum1 = 0;
  for (int i = 0; i < numSamples; i++) {
    humiditySum1 += humiditySamples1[i];
  }
  float humidityMovingAverage1 = humiditySum1 / numSamples;

  float temperatureSum2 = 0;
  for (int i = 0; i < numSamples; i++) {
    temperatureSum2 += temperatureSamples2[i];
  }
  float temperatureMovingAverage2 = temperatureSum2 / numSamples;

  // Calculate the moving average for humidity
  float humiditySum2 = 0;
  for (int i = 0; i < numSamples; i++) {
    humiditySum2 += humiditySamples2[i];
  }
  float humidityMovingAverage2 = humiditySum2 / numSamples;

  // Print temperature and humidity values to Serial Monitor
  Serial.print("Temperature Set 1: ");
  Serial.print(temperatureMovingAverage1);
  Serial.print(" °C, Humidity Set 1: ");
  Serial.print(humidityMovingAverage1);
  Serial.println(" %");

  Serial.print("Temperature Set 2: ");
  Serial.print(temperatureMovingAverage2);
  Serial.print(" °C, Humidity Set 2: ");
  Serial.print(humidityMovingAverage2);
  Serial.println(" %");

  // Display temperature
  lcd1.setCursor(0, 0);
  lcd1.write((uint8_t)1); // Thermometer character
  lcd1.print(temperatureMovingAverage2);
  lcd1.write(0xDF); // Degree symbol
  lcd1.print("C");

  // Display humidity
  lcd1.setCursor(0, 1);
  lcd1.write((uint8_t)0); // Water droplet character
  lcd1.print(humidityMovingAverage2);
  lcd1.print("%");

  // Display temperature
  lcd2.setCursor(0, 0);
  lcd2.write((uint8_t)1); // Thermometer character
  lcd2.print(temperatureMovingAverage2);
  lcd2.write(0xDF); // Degree symbol
  lcd2.print("C");

  // Display humidity
  lcd2.setCursor(0, 1);
  lcd2.write((uint8_t)0); // Water droplet character
  lcd2.print(humidityMovingAverage2);
  lcd2.print("%");

  // Voltage measurement
  RunningStatistics inputStats;
  inputStats.setWindowSecs(windowLength);

  while (true) {
    Sensor = analogRead(ACSensor_PIN);
    inputStats.input(Sensor);

    if ((unsigned long)(millis() - previousMillis) >= printPeriod) {
      previousMillis = millis();

      current_Volts = intercept + slope * inputStats.sigma();
      current_Volts = current_Volts * (40.3231);

      Serial.print("\tVoltage: ");
      Serial.print(current_Volts);
      Serial.println(" V");
      
    }
    
}

  delay(100);
}

this is the result

15:55:34.930 -> Temperature Set 1: 6.29 °C, Humidity Set 1: 0.00 %

15:55:34.964 -> Temperature Set 2: -0.05 °C, Humidity Set 2: 4.17 %

15:55:35.036 -> Voltage: 0.98 V

15:55:36.005 -> Voltage: 244.17 V

15:55:37.001 -> Voltage: 112.88 V

15:55:37.985 -> Voltage: 107.63 V

15:55:38.990 -> Voltage: 108.54 V

15:55:39.984 -> Voltage: 107.65 V

15:55:40.981 -> Voltage: 108.13 V

15:55:41.999 -> Voltage: 107.64 V

15:55:43.004 -> Voltage: 107.99 V

15:55:44.012 -> Voltage: 106.41 V

15:55:44.989 -> Voltage: 106.17 V

15:55:45.972 -> Voltage: 106.03 V

15:55:47.005 -> Voltage: 106.41 V

but when i put break so the other codes would lookp, like this

#include <SPI.h>
#include <Wire.h>
#include <Filters.h>
#include <LiquidCrystal_I2C.h> // Add the LCD library

#define TEMPERATURE1_IN_PIN A0
#define HUMIDITY1_PIN A1
#define TEMPERATURE2_IN_PIN A2
#define HUMIDITY2_PIN A3
#define ACSensor_PIN A6

float temperature1;
float humidity1;
float temperature2;
float humidity2;
float acsenosor2;

// Floats for resistor values in divider (in ohms)
float R1 = 30000.0;
float R2 = 7500.0;

// Float for Reference Voltage
float ref_voltage = 5.0;

// Integer for ADC values
int temperature1_adc_value = 0;
int humidity1_adc_value = 0;
int temperature2_adc_value = 0;
int humidity2_adc_value = 0;

// LCD display variables
LiquidCrystal_I2C lcd2(0x27, 16, 2); // I2C address may vary, use the correct address for your module
LiquidCrystal_I2C lcd1(0x26, 16, 2); // I2C address may vary, use the correct address for your module

// Custom character data
byte waterDroplet[] = {
  B00100,
  B00100,
  B01010,
  B01010,
  B10001,
  B10001,
  B10001,
  B01110
};

byte thermometer[] = {
  B00100,
  B01010,
  B01010,
  B01110,
  B01110,
  B11111,
  B11111,
  B01110
};

const int numSamples = 10; // Number of samples for moving average
float temperatureSamples1[numSamples];
float humiditySamples1[numSamples];
float temperatureSamples2[numSamples];
float humiditySamples2[numSamples];
int currentIndex = 0;

float testFrequency = 50;
float windowLength = 40.0 / testFrequency;

int Sensor = 0;

float intercept = -0.04;
float slope = 0.0405;
float current_Volts;

unsigned long printPeriod = 1000;
unsigned long previousMillis = 0;

void setup() {
  Serial.begin(9600);

  // Initialize LCD display
  lcd1.init();
  lcd1.backlight();
  lcd2.init();
  lcd2.backlight();

  // Create custom characters
  lcd1.createChar(0, waterDroplet);
  lcd1.createChar(1, thermometer);
  lcd2.createChar(0, waterDroplet);
  lcd2.createChar(1, thermometer);

  // Display custom characters
  lcd1.setCursor(0, 0);
  lcd1.write((uint8_t)0); // Water droplet character
  lcd1.setCursor(1, 0);
  lcd1.write((uint8_t)1); // Thermometer character
  lcd2.setCursor(0, 0);
  lcd2.write((uint8_t)0); // Water droplet character
  lcd2.setCursor(1, 0);
  lcd2.write((uint8_t)1); // Thermometer character
}

void loop() {
  // Read the analog inputs
  temperature1_adc_value = analogRead(TEMPERATURE1_IN_PIN);
  humidity1_adc_value = analogRead(HUMIDITY1_PIN);
  temperature2_adc_value = analogRead(TEMPERATURE2_IN_PIN);
  humidity2_adc_value = analogRead(HUMIDITY2_PIN);

  // Determine voltage at temperature1 ADC input
  float temperature1_adc_voltage = (temperature1_adc_value * ref_voltage) / 1023.0;
  // Calculate voltage at temperature divider input
  float temperature1_in_voltage = temperature1_adc_voltage / (R2 / (R1 + R2));

  // Determine voltage at humidity1 ADC input
  float humidity1_adc_voltage = (humidity1_adc_value * ref_voltage) / 1023.0;
  // Calculate humidity voltage
  float humidity1_in_voltage = humidity1_adc_voltage / (R2 / (R1 + R2));

  // Determine voltage at temperature2 ADC input
  float temperature2_adc_voltage = (temperature2_adc_value * ref_voltage) / 1023.0;
  // Calculate voltage at temperature divider input
  float temperature2_in_voltage = temperature2_adc_voltage / (R2 / (R1 + R2));

  // Determine voltage at humidity2 ADC input
  float humidity2_adc_voltage = (humidity2_adc_value * ref_voltage) / 1023.0;
  // Calculate humidity voltage
  float humidity2_in_voltage = humidity2_adc_voltage / (R2 / (R1 + R2));

  // Calculate temperature
  float x1 = (temperature1_in_voltage) * 100;
  float temperature1 = map(x1, 0, 1000, -2000, 6000) / 100.0;
  float x2 = (temperature2_in_voltage) * 100;
  float temperature2 = map(x2, 0, 1000, -2000, 6000) / 100.0;

  // Calculate humidity
  float y1 = (humidity1_in_voltage) * 1000;
  float humidity1 = map(y1, 0, 100000, 0, 10000);
  humidity1 = humidity1 / 10;
  float y2 = (humidity2_in_voltage) * 1000;
  float humidity2 = map(y2, 0, 100000, 0, 10000);
  humidity2 = humidity2 / 10;

  // Store the current readings in the array
  temperatureSamples1[currentIndex] = temperature1;
  humiditySamples1[currentIndex] = humidity1;
  temperatureSamples2[currentIndex] = temperature2;
  humiditySamples2[currentIndex] = humidity2;

  // Increment the index, and wrap around if necessary
  currentIndex = (currentIndex + 1) % numSamples;

  // Calculate the moving average for temperature
  float temperatureSum1 = 0;
  for (int i = 0; i < numSamples; i++) {
    temperatureSum1 += temperatureSamples1[i];
  }
  float temperatureMovingAverage1 = temperatureSum1 / numSamples;

  // Calculate the moving average for humidity
  float humiditySum1 = 0;
  for (int i = 0; i < numSamples; i++) {
    humiditySum1 += humiditySamples1[i];
  }
  float humidityMovingAverage1 = humiditySum1 / numSamples;

  float temperatureSum2 = 0;
  for (int i = 0; i < numSamples; i++) {
    temperatureSum2 += temperatureSamples2[i];
  }
  float temperatureMovingAverage2 = temperatureSum2 / numSamples;

  // Calculate the moving average for humidity
  float humiditySum2 = 0;
  for (int i = 0; i < numSamples; i++) {
    humiditySum2 += humiditySamples2[i];
  }
  float humidityMovingAverage2 = humiditySum2 / numSamples;

  // Print temperature and humidity values to Serial Monitor
  Serial.print("Temperature Set 1: ");
  Serial.print(temperatureMovingAverage1);
  Serial.print(" °C, Humidity Set 1: ");
  Serial.print(humidityMovingAverage1);
  Serial.println(" %");

  Serial.print("Temperature Set 2: ");
  Serial.print(temperatureMovingAverage2);
  Serial.print(" °C, Humidity Set 2: ");
  Serial.print(humidityMovingAverage2);
  Serial.println(" %");

  // Display temperature
  lcd1.setCursor(0, 0);
  lcd1.write((uint8_t)1); // Thermometer character
  lcd1.print(temperatureMovingAverage2);
  lcd1.write(0xDF); // Degree symbol
  lcd1.print("C");

  // Display humidity
  lcd1.setCursor(0, 1);
  lcd1.write((uint8_t)0); // Water droplet character
  lcd1.print(humidityMovingAverage2);
  lcd1.print("%");

  // Display temperature
  lcd2.setCursor(0, 0);
  lcd2.write((uint8_t)1); // Thermometer character
  lcd2.print(temperatureMovingAverage2);
  lcd2.write(0xDF); // Degree symbol
  lcd2.print("C");

  // Display humidity
  lcd2.setCursor(0, 1);
  lcd2.write((uint8_t)0); // Water droplet character
  lcd2.print(humidityMovingAverage2);
  lcd2.print("%");

  // Voltage measurement
  RunningStatistics inputStats;
  inputStats.setWindowSecs(windowLength);

  while (true) {
    Sensor = analogRead(ACSensor_PIN);
    inputStats.input(Sensor);

    if ((unsigned long)(millis() - previousMillis) >= printPeriod) {
      previousMillis = millis();

      current_Volts = intercept + slope * inputStats.sigma();
      current_Volts = current_Volts * (40.3231);

      Serial.print("\tVoltage: ");
      Serial.print(current_Volts);
      Serial.println(" V");
      
    }
    break;
}

  delay(100);
}

The result will be like this

15:59:33.725 -> Temperature Set 1: 80.68 °C, Humidity Set 1: 0.00 %

15:59:33.771 -> Temperature Set 2: -15.28 °C, Humidity Set 2: 8.36 %

15:59:33.847 -> Voltage: 1.59 V

15:59:33.921 -> Temperature Set 1: 81.89 °C, Humidity Set 1: 0.00 %

15:59:33.955 -> Temperature Set 2: -15.65 °C, Humidity Set 2: 7.67 %

15:59:34.094 -> Temperature Set 1: 84.27 °C, Humidity Set 1: 0.00 %

15:59:34.136 -> Temperature Set 2: -15.74 °C, Humidity Set 2: 7.20 %

15:59:34.267 -> Temperature Set 1: 85.22 °C, Humidity Set 1: 0.00 %

15:59:34.314 -> Temperature Set 2: -15.61 °C, Humidity Set 2: 7.20 %

15:59:34.453 -> Temperature Set 1: 85.43 °C, Humidity Set 1: 0.00 %

15:59:34.498 -> Temperature Set 2: -15.62 °C, Humidity Set 2: 7.17 %

15:59:34.646 -> Temperature Set 1: 85.57 °C, Humidity Set 1: 0.00 %

15:59:34.679 -> Temperature Set 2: -15.66 °C, Humidity Set 2: 7.14 %

15:59:34.827 -> Temperature Set 1: 85.78 °C, Humidity Set 1: 0.00 %

15:59:34.902 -> Temperature Set 2: -15.58 °C, Humidity Set 2: 7.23 %

15:59:34.933 -> Voltage: 1.24 V

the AC Input is still in the 110v but the volt reading is only at 1V, i have tried to remove the loop and no good result. i have only copied the ZMPT101B, please give some advice in how to solve this issue
`

Move the break one line up, so it will inside the printPeriod condition

16:33:14.604 -> Temperature Set 2: -0.21 °C, Humidity Set 2: 3.78 %

16:33:14.637 -> Voltage: 0.67 V

16:33:14.749 -> Temperature Set 1: 12.81 °C, Humidity Set 1: 0.00 %

16:33:14.782 -> Temperature Set 2: -1.23 °C, Humidity Set 2: 6.02 %

16:33:15.647 -> Voltage: 306.44 V

16:33:15.739 -> Temperature Set 1: 20.74 °C, Humidity Set 1: 0.00 %

16:33:15.782 -> Temperature Set 2: -2.08 °C, Humidity Set 2: 8.46 %

16:33:16.628 -> Voltage: 305.66 V

16:33:16.751 -> Temperature Set 1: 27.10 °C, Humidity Set 1: 0.00 %

16:33:16.784 -> Temperature Set 2: -2.52 °C, Humidity Set 2: 11.66 %

16:33:17.614 -> Voltage: 307.43 V

16:33:17.753 -> Temperature Set 1: 35.08 °C, Humidity Set 1: 0.00 %

16:33:17.784 -> Temperature Set 2: -3.35 °C, Humidity Set 2: 14.15 %

16:33:18.643 -> Voltage: 307.34 V

16:33:18.736 -> Temperature Set 1: 41.30 °C, Humidity Set 1: 0.00 %

16:33:18.782 -> Temperature Set 2: -3.91 °C, Humidity Set 2: 17.20 %

16:33:19.638 -> Voltage: 307.13 V

the result change but the voltage is still wrong

Try to increase a printPeriod and see what changed

Edit - try the next advice first

1 Like

Move first line of the below to global scope and the second to setup()

this solution work, thank you. I have tried to put this

  inputStats.setWindowSecs(windowLength);

and it has resulted in an error,

can i ask why did the long print period work does it give the arduino more time to analyze the data from sensor and why did it also delay the the other serial prints? :smiley:

Where to you try to put this line?
What was the error?

my bad my earlier tries i put them both global scope and both in setup,
i tried it now and its also working :smiley:

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