Tuşlu Rotary Encoder Modül Yapımı

C++:
//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_akim;
float degisim;
int sayac;

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_akim = 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_akim * 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();
  }
 
C++:
//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_akim;
float degisim;
int sayac;

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_akim = 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_akim * 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();
  }
abi anlamadım.
delay(10);
neden yazmıyoruzda mikrosaniye cinsinden yazıyoruz ne değişim oluyor
 
Bu kod derlemez. voltaj tanımlı değil, ival da tanımlı değil. Programı kısmi olarak koydun herhalde.
 
C++:
if (millis() - oncekiZaman > 1 && PinDT == HIGH ) {
burayı bu şekilde yapalım boşuna 1 if ekleyip karıştırmamış oluruz
 
Sayın @Gokrtl bugünkü derlemenin düzeltmeleri yapılmış halini pdf olarak paylaşıyorum. Bu düzeltmelere binaen yukarıda hatalı içerik barındıran mesajı silmeye gerek yok sanırım...

ayrı ayrı sayılara gerek yok. Aşağıda bir taslak olarak yazdım. Satır sayısına bakma, mantığın kolaylığına ve anlaşılırlığına bak.

C++:
#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;
int artieksi;


void loop()
{
    if (enkoder_sola_dondu)
    {
        artieksi = -1;
    }
    else
    {
        artieksi = 1;
    }

    float yeni_voltaj = voltaj + artieksi * katsayilar[kursor_pos];

    if ((yeni_voltaj <= MAX_VOLTAJ) && (yeni_voltaj >= MIN_VOLTAJ))
    {
        voltaj = yeni_voltaj;
        ekrani_tazele();
    }
}
Bu arada sayın @taydin gayet sade bir kod tasarımı paylaşmış. Hakikaten mest oldum...
 

Ekler

  • Rotary_Encoder_Hakkinda.pdf
    819.1 KB · Görüntüleme: 122
Bu kod derlemez. voltaj tanımlı değil, ival da tanımlı değil. Programı kısmi olarak koydun herhalde.
Abi senin koddan tek farkı sayac değişkeni.
Senin kodu kullanınca encoderden +1 yaparsam 30.00'a kadar kendi kendine yükseliyor.
Encoderi bir tık sol yaparsam bu seferde sıfıra kadar düşüyor.
Ayrıca değişim diye bir değişken oluşturmuşsun ama bir yerde kullanmamışsın. Ustanın iyisi değiken mi artırır? :D

C++:
//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 sayac;
int ival;

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();
    }
//// 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();
 
Abi senin koddan tek farkı sayac değişkeni.
Senin kodu kullanınca encoderden +1 yaparsam 30.00'a kadar kendi kendine yükseliyor.
Encoderi bir tık sol yaparsam bu seferde sıfıra kadar düşüyor.
Ayrıca değişim diye bir değişken oluşturmuşsun ama bir yerde kullanmamışsın. Ustanın iyisi değiken mi artırır? :D

C++:
//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 sayac;
int ival;

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();
    }
//// 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();

voltaj değişkenine bir değer atamadan kullanmışsın. O yüzden sıfıra düşüyor herhalde. Gereksiz ve kullanılmayan tüm değişkenleri kaldır.

Bir de program hala eksik gibi duruyor. encoder diye bir fonksiyon var, kimse çağırmıyor. page diye bir değişken var, kimse birşey yazmıyor. Programın tamamını koymazsan bize de müneccimlik yapmak düşer :D
 
Milletin desteğini almışsınız, böyle ezinti olur mu hiç?

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
O anlar beni. Karşılıklı takılmaca :D

voltaj değişkenine bir değer atamadan kullanmışsın. O yüzden sıfıra düşüyor herhalde. Gereksiz ve kullanılmayan tüm değişkenleri kaldır.

Bir de program hala eksik gibi duruyor. encoder diye bir fonksiyon var, kimse çağırmıyor. page diye bir değişken var, kimse birşey yazmıyor. Programın tamamını koymazsan bize de müneccimlik yapmak düşer :D
Tamamı telif hakkına girer abi. :katil2:

Abi tamamını paylaşsam kaybolursun içinde.
Sadece ilgili kısımları paylaşıyorumki kafa karışmasın.
encoder fonksiyonu "kesme" ile tanımlandığı için çağırılmasına gerek kalmadan çalışıyor. İçindeki "sayaç" değişkenini istediğim yerde çağırabiliyorum.
"page" değişkeni "keyPress" fonksiyonu içinde tanımlanıyor. Keypad den "A" ya basınca page = 'a' oluyor ve amperi set ettiğimiz sayfayı getiriyor ekrana.
Dur yinede paylaşayım tamamını.

C++:
#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);
  ///////////////////////////////////
}
 
Tamamı telif hakkına girer abi. :katil2:

Hele bir çalışır hale gelsin, sonra korursun telif hakkını :D

Şimdi bakıyorum benim koyduğum kodu ilave etmişsin, ama biraz aşağıda senin orijinal kod da bulunuyor. Yani benim kodun yaptığı işi sonradan senin kod iptal ediyor.

Bu problemi bu şekilde ancak çok büyük şans eseri veya çok uzun uğraşarak çözebilirsin. Yeni bir programda sadece bu enkoder kodu ve ekrana voltaj yazma kodu olsun. Basit bir programda görelim olan biteni. O ayrı programda çalışır hale getirip sonra asıl programa ilave et.
 
Hele bir çalışır hale gelsin, sonra korursun telif hakkını :D

Şimdi bakıyorum benim koyduğum kodu ilave etmişsin, ama biraz aşağıda senin orijinal kod da bulunuyor. Yani benim kodun yaptığı işi sonradan senin kod iptal ediyor.

Bu problemi bu şekilde ancak çok büyük şans eseri veya çok uzun uğraşarak çözebilirsin. Yeni bir programda sadece bu enkoder kodu ve ekrana voltaj yazma kodu olsun. Basit bir programda görelim olan biteni. O ayrı programda çalışır hale getirip sonra asıl programa ilave et.
Tamam abi. Yarın o şekilde devam edeyim. Şimdi işe gitme vaktim geldi.

@Endorfin35+ PrimeTime bitti, kalk yat, zabah işe gidecen :katil1:
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,900
Mesajlar
100,734
Üyeler
2,498
Son üye
TaKo

Son kaynaklar

Son profil mesajları

Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
Back
Top