#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);
//Timur abinin kodları
#define MAX_VOLTAJ 30.0
#define MIN_VOLTAJ 0.0
unsigned int kursor_konum; // 0 .. 3 arasinda degisiyor. 0 en soldaki hane
float katsayilar[] = {10, 1, 0.1, 0.01};
float voltaj = 0;
volatile int sayac = 0;
// Encoder Pinleri /////////////////////
#define PinCLK 7
#define PinDt 8
#define PinSw 6
/// 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
volatile bool PinDT = LOW;
long oncekiZaman;
int ival;
static char buffer[50];
void setup(void) {
Serial.begin(115200);
Wire.setSDA(0);
Wire.setSCL(1);
Wire.begin();
u8g2.begin();
pinMode(PinCLK, INPUT);
pinMode(PinDt, INPUT);
pinMode(PinSw, INPUT_PULLUP);
pinMode(up_btn, INPUT);
pinMode(right_btn, INPUT);
pinMode(down_btn, INPUT);
pinMode(left_btn, INPUT);
attachInterrupt(digitalPinToInterrupt(PinCLK) , encoder , FALLING );//BAĞLI PIN LOW OLURSA KES
attachInterrupt(digitalPinToInterrupt(PinSw) , debounce , FALLING );//BAĞLI PIN LOW OLURSA KES
}
//// Ç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);
}
/// Rotary Encoder Buton Fonksiyonu ///////
void debounce() {
detachInterrupt(PinSw);
boolean butonDurum = digitalRead(PinSw);
if (butonDurum == 0) {
}
attachInterrupt(digitalPinToInterrupt(PinSw) , debounce , FALLING );
delayMicroseconds(5000);
}
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) {
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();
}
//// 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();
}