#include <Arduino.h>
/*
* https://randomnerdtutorials.com/esp32-multiple-ds18b20-temperature-tempSensor/
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ZMPT101B.h>
#include <Adafruit_SSD1306.h>
#define ZMPT101BPIN 35
#define SENSITIVITY 500.0f
#define SCT013PIN 34
#define ACTectionRange 20
OneWire DS18B20_1(4);
OneWire DS18B20_2(2);
OneWire DS18B20_3(15);
OneWire DS18B20_4(13);
OneWire DS18B20_5(12);
OneWire DS18B20_6(14);
OneWire DS18B20_7(27);
OneWire DS18B20_8(26);
DallasTemperature tempSensor1(&DS18B20_1);
DallasTemperature tempSensor2(&DS18B20_2);
DallasTemperature tempSensor3(&DS18B20_3);
DallasTemperature tempSensor4(&DS18B20_4);
DallasTemperature tempSensor5(&DS18B20_5);
DallasTemperature tempSensor6(&DS18B20_6);
DallasTemperature tempSensor7(&DS18B20_7);
DallasTemperature tempSensor8(&DS18B20_8);
ZMPT101B voltSensor(ZMPT101BPIN);
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
float temp1 = 0,temp2 = 0,temp3 = 0,temp4 = 0,temp5 = 0,temp6 = 0,temp7 = 0,temp8 = 0;
float ACvolt = 220.00, ACCurrent = 1.50;
float correctionfactor=6.5; //9
float readACCurrent()
{
float ACCurrent = 0;
float peakvolt = 0;
float voltVirtualValue = 0; //Vrms
for (int i = 0; i < 5; i++)
{
peakvolt += analogRead(SCT013PIN); //read peak volt
peakvolt = peakvolt + correctionfactor;
delay(1);
}
peakvolt = peakvolt / 5;
voltVirtualValue = peakvolt * 0.707; //change the peak volt to the Virtual Value of volt
/*The circuit is amplified by 2 times, so it is divided by 2.*/
voltVirtualValue = (voltVirtualValue / 1024 * VREF ) / 2;
ACCurrent = voltVirtualValue * ACTectionRange;
return ACCurrent;
}
void readSensor()
{
tempSensor1.requestTemperatures();
tempSensor2.requestTemperatures();
tempSensor3.requestTemperatures();
tempSensor4.requestTemperatures();
tempSensor5.requestTemperatures();
tempSensor6.requestTemperatures();
tempSensor7.requestTemperatures();
tempSensor8.requestTemperatures();
temp1 = tempSensor1.getTempCByIndex(0);
temp2 = tempSensor2.getTempCByIndex(0);
temp3 = tempSensor3.getTempCByIndex(0);
temp4 = tempSensor4.getTempCByIndex(0);
temp5 = tempSensor5.getTempCByIndex(0);
temp6 = tempSensor6.getTempCByIndex(0);
temp7 = tempSensor7.getTempCByIndex(0);
temp8 = tempSensor8.getTempCByIndex(0);
ACvolt = voltSensor.getVoltageAC();
ACCurrent = readACCurrent();
}
String cekTemp(float inputTemp)
{
float temp = inputTemp;
if (temp = -127){
return("---.--");
}else{
return(String(inputTemp));
}
}
void printData()
{
Serial.println((String)"Temperature: "+cekTemp(temp1)+"ºC | "+cekTemp(temp2)+"ºC | "+cekTemp(temp3)+"ºC | "+cekTemp(temp4)+"ºC | "+cekTemp(temp5)+"ºC | "+cekTemp(temp6)+"ºC | "+cekTemp(temp7)+"ºC | "+cekTemp(temp8)+"ºC | ");
Serial.println((String)"Tegangan: "+ACvolt+" V | "+"Arus: "+ACCurrent)+" A";
}
void tempDisplay(int B, float value){
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
Serial.println((String)value+" ");
if (value >= 100){
display.setCursor(6, B);
display.print(value);
}else if (value >= 10){
display.setCursor(12, B);
display.print(value);
}else if (value >= 0){
display.setCursor(18, B);
display.print(value);
}else if (value > -10){
display.setCursor(12, B);
display.print(value);
}else if (value > -100){
display.setCursor(6, B);
display.print(value);
}
display.setCursor(42, B);display.write(247);
display.setCursor(48, B);display.write('C');
}
void vcDisplay(float v, float c){
display.setTextSize(1);
display.setCursor(56,10); display.print("TEMPERATURE");
display.setCursor(56,36); display.print("CURRENT");
display.setTextSize(2);
if(v >= 100){
display.setCursor(56,20); display.print(v);
}else if(v >= 10){
display.setCursor(68,20); display.print(v);
}else{
display.setCursor(80,20); display.print(v);
}
if(c >= 100){
display.setCursor(56,46); display.print(c);
}else if(c >= 10){
display.setCursor(68,46); display.print(c);
}else{
display.setCursor(80,46); display.print(c);
}
}
void displaySensors()
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.setCursor(0, 0); display.write('1');
display.setCursor(0, 8); display.write('2');
display.setCursor(0, 16); display.write('3');
display.setCursor(0, 24); display.write('4');
display.setCursor(0, 32); display.write('5');
display.setCursor(0, 38); display.write('6');
display.setCursor(0, 46); display.write('7');
display.setCursor(0, 54); display.write('8');
// display.setCursor(56,0); display.print("18:43:11");
tempDisplay(0, temp1);
tempDisplay(8, temp2);
tempDisplay(16, temp3);
tempDisplay(24, temp4);
tempDisplay(32, temp5);
tempDisplay(38, temp6);
tempDisplay(46, temp7);
tempDisplay(54, temp8);
vcDisplay(ACvolt,ACCurrent);
display.display();
}
void setup()
{
Serial.begin(115200);
tempSensor1.begin();
tempSensor2.begin();
tempSensor3.begin();
tempSensor4.begin();
tempSensor5.begin();
tempSensor6.begin();
tempSensor7.begin();
tempSensor8.begin();
voltSensor.setSensitivity(SENSITIVITY);
pinMode(SCT013PIN,INPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
delay(2000);
display.clearDisplay();
}
void loop(){
//readSensor();
delay(1000);
//printData();
displaySensors();
}