#include <Arduino.h>
#include <U8g2lib.h>
#include "Wire.h"
#include "I2CKeyPad.h"
#include "hardware/watchdog.h"
/// 128x64 Ekran Tanımlaması ///////////////
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
//U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 17 /* A3 */, /* CS=*/ 16 /* A2 */, /* reset=*/ U8X8_PIN_NONE);
//U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 0, /* data=*/ 1, /* CS=*/ 10, /* reset=*/ 21);
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /*PICO SPI CLOCK PİN clock=*/ 10 /* A4 */ , /*PICO SPI TX data=*/ 11 /* A3 */, /*PICO CHIP SELECT CS=*/ 13 /* A2 */, /* reset=*/ U8X8_PIN_NONE);
/// KEYPAD TANIMLAMALARI //////////////////
const uint8_t KEYPAD_ADDRESS = 0x20;
I2CKeyPad keyPad(KEYPAD_ADDRESS);
int ToplamSayi;
float sayi1 = 0;
float sayi2 = 0;
float sayi3 = 0;
float sayi4 = 0;
int tur = 0;
float voltaj_akim = 00.00;
int ival;
//Timur abinin kodları
#define MAX_VOLTAJ 30.0
#define MIN_VOLTAJ 0.0
unsigned int kursor_pos; // 0 .. 3 arasinda degisiyor. 0 en soldaki hane
float katsayilar[] = {10, 1, 0.1, 0.01};
float voltaj;
float degisim;
int artieksi;
/// Röle devresi ////////////////////////
#define onikiv 16
#define yirmialtiv 17
#define otuzikiv 18
#define fan_led 19
// Encoder Pinleri /////////////////////
#define PinCLK 7
#define PinDt 8
#define PinSw 6
#define interrup 9
volatile int sayac = 0;
long oncekiZaman;
boolean oncekiDurum;
boolean buttonSonDurum = HIGH;
boolean yazildimi = false;
/// 4x Yön Tuşları ////////////////////////
#define up_btn 2 //19
#define right_btn 3 //18
#define down_btn 4 //17
#define left_btn 5 //16
unsigned int kursor_konum = 0;
// End of constructor list
int currentSensor = A0;
int voltageSensor = A1;
float vOUT = 0.0;
static float vIN = 0.0;
float R1 = 10000.0;
float R2 = 1180.0;
float Vdata = 0;
float V, I;
float Cdata;
float value;
static char buffer[50];
char page = 'i';
/// LM35 Sıcaklık Sensörü
int lm35Pin = A2;
int lm35 = 0;
float sicaklik_gerilim = 0;
int sicaklik = 0;
void setup(void) {
Serial.begin(115200);
Wire.setSDA(0);
Wire.setSCL(1);
Wire.begin();
u8g2.begin();
pinMode(lm35Pin, INPUT);
pinMode(PinCLK, INPUT);
pinMode(PinDt, INPUT);
pinMode(PinSw, INPUT_PULLUP);
pinMode(interrup, INPUT_PULLUP);
pinMode(up_btn, INPUT);
pinMode(right_btn, INPUT);
pinMode(down_btn, INPUT);
pinMode(left_btn, INPUT);
pinMode(onikiv, OUTPUT);
pinMode(yirmialtiv, OUTPUT);
pinMode(otuzikiv, OUTPUT);
pinMode(fan_led, OUTPUT);
/*attachInterrupt(PinClk , encoder , CHANGE );//BAĞLI PIN LOW OLURSA KES
attachInterrupt(PinSw , debounce , CHANGE );//BAĞLI PIN LOW OLURSA KES
attachInterrupt(interrup , keyPress , LOW );//BAĞLI PIN LOW OLURSA KES*/
attachInterrupt(digitalPinToInterrupt(PinCLK) , encoder , FALLING );//BAĞLI PIN LOW OLURSA KES
attachInterrupt(digitalPinToInterrupt(PinSw) , debounce , FALLING );//BAĞLI PIN LOW OLURSA KES
attachInterrupt(digitalPinToInterrupt(interrup) , keyPress , LOW );//BAĞLI PIN LOW OLURSA KES
digitalWrite(onikiv, LOW);
digitalWrite(yirmialtiv, LOW);
digitalWrite(otuzikiv, LOW);
digitalWrite(fan_led, LOW);
//keyPad.begin();
if (keyPad.begin() == false)
{
Serial.println("\nERROR: cannot communicate to keypad.\nPlease reboot.\n");
while (1);
}
/*if (konsol) {
delay(500);
Serial.println(F("KEYPAD AKTİF"));
}*/
}
void setup1() {
pinMode(lm35Pin, INPUT);
}
//// ÇERÇEVE OLUŞTURMA FONKSİYONU/////////////
void drawF(int x, int y, int width, int height, int x2, int y2, int width2, int height2) {
u8g2.drawFrame(x, y, width, height);
u8g2.drawFrame(x2, y2, width2, height2);
}
//// SICAKLIĞI EKRANA BASMA FONKSİYONU /////
void temp(int temp) {
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(90, 32, "Tem");
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(108, 31, "p");
u8g2.setFont(u8g2_font_unifont_t_weather);
u8g2.drawStr(113, 39, "\u0031");
u8g2.setFont(u8g2_font_chikita_tr);
u8g2.setCursor(94, 40);
u8g2.print(temp);
u8g2.setFont(u8g2_font_chikita_tr);
u8g2.drawStr(107, 40, "C");
}
/// KEYPAD FONKSİYONU ////////////////////
void keyPress() {
detachInterrupt(interrup);
uint8_t idxx = keyPad.getKey();
char kidx = "DV0AO987E654S321"[idxx];
if ( isdigit(kidx) ) {
uint8_t sayi = kidx - '0';
/*if (tur == 0) {
if (sayi <= 3) {
sayi1 = sayi;
} else {
tur = -1;
}
} else if (tur == 1) {
if (sayi1 != 3) {
sayi2 = sayi;
} else {
tur = 0;
}
} else if (tur == 2) {
sayi3 = sayi;
} else if (tur == 3) {
sayi4 = sayi;
tur = -1;
}
tur++;
voltaj_akim = sayi1 * 10.0 + sayi2 * 1.0 + sayi3 * 0.1 + sayi4 * 0.01;*/
} else if ( kidx == 'E' ) {
page = 'e';
Serial.println("E tuşuna basıldı");
if (page == 'v') {
// voltaj değeri dijital pota gönderilecek
} else if (page == 'a') {
// Akım değeri dijital pota gönderilecek
}
voltaj_akim = 00.00;
enter();
//page = 'i';
} else if ( kidx == 'A' ) {
/// AMPER DEĞERİNİ DEĞİŞTİRİR ////////////
page = 'a';
sil();
Serial.println("A tuşuna basıldı");
} else if ( kidx == 'V' ) {
Serial.println("V tuşuna basıldı");
page = 'v';
sil();
} else if ( kidx == 'D' ) {
// D TUŞU GİRİLEN DEĞERİ SİLER!
Serial.println("D tuşuna basıldı");
sil();
} else if ( kidx == 'T' ) {
// C Tuşu NodeMCU ya Reset Atar!
// digitalWrite(D0, LOW);
} else if ( kidx == 'S' ) {
Serial.println("SET tuşuna basıldı");
watchdog_enable(1, 1);
while (1);
// S TUŞU DEĞER GİRME EKRANINI AÇAR!
//// SET YAZISI //////////////////////////
}
delay(200);
attachInterrupt(digitalPinToInterrupt(interrup) , keyPress , LOW );
}
/// KÜRSÖR ///////////////////////////////
void kursor() {
u8g2.drawLine(52, 41, 59, 41);
u8g2.drawLine(52, 42, 59, 42);
int kursor_konum = 0;
if (right_btn == 1) {
if (kursor_konum == 0) {
u8g2.drawLine(63, 41, 70, 41);
u8g2.drawLine(63, 42, 70, 42);
kursor_konum = 1;
}
}
}
void enter() {
Serial.println("Entere Basıldı");
page = 'i';
}
void sil() {
voltaj_akim = 0;
tur = 0;
sayi1 = 0;
sayi2 = 0;
sayi3 = 0;
sayi4 = 0;
sayac = 0;
kursor_konum = 0;
}
/// Rotary Encoder Buton Fonksiyonu ///////
void debounce() {
detachInterrupt(PinSw);
boolean butonDurum = digitalRead(PinSw);
if (butonDurum == 0) {
enter();
}
attachInterrupt(digitalPinToInterrupt(PinSw) , debounce , FALLING );
delayMicroseconds(5000);
}
volatile bool PinDT = LOW;
void encoder() {
PinDT = digitalRead(PinDt);
detachInterrupt(PinCLK);
if (millis() - oncekiZaman > 1) {
if (PinDT == HIGH) {
sayac++;
Serial.print(sayac);
Serial.println(" : sag");
} else {
sayac--;
Serial.print(sayac);
Serial.println(" : sol");
}
}
delayMicroseconds(10000); //Burası Debounce süresi için 10 milisaniye gecikme vererek encoder pals okuma sıklığını saniyede en falza 100'e ayaralar.
attachInterrupt(digitalPinToInterrupt(PinCLK), encoder, FALLING);
oncekiZaman = millis();
}
void loop(void) {
if (page == 'a') {
u8g2.clearBuffer();
if (digitalRead(right_btn) + digitalRead(left_btn) >= 0) {
if (digitalRead(right_btn) == 1) {
sayac = 0;
kursor_konum++;
if (kursor_konum > 3) {
kursor_konum = 0;
}
}
else if (digitalRead(left_btn) == 1) {
kursor_konum--;
if (kursor_konum < 1) {
kursor_konum = 3;
}
}
}
float yeni_voltaj = voltaj + sayac * katsayilar[kursor_konum];
if ((yeni_voltaj <= MAX_VOLTAJ) && (yeni_voltaj >= MIN_VOLTAJ))
{
voltaj = yeni_voltaj;
//ekrani_tazele();
}
/*switch (kursor_konum) {
case 0:
u8g2.drawLine(52, 41, 59, 41);
u8g2.drawLine(52, 42, 59, 42);
break;
case 1:
u8g2.drawLine(64, 41, 71, 41);
u8g2.drawLine(64, 42, 71, 42);
case 2:
u8g2.drawLine(88, 41, 95, 41);
u8g2.drawLine(88, 42, 95, 42);
case 3:
u8g2.drawLine(100, 41, 107, 41);
u8g2.drawLine(100, 42, 107, 42);
}*/
/*switch (kursor_konum) {
case 0:
kursor_konum++;
sayi1 = 0;
break;
case 1:
u8g2.drawLine(64, 41, 71, 41);
u8g2.drawLine(64, 42, 71, 42);
/*if (sayac >= 6){
sayac = 0;
} else if (sayi2 == 5) {
sayi3 = 0;
sayi4 = 0;
}*/
/* sayi2 = sayac;
break;
case 2:
u8g2.drawLine(88, 41, 95, 41);
u8g2.drawLine(88, 42, 95, 42);
/*if (sayi2 >= 5 || sayac >=10) {
sayac = 0;
}*/
/* //Serial.print("sayı3: ");
//Serial.println(sayac);
sayi3 = sayac;
/*break;
case 3:
u8g2.drawLine(100, 41, 107, 41);
u8g2.drawLine(100, 42, 107, 42);
/*if (sayi2 >= 5 || sayac >=10) {
sayac = 0;
}*/
/* Serial.print("sayac: ");
Serial.println(sayac);
sayi4 = sayac;
Serial.print("sayı4: ");
Serial.println(sayi4);
break;
}
voltaj_akim = sayi1 * 10.0 + sayi2 * 1.0 + sayi3 * 0.1 + sayi4 * 0.01;*/
//// Akım değerini ekrana yazdırma /////
drawF(0, 0, 128, 64, 1, 1, 126, 62);
u8g2.drawLine(5, 18, 122, 18);
u8g2.drawLine(5, 46, 122, 46);
u8g2.setFont(u8g2_font_VCR_OSD_tr);
u8g2.setCursor(4, 40);
u8g2.print("SET:");
ival = voltaj * 100;
sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
u8g2.setCursor(50, 40);
u8g2.print(buffer);
u8g2.setCursor(112, 40);
u8g2.print(F("A"));
u8g2.sendBuffer();
} else if (page == 'v') {
u8g2.clearBuffer();
if (digitalRead(right_btn) + digitalRead(left_btn) >= 0) {
if (digitalRead(right_btn) == 1) {
sayac = 0;
kursor_konum++;
if (kursor_konum > 3) {
kursor_konum = 0;
}
}
else if (digitalRead(left_btn) == 1) {
kursor_konum--;
if (kursor_konum < 0) {
kursor_konum = 3;
}
}
}
switch (kursor_konum) {
case 0:
u8g2.drawLine(52, 41, 59, 41);
u8g2.drawLine(52, 42, 59, 42);
if (sayac > 3) {
sayac = 0;
} else if (sayi1 == 3) {
sayi2 = 0;
sayi3 = 0;
sayi4 = 0;
}
sayi1 = sayac;
break;
case 1:
u8g2.drawLine(64, 41, 71, 41);
u8g2.drawLine(64, 42, 71, 42);
if (sayi1 >= 3 || sayac >= 10) {
sayac = 0;
}
sayi2 = sayac;
break;
case 2:
u8g2.drawLine(88, 41, 95, 41);
u8g2.drawLine(88, 42, 95, 42);
if (sayi1 >= 3 || sayac >= 10) {
sayac = 0;
}
sayi3 = sayac;
break;
case 3:
u8g2.drawLine(100, 41, 107, 41);
u8g2.drawLine(100, 42, 107, 42);
if (sayi1 >= 3 || sayac >= 10) {
sayac = 0;
}
sayi4 = sayac;
break;
}
voltaj_akim = sayi1 * 10.0 + sayi2 * 1.0 + sayi3 * 0.1 + sayi4 * 0.01;
//// Voltaj değerini ekrana yazdırma /////
drawF(0, 0, 128, 64, 1, 1, 126, 62);
u8g2.drawLine(5, 18, 122, 18);
u8g2.drawLine(5, 46, 122, 46);
u8g2.setFont(u8g2_font_VCR_OSD_tr);
u8g2.setCursor(4, 40);
u8g2.print("SET:");
ival = voltaj_akim * 100;
sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
u8g2.setCursor(50, 40);
u8g2.print(buffer);
u8g2.setCursor(112, 40);
u8g2.print(F("V"));
u8g2.sendBuffer();
} else if (page == 'i') {
//// MARKA GÖSTERGESİ /////////////////////
//u8g2.drawRFrame(34, 52, 15, 11, 3);
//u8g2.drawRFrame(33, 53, 13, 9, 3);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_nokiafc22_tu);
u8g2.setCursor(2, 10);
u8g2.print("RIGOL");
//// ÇIKIŞ GÖSTERGESİ /////////////////////
u8g2.drawRFrame(34, 1, 15, 11, 3);
//u8g2.drawRFrame(33, 53, 13, 9, 3);
u8g2.setFont(u8g2_font_micro_tr);
u8g2.setCursor(38, 9);
u8g2.print("ON");
//// CC GÖSTERGE ////////////////////////
//drawF(43, 52, 42, 12, 44, 53, 40, 10);
u8g2.drawRFrame(51, 1, 15, 11, 3);
// u8g2.drawRFrame(50, 53, 13, 9, 3);
u8g2.setCursor(55, 9);
u8g2.print("CC");
/// FAN GÖSTERGE ////////////////////////
if (sicaklik >= 21) {
u8g2.drawRFrame(68, 1, 17, 11, 3);
//u8g2.drawRFrame(67, 53, 17, 9, 3);
u8g2.setCursor(71, 9);
u8g2.print("FAN");
}
//// Volt Çerçeve ////////////////////////
drawF(0, 13, 85, 25, 1, 14, 83, 23);
//// Voltaj değerini ekrana yazdırma /////
ival = vIN * 100;
sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
u8g2.setFont(u8g2_font_VCR_OSD_tr);
//u8g2.drawStr(21, 0, "5");
u8g2.setCursor(5, 34);
u8g2.print(buffer);
u8g2.setCursor(69, 34);
u8g2.print(F("V"));
ival = 0;
//// Akım Çerçeve ////////////////////////
drawF(0, 39, 85, 25, 1, 40, 83, 23);
//// Amper değerini ekrana yazdırma //////
double valueI = (I <= 0) ? 00.00 : I;
ival = valueI * 100;
sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
u8g2.setFont(u8g2_font_VCR_OSD_tr);
//u8g2.drawStr(69, 0, "5");
u8g2.setCursor(5, 60);
u8g2.print(buffer);
u8g2.setCursor(69, 60);
u8g2.print(F("A"));
//// Kademe Çerçeve //////////////////////
drawF(86, 0, 42, 21, 87, 1, 40, 19);
if (vIN <= 11.00) {
digitalWrite(yirmialtiv, LOW);
digitalWrite(otuzikiv, LOW);
delay(20);
digitalWrite(onikiv, HIGH);
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(90, 10, "Kademe");
u8g2.setFont(u8g2_font_chikita_tr);
u8g2.drawStr(93, 17, "12 Volt");
} else if ((vIN >= 11.10) && (vIN <= 25.00)) {
digitalWrite(onikiv, LOW);
digitalWrite(otuzikiv, LOW);
delay(20);
digitalWrite(yirmialtiv, HIGH);
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(90, 10, "Kademe");
u8g2.setFont(u8g2_font_chikita_tr);
u8g2.drawStr(92, 17, "26 Volt");
} else if (vIN >= 25.10) {
digitalWrite(onikiv, LOW);
digitalWrite(yirmialtiv, LOW);
delay(20);
digitalWrite(otuzikiv, HIGH);
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(90, 10, "Kademe");
u8g2.setFont(u8g2_font_chikita_tr);
u8g2.drawStr(92, 17, "32 Volt");
}
//// Temp Çerçeve ////////////////////////
drawF(86, 22, 42, 22, 87, 23, 40, 20);
if (sicaklik <= 38) {
digitalWrite(fan_led, LOW);
temp(sicaklik);
} else if (sicaklik >= 45) {
digitalWrite(fan_led, HIGH);;
temp(sicaklik);
} else {
temp(sicaklik);
}
//// Watt Çerçeve ////////////////////////
drawF(86, 45, 42, 19, 87, 46, 40, 17);
//// Watt hesaplama ve ekrana yazdırma ///
double value = (I * vIN < 0) ? 0.00 : I * vIN;
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(119, 60, "W");
u8g2.setFont(u8g2_font_chikita_tr);
//u8g2.setFont(u8g2_font_profont10_tn);
u8g2.setCursor(93, 58);
u8g2.print(value);
u8g2.sendBuffer();
//// Değerleri sıfırlama ////////////////
/*Cdata = 0;
I = 0;
V = 0;
Vdata = 0;
vIN = 0;
value;*/
delay(50);
}
}
void loop1(void) {
for (int i = 0; i < 300; i++) // daha kararlı ortalama bir sonuç almak için 300 kez okuma yapma
{
Cdata = Cdata + analogRead(currentSensor);
Vdata = Vdata + analogRead(voltageSensor);
delay(1);
}
/// VOLTAJ VE AKIM KODLARI ///////////////
Cdata = Cdata / 300;
V = (Cdata / 2048.0) * 3300;
I = ((V - 2484) / 66);
//I = (2.5 - (Cdata * (5.0 / 1024.0)) )/0.066;
Vdata = Vdata / 300;
vOUT = (Vdata * 3.3) / 1023.0;
vIN = (vOUT / (R2 / (R1 + R2)));
/// LM35 Sıcaklık Sensörü
for (int i = 0; i < 350; i++) // daha kararlı ortalama bir sonuç almak için 50 kez okuma yapma
{
lm35 = lm35 + analogRead(lm35Pin);
delay(1);
}
lm35 = lm35 / 350;
//Serial.print("Lm35: ");
//Serial.println(lm35);
/*sicaklik_gerilim = (5000.0 / 1824.0) * lm35;
sicaklik = sicaklik_gerilim / 10.0;*/
sicaklik_gerilim = (3293.0 / 1240.0) * lm35;
sicaklik = sicaklik_gerilim / 10.0;
//Serial.print("sicaklik_gerilim ");
//Serial.println(sicaklik_gerilim);
///////////////////////////////////
}