// Заміри напруги на ADC ESP32.
#include <Arduino.h>
// ========= SETTING ===================
#define OLED_SSD1306
// =========/ SETTING ===================
#ifdef OLED_SSD1306
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO: A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO: 2(SDA), 3(SCL), ...
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#endif
const int LED_PIN = 2; // 34
const int ADC_PIN = 26; // 34
uint16_t ADC_val = 0;
uint16_t R1 = 1000; //kOm
uint16_t R2 = 2215; //kOm
uint16_t AREF = 3285; //mv
uint16_t ADC_arr[10];
// uint16_t ADC_arr[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
// uint16_t ADC_arr[10] = {1, 2, 9, 4, 5, 6, 2, 1, 6, 6};
uint16_t findAverage (void);
void setup()
{
// Wire.begin();
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(ADC_PIN, INPUT);
#ifdef OLED_SSD1306
// Wire.begin(33, 32);
Wire.begin();
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display();
delay(2000); // Pause for 2 seconds
// Clear the buffer
display.clearDisplay();
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0, 0); // Start at top-left corner
#endif
}
void loop()
{
float voltage = 0.00;
uint32_t voltageLong = 0;
uint16_t averageVal = 0;
// uint16_t voltage = 0;
digitalWrite(LED_PIN, HIGH);
delay(20);
digitalWrite(LED_PIN, LOW);
delay(980);
for(uint8_t i=0; i<10; i++) {
ADC_arr[i] = analogRead(ADC_PIN);
delay(5);
}
averageVal = findAverage();
voltageLong = (long)averageVal * (R1+R2) / 1000 * AREF / 4096;
int koef = 0;
if(voltageLong / 1000 > 9) koef = -800;
else if(voltageLong / 1000 > 8) koef = -270;
else if(voltageLong / 1000 > 7) koef = 60;
else if(voltageLong / 1000 > 6) koef = 60;
else if(voltageLong / 1000 > 5) koef = 70;
else if(voltageLong / 1000 > 4) koef = 30;
else if(voltageLong / 1000 > 3) koef = 10;
voltage = (float)(voltageLong + 422 + koef) / 1000;
#ifdef OLED_SSD1306
display.clearDisplay();
display.setCursor(0, 18); // Start at top-left corner
display.print(F("ADC: "));
display.print(averageVal);
display.setCursor(0, 38);
display.print(F("Vlt: "));
display.print(voltage);
display.display();
#endif
Serial.print("ADC: ");
Serial.print(averageVal);
Serial.print(" U: ");
Serial.println(voltage);
}
/*
Real ADC
2 624
3 1003
4 1392
5 1771
6 2150
7 2523
8 2915
9 3376
10 4080
*/
// =================== FUNCTIONS ========================
// // ======================== SORT ADC +============================
uint16_t findAverage (void){
int minVal = ADC_arr[0];
int arrLength = sizeof(ADC_arr) / sizeof(ADC_arr[0]);
for(int j=1; j<arrLength; j++) {
for(int i=j; i<arrLength; i++) {
if(ADC_arr[i] < ADC_arr[j-1]) {
minVal = ADC_arr[j-1];
ADC_arr[j-1] = ADC_arr[i];
ADC_arr[i] = minVal;
}
}
// Serial.print("ADC_arr[] = ");
// Serial.println(ADC_arr[j-1]);
}
// Serial.print("sortArr[] = ");
// Serial.println(ADC_arr[arrLength - 1]);
int aver = 0;
for(int i=arrLength/5; i<(arrLength - arrLength/5); i++) {
aver += ADC_arr[i];
// Serial.println(aver);
}
// Serial.println(arrLength-arrLength/5 - arrLength/5);
return aver/(arrLength-arrLength/5 - arrLength/5);
// for(int i=2; i<=7; i++) {
// aver += ADC_arr[i];
// Serial.println(aver);
// }
// Serial.println(aver/6);
// return aver / 6;
}