Κώδικας:
#include <LiquidCrystal.h>
//===================================================================
// LiquidCrystal lcd(2, 4, 6, 7, 8, 9);
LiquidCrystal lcd(2, 8, 4, 5, 6, 7);
//===================================================================
long Vref11 = 1122000L; // Boards Internal 1.1Vref
float CalibV = 2.0; // 'Calibrate' value
int Read1 = A0;
int Read2 = A2;
long readVcc;
float OnePercentADC, percentADC;
float VccReal = (float) readVcc / 1000;
int rawADC0, rawADC1, rawADC2, rawADC3, rawADC4, rawADC5, rawADC6,
rawADC7, rawADC8, rawADC9, rawADC10, rawADC11, rawADC12, rawADC13,
rawADC14, rawADC15, rawADC16, rawADC17, rawADC18, rawADC19 = 0;
int average;
float average2 = 0;
int count = 0;
//===================================================================
void setup()
{
lcd.begin(16, 2);// lcd.begin(20, 2);
}
//===================================================================
void loop()
{
lcd.setCursor(0, 0);
lcd.print(millis() / 1000);
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(10); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA,ADSC));
readVcc = ADCL;
readVcc |= ADCH<<8;
readVcc = Vref11 / readVcc; // Back-calculate AVcc in mV
lcd.setCursor(0, 1);
lcd.print(VccReal,2);
measureVoltageAverage();
measureVoltage_1_Average();
delay(200);
}
//===================================================================
void measureVoltageAverage()
{
// Measure multiple times the Analog Pin and make an 'Average':
//
// Take multiple measurements of the same AnalogInput
rawADC0 = analogRead (Read1);
rawADC1 = analogRead (Read1);
rawADC2 = analogRead (Read1);
rawADC3 = analogRead (Read1);
rawADC4 = analogRead (Read1);
rawADC5 = analogRead (Read1);
rawADC6 = analogRead (Read1);
rawADC7 = analogRead (Read1);
rawADC8 = analogRead (Read1);
rawADC9 = analogRead (Read1);
rawADC10 = analogRead (Read1);
rawADC11 = analogRead (Read1);
rawADC12 = analogRead (Read1);
rawADC13 = analogRead (Read1);
rawADC14 = analogRead (Read1);
rawADC15 = analogRead (Read1);
rawADC16 = analogRead (Read1);
rawADC17 = analogRead (Read1);
rawADC18 = analogRead (Read1);
rawADC19 = analogRead (Read1);
// Make first average of those values
average = (rawADC0 + rawADC1 + rawADC2 + rawADC3 + rawADC4 + rawADC5 + rawADC6 + rawADC7 + rawADC8 + rawADC9 + rawADC10 + rawADC11 + rawADC12 + rawADC13 + rawADC14 + rawADC15 + rawADC16 + rawADC17 + rawADC18 + rawADC19) / 20;
// Make the 'int' average value into a 'float', calc 1/1000 of that average value and select percent under/over to be "discarded"
OnePercentADC = (float) average / 1000;
percentADC = OnePercentADC * 6; // Percent of "tolerance" before a value is discarted, in -Thousands- of the average value
// From the previous values, exclude those that are 10% more/less than made 'average' value, and re-calculate a new average
average2 = 0;
count = 0;
if (rawADC0 <= average+percentADC && rawADC0 >= average-percentADC) {
average2 = average2 + rawADC0;
count++;
}
if (rawADC1 <= average+percentADC && rawADC1 >= average-percentADC) {
average2 = average2 + rawADC1;
count++;
}
if (rawADC2 <= average+percentADC && rawADC2 >= average-percentADC) {
average2 = average2 + rawADC2;
count++;
}
if (rawADC3 <= average+percentADC && rawADC3 >= average-percentADC) {
average2 = average2 + rawADC3;
count++;
}
if (rawADC4 <= average+percentADC && rawADC4 >= average-percentADC) {
average2 = average2 + rawADC4;
count++;
}
if (rawADC5 <= average+percentADC && rawADC5 >= average-percentADC) {
average2 = average2 + rawADC5;
count++;
}
if (rawADC6 <= average+percentADC && rawADC6 >= average-percentADC) {
average2 = average2 + rawADC6;
count++;
}
if (rawADC7 <= average+percentADC && rawADC7 >= average-percentADC) {
average2 = average2 + rawADC7;
count++;
}
if (rawADC8 <= average+percentADC && rawADC8 >= average-percentADC) {
average2 = average2 + rawADC8;
count++;
}
if (rawADC9 <= average+percentADC && rawADC9 >= average-percentADC) {
average2 = average2 + rawADC9;
count++;
}
if (rawADC10 <= average+percentADC && rawADC10 >= average-percentADC) {
average2 = average2 + rawADC10;
count++;
}
if (rawADC11 <= average+percentADC && rawADC11 >= average-percentADC) {
average2 = average2 + rawADC11;
count++;
}
if (rawADC12 <= average+percentADC && rawADC12 >= average-percentADC) {
average2 = average2 + rawADC12;
count++;
}
if (rawADC13 <= average+percentADC && rawADC13 >= average-percentADC) {
average2 = average2 + rawADC13;
count++;
}
if (rawADC14 <= average+percentADC && rawADC14 >= average-percentADC) {
average2 = average2 + rawADC14;
count++;
}
if (rawADC15 <= average+percentADC && rawADC15 >= average-percentADC) {
average2 = average2 + rawADC15;
count++;
}
if (rawADC16 <= average+percentADC && rawADC16 >= average-percentADC) {
average2 = average2 + rawADC16;
count++;
}
if (rawADC17 <= average+percentADC && rawADC17 >= average-percentADC) {
average2 = average2 + rawADC17;
count++;
}
if (rawADC18 <= average+percentADC && rawADC18 >= average-percentADC) {
average2 = average2 + rawADC18;
count++;
}
if (rawADC19 <= average+percentADC && rawADC19 >= average-percentADC) {
average2 = average2 + rawADC19;
count++;
}
average = average2 / count;
float voltage = ((float) average + CalibV ) / 1024.0 * VccReal;
lcd.setCursor(5, 0);
lcd.print(voltage,3);
lcd.print("V");
lcd.setCursor(12, 0);
lcd.print(average);
// lcd.setCursor(17, 0);
// lcd.print(" ");
// lcd.setCursor(17, 0);
// lcd.print(count);
}
//===================================================================
void measureVoltage_1_Average()
{
rawADC0 = analogRead (Read2);
rawADC1 = analogRead (Read2);
rawADC2 = analogRead (Read2);
rawADC3 = analogRead (Read2);
rawADC4 = analogRead (Read2);
rawADC5 = analogRead (Read2);
rawADC6 = analogRead (Read2);
rawADC7 = analogRead (Read2);
rawADC8 = analogRead (Read2);
rawADC9 = analogRead (Read2);
rawADC10 = analogRead (Read2);
rawADC11 = analogRead (Read2);
rawADC12 = analogRead (Read2);
rawADC13 = analogRead (Read2);
rawADC14 = analogRead (Read2);
rawADC15 = analogRead (Read2);
rawADC16 = analogRead (Read2);
rawADC17 = analogRead (Read2);
rawADC18 = analogRead (Read2);
rawADC19 = analogRead (Read2);
average = (rawADC0 + rawADC1 + rawADC2 + rawADC3 + rawADC4 + rawADC5 + rawADC6 + rawADC7 + rawADC8 + rawADC9 + rawADC10 + rawADC11 + rawADC12 + rawADC13 + rawADC14 + rawADC15 + rawADC16 + rawADC17 + rawADC18 + rawADC19) / 20;
OnePercentADC = (float) average / 1000;
percentADC = OnePercentADC * 6; // Percent of "tolerance" before a value is discarted, in -Thousands- of the average value
average2 = 0;
count = 0;
if (rawADC0 <= average+percentADC && rawADC0 >= average-percentADC) {
average2 = average2 + rawADC0;
count++;
}
if (rawADC1 <= average+percentADC && rawADC1 >= average-percentADC) {
average2 = average2 + rawADC1;
count++;
}
if (rawADC2 <= average+percentADC && rawADC2 >= average-percentADC) {
average2 = average2 + rawADC2;
count++;
}
if (rawADC3 <= average+percentADC && rawADC3 >= average-percentADC) {
average2 = average2 + rawADC3;
count++;
}
if (rawADC4 <= average+percentADC && rawADC4 >= average-percentADC) {
average2 = average2 + rawADC4;
count++;
}
if (rawADC5 <= average+percentADC && rawADC5 >= average-percentADC) {
average2 = average2 + rawADC5;
count++;
}
if (rawADC6 <= average+percentADC && rawADC6 >= average-percentADC) {
average2 = average2 + rawADC6;
count++;
}
if (rawADC7 <= average+percentADC && rawADC7 >= average-percentADC) {
average2 = average2 + rawADC7;
count++;
}
if (rawADC8 <= average+percentADC && rawADC8 >= average-percentADC) {
average2 = average2 + rawADC8;
count++;
}
if (rawADC9 <= average+percentADC && rawADC9 >= average-percentADC) {
average2 = average2 + rawADC9;
count++;
}
if (rawADC10 <= average+percentADC && rawADC10 >= average-percentADC) {
average2 = average2 + rawADC10;
count++;
}
if (rawADC11 <= average+percentADC && rawADC11 >= average-percentADC) {
average2 = average2 + rawADC11;
count++;
}
if (rawADC12 <= average+percentADC && rawADC12 >= average-percentADC) {
average2 = average2 + rawADC12;
count++;
}
if (rawADC13 <= average+percentADC && rawADC13 >= average-percentADC) {
average2 = average2 + rawADC13;
count++;
}
if (rawADC14 <= average+percentADC && rawADC14 >= average-percentADC) {
average2 = average2 + rawADC14;
count++;
}
if (rawADC15 <= average+percentADC && rawADC15 >= average-percentADC) {
average2 = average2 + rawADC15;
count++;
}
if (rawADC16 <= average+percentADC && rawADC16 >= average-percentADC) {
average2 = average2 + rawADC16;
count++;
}
if (rawADC17 <= average+percentADC && rawADC17 >= average-percentADC) {
average2 = average2 + rawADC17;
count++;
}
if (rawADC18 <= average+percentADC && rawADC18 >= average-percentADC) {
average2 = average2 + rawADC18;
count++;
}
if (rawADC19 <= average+percentADC && rawADC19 >= average-percentADC) {
average2 = average2 + rawADC19;
count++;
}
average = average2 / count;
float voltage2 = ((float) average + CalibV ) / 1024.0 * VccReal;
lcd.setCursor(5, 1);
lcd.print(voltage2,3);
lcd.print("V");
lcd.setCursor(12, 1);
lcd.print(average);
// lcd.setCursor(17, 1);
// lcd.print(" ");
// lcd.setCursor(17, 1);
// lcd.print(count);
// delay(200);
// lcd.clear();
}
//===================================================================
//===================================================================
//===================================================================
//===================================================================