//https://docs.turais.de/docs/modules/hw685/
//https://randomnerdtutorials.com/guide-for-oled-display-with-arduino/
//https://www.instructables.com/How-to-Display-Images-on-OLED-Using-Arduino/
#include <SPI.h>
#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
#define OLED_RESET 4 // 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);
// Define analog input Voltage
#define ANALOG_IN_PIN A2
// Floats for ADC voltage & Input voltage
float adc_voltage = 0.0;
float in_voltage = 0.0;
// 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 value
int adc_value = 0;
// //Define analog Input Current
// #define CurrentSensorPin A2
// #define VREF 5000 // ADC's reference voltage on your Arduino,typical value:5000mV
// unsigned int voltage; //unit:mV
// float current; //unit:mA
int analogPin = A3;
float read_curr_ma = 0.0;
float max_curr_ma = 20.0;
float min_curr_ma = 4.00;
float adc_intervals = 1023.0;
float max_voltac = 450.0;
float read_voltac = 0.0;
int max_ampereac = 20.0;
float read_ampereac = 0.0;
int read_temp = 0.0;
//Deklarasi rata- rata adc
const int numReadings = 10;
int readings[numReadings]; // pembacaan dari input analog
int readIndex = 0; // indeks pembacaan saat ini
int total = 0; // Total berjalan
int averageADC = 0; // Rata- rata ADC
void setup()
{
// Setup Serial Monitor
Serial.begin(9600);
// Serial.println("DC Voltage and Current Test");
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
delay(1);
display.clearDisplay();
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
}
void loop() {
// Pengurangan pembacaan terakhir:
total = total - readings[readIndex];
// pembacaan sensor:
readings[readIndex] = analogRead(analogPin);
// tambahkan pembacaan sensor ke total:
total = total + readings[readIndex];
// selanjutnya di array atau masuk himpunan:
readIndex = readIndex + 1;
// jika berada diakhir himpunan..
if (readIndex >= numReadings) {
// ...diulang dari awal:
readIndex = 0;
}
averageADC = total / numReadings;
// Read the Analog Input Voltage
adc_value = analogRead(ANALOG_IN_PIN);
// Determine voltage at ADC input Voltage
adc_voltage = (adc_value * ref_voltage) / 1024.0;
// Calculate voltage at divider input Voltage
in_voltage = (adc_voltage / (R2 / (R1 + R2))+ 0.70) ;
// Print results to Serial Monitor to 2 decimal places Voltage
// Serial.print("Input Voltage =");
// Serial.print(in_voltage, 2);
// Serial.print("V ");
//read_curr_ma = (averageADC * (max_curr_ma / adc_intervals)+ 4.0);
// Serial.print("Current:");
// Serial.print(read_curr_ma);
// Serial.println("mA");
//read_curr_ma = (((max_curr_ma - min_curr_ma) / (adc_intervals - 0.0) * (averageADC - 0.0)) + 4.0);
read_curr_ma = (((max_curr_ma - min_curr_ma) / (adc_intervals - 0.0)) * (averageADC - 0.0)) + min_curr_ma; // Adc to 4-20 mA
// */ (Nilai batas atas conversi - nilai batas bawah conversi)/ (nilai batas atas interval ADC - nilai batas bawah interval ) * (Nilai yang terbaca - nilai batas bawah interval) + nilai batas bawah conversi;
//read_voltac = (averageADC * (max_voltac / adc_intervals)+0.0);
// Serial.print("Vac:: ");
// Serial.print(read_voltac);
// Serial.println("V");
//read_voltac = (((max_voltac - 0.0) / ( max_curr_ma - min_curr_ma)) * (read_curr_ma - min_curr_ma)) + 0.0; // 4-20 mA to 0-450 Vac
read_temp = (((1200.0 - (-210)) / (max_curr_ma - min_curr_ma)) * (read_curr_ma - min_curr_ma)) + (-210); // 4-20 mA to -210 - 1200 °C
// */ (Nilai batas atas conversi - nilai batas bawah conversi)/ (nilai batas atas arus mA - nilai batas bawah arus mA ) * (Nilai yang terbaca - nilai batas bawah arus mA) + nilai batas bawah conversi;
read_ampereac = (averageADC * (max_ampereac / adc_intervals)+0.0);
// Serial.print("Iac: ");
// Serial.print(read_ampereac);
// Serial.println(" A");
// voltage = analogRead(CurrentSensorPin)/1024.0*VREF;
// Serial.print("voltage:");
// Serial.print(voltage);
// Serial.print("mV ");
// current = voltage/120.0; //Sense Resistor:120ohm
// Serial.print("current:");
// Serial.print(current);
// Serial.println("mA");
// display.setCursor(15, 0); //oled display judul
// display.setTextSize(1);
// display.setTextColor(WHITE);
// display.print("0-10 V & 4-20 mA");
display.setCursor(10, 10); //oled display judul 1
display.setTextSize(1);
display.setTextColor(WHITE);
display.print(" Calibration Mater");
// display.setCursor(0, 25); //oled display simbol voltage
// display.setTextSize(2);
// display.setTextColor(WHITE);
// display.print("V: ");
// display.setCursor(30, 25); //oled display satuan voltage
// display.setTextSize(2);
// display.setTextColor(WHITE);
// display.print(in_voltage, 2);
// display.println(" V");
display.setCursor(0, 25); //oled display simbol voltage
display.setTextSize(2);
display.setTextColor(WHITE);
display.print("T: ");
display.setCursor(30, 25); //oled display satuan voltage
display.setTextSize(2);
display.setTextColor(WHITE);
display.print(read_temp);
display.println(" C");
display.setCursor(0, 50); //oled display simbol arus
display.setTextSize(2);
display.setTextColor(WHITE);
display.print("I: ");
display.setCursor(30, 50); //oled display satuan arus
display.setTextSize(2);
display.setTextColor(WHITE);
display.print(read_curr_ma, 2);
display.println(" mA");
display.display();
delay(1);
display.clearDisplay();
}