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
`