Ds1302 zamanlayıcı problemi ve lcd shield zaman raporu
  • Bir oda, akvaryum,çiçek sulama ve başka bir yerde su ısıtma otomasyonu var.
    1. Su eksildiğinde otomatik tamamlayacak (ultrasonic sensö+servo ile)
    2. Haftada 1 gün %20 su değişimi yapacak.(2 roleye bağlı iki motor ile)
    3. Sabah-akşam yemleme (servo ile)
    4.ışıklar akşam 7de açılacak 23 de kapanacak(role ile)
    5. Çiçekler higrometreden veri alıp sulama yapacak. (Role yada mini su motoru ile)
    6. Akvaryum ısısı kontrol edilecek ve ayarlanacak (ds18b20+role)
    7.oda ısısı ve nemi kontrol edilecek ve ayarlanacsk (dht11+roleye bağlı nem cihazı ile)
    8. Diğer yerdeki su ısısı kontrol edilecek (diğer ds18b20+role)
    9.bunlar lcd shield menüde gözükecek.
    Kodları yazdım. Lcd shield ekranında oda nem sicaklik ve akvaryum sicakligi vs görüyorum ve diğerleri için menü oluşturdum.
    İki sorunum kaldı.
    1-dediğim gibi da1302 ile zamanlayıcı komutu verip iki süre atası çalışırabiliyorum. (Işıklar için kullanıyorum bunu) ama şu saatte çalış diyemiyorum (servolar için)
    2-lcd menulere girince şu saatte şu oldu diye göremiyorum?
    Bu iki sorun bitse kutulama yapıp bebeğin odasına kuracağım.
  • @embeddedsystem arkdasımızın buraya koydugu kendı yazdıgı kodlar vardı forumda bıraz bakınırsan bulabılırsın
  • Menü oluşturma 1 diye bir videosu vardı.
    Burda kod bulamadım ama o video ise orda benim verdiğim linkteki taslak da iş görüyor.
    En buy sıkıntım saat:/
  • Anlık ilerlemesinin sebebi , ana ekran içerisinde onu güncellemediğiniz için olabilir mi? bastığınz herhangi bir fonk içinde güncelliyorsanız ondan olabilir.Kodunuzu paylaşın bakalım isterseniz.
  • //KÜTÜPHANELER
    #include "OneWire.h"
    #include "LiquidCrystal.h"
    #include "DallasTemperature.h"
    #include "DS1302.h"
    #include "dht11.h"
    #include "Versalino.h"
    #include "Wire.h"
    #include "Servo.h"

    //DC Motor
    const int motorPin1 = 51;
    const int motorPin2 = 53;
    int duration,distance;
    int kontrolbit1=1,kontrolbit2=1;

    //SERVO YEMLEME
    Servo yemleme;

    //KARAKTERLER
    byte karakter0[8] = { 0x00, 0x00, 0x0A, 0x00, 0x11, 0x0E, 0x00, 0x00 }; // gülen surat
    byte karakter1[8] = { 0x0C, 0x12, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00 }; // santigrat
    byte karakter2[8] = {0b00110,0b00100,0b00110,0b00100,0b01110,0b10001,0b10001,0b01110}; //derece
    byte karakter3[8] = {0b01110,0b00100,0b11111,0b00001,0b11101,0b00101,0b00101,0b00101}; // musluk
    byte karakter4[8] = { 0x00, 0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00 }; // kalp
    byte karakter5[8] = { 0b00000,0b00100,0b00100,0b01010,0b10001,0b10001,0b01110,0b00000 }; // damla
    byte karakter6[8] = {0b10000,0b10101,0b11010,0b10000,0b10000,0b10000,0b10000,0b11111}; //akvaryum1
    byte karakter7[8] = {0b00001,0b01011,0b10101,0b00001,0b00001,0b00001,0b00001,0b11111}; //akvaryum2

    //Ekran
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

    //SENSÖRLER
    //1-Oda nem sıcaklık
    dht11 DHT;

    //2-Saat
    DS1302 rtc(10,11,12);
    Time t;

    //3-Akvaryum Sıcaklık
    int temp_sensor = 16;
    float temperature = 0;
    OneWire oneWirePin(temp_sensor);
    DallasTemperature sensors(&oneWirePin);

    //SU TAMAMLAMA
    #define trigPin 3
    #define echoPin 2





    //Ledle zamanlayıcı deneme
    //int Led=48;

    //________________________________________________________________________________________________________________________________


    void setup() {
    // pinMode(Led, OUTPUT);
    //SERVO YEMLEME
    yemleme.attach(33);
    Serial.begin (9600);
    lcd.begin(16, 2);
    //3-Akvaryum DS18B20
    sensors.begin();

    //Saat
    rtc.halt(false); //DS1302
    rtc.writeProtect(false);

    //rtc.setDOW(WEDNESDAY);
    //rtc.setTime(14, 34, 0);
    //rtc.setDate(20, 9, 2017);

    //SU TAMAMLAMA
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);

    //DC Motor
    pinMode(motorPin1, OUTPUT);
    pinMode(motorPin2, OUTPUT);

    }



    void loop()
    {

    //KARAKTERLER
    lcd.createChar(0, karakter0);
    lcd.createChar(1, karakter1);
    lcd.createChar(2, karakter2);
    lcd.createChar(3, karakter3);
    lcd.createChar(4, karakter4);
    lcd.createChar(5, karakter5);
    lcd.createChar(6, karakter6);
    lcd.createChar(7, karakter7);
    lcd.clear();


    /////////////////ANA EKRAN BAŞLANGIÇ///////////////////////
    //1-Oda nem sıcaklık
    DHT.read(A1);
    lcd.setCursor(0,2);
    lcd.write(byte(2));
    lcd.setCursor(1,2);
    lcd.print(":");
    lcd.setCursor(2,2);
    lcd.print(DHT.temperature);
    lcd.setCursor(4,2);
    lcd.write(byte(1));
    lcd.setCursor(5,2);
    lcd.print("C");
    lcd.setCursor(0,0);
    lcd.write(byte(5));
    lcd.setCursor(1,0);
    lcd.print(":");
    lcd.setCursor(4,0);
    lcd.print("%");
    lcd.setCursor(2,0);
    lcd.print(DHT.humidity);
    delay (1000);
    //2-Saat
    lcd.setCursor(8,0);
    lcd.print(rtc.getTimeStr());
    delay (1000);

    //3-Akvaryum DS18B20
    lcd.setCursor(7,2);
    lcd.write(byte(6));
    lcd.setCursor(8,2);
    lcd.write(byte(7));
    lcd.setCursor(9,2);
    lcd.print(":");
    lcd.setCursor(10,2);
    sensors.requestTemperatures();
    temperature = sensors.getTempCByIndex(0);
    lcd.print(temperature);
    lcd.setCursor(14,2);
    lcd.write(byte(1));
    lcd.setCursor(15,2);
    lcd.print("C");
    delay (1000);
    /////////////////ANA EKRAN BİTİŞ///////////////////////


    //4-SU TAMAMLAMA MESAFE ÖLÇÜM
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(500);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = (duration/2) / 29.1;
    Serial.print(distance);
    Serial.println(" CM");

    //4-1- Su Tamamlama-DC Motorla

    /* if( distance <5 || distance >7 )
    {

    kontrolbit2=1;
    if(kontrolbit1)
    {kontrolbit1=0;

    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    delay(500);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    }
    }

    else
    {
    kontrolbit1=1;
    if(kontrolbit2)
    {
    kontrolbit2=0;


    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, HIGH);
    delay(500);
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);

    }}
    */

    //4-2- Su tamamlama Servo İle
    /* if( distance <5 || distance >7 )
    {

    servom.write(180);
    } else

    servom.write(0);*/

    //6-SERVO YEMLEME
    //6-1 Servo Mesafe Kodları
    /* if( distance <5 || distance >7 )
    {

    servom.write(180);
    } else

    servom.write(0);*/

    //6-2 Servo Zamanlayıcı
    /* t=rtc.getTime();
    delay (1000);
    if ((t.hour == 18) && (t.min == 38) && (t.sec >= 00 && t.sec <=30 ))<br />{
    servom.write(180);
    } else

    servom.write(0);
    */


    //Led Zamanlayıcı Denemesi
    /* t=rtc.getTime();
    delay (1000);
    if ((t.hour == 18) && (t.min == 38) && (t.sec >= 00 && t.sec <=30 ))<br />{
    digitalWrite(Led,HIGH);
    }
    else
    {
    digitalWrite(Led,LOW);
    */


    }
  • Kullandığım kodların bir kısmı bunlar.
    Buna başka bir kovadaki sıcaklık sensörü, ışık zamanlayıcı, çiçek sulama vs eklenecek o yüzden bir kısmı taslak halinde kodların.
    ana ekranda olmasını istediğim yeri başlangıç ve bitiş olarak işaretledim.
  • Ana ekranda
    lcd.setCursor(8,0);
    lcd.print(rtc.getTimeStr());
    delay (1000);

    bu kısımda sonra herhangi bir saat güncelleme işlemi bulunmuyor ayrıca bu kısımdan sonra 1 sn bekleme mevcut , ondan sonra ds18 sensörünü yazdırmışsınız orada da bekleme mevcut 1sn lik , kod ana ekranda dönerken nem ve sıcaklık için tekrar bekleme mevcut saatin 3er saniye gibi sonradan ilerlemesi gayet normal burada ki yazılıma göre.Kullandığınız saat kütüphanesinde update fonksiyonu mevcut mu ona bakın , ya da dahili olarak saati çektiğinz fonk içeriisnde vardır fakat koyduğunuz beklemelerden dolayı gayet normal ve ekranı hiç temizliyorsunuz ,
    örneğin 11den geriye doğru saydığınızı varsıyorum
    11
    10
    9
    8 diye gider , eğer ekranı temizlemez iseniz , 9'u göstereceği zaman 90 gösterebilir, bilginiz olsun.
  • Yapmak istediğim menü de şu şekilde:
    http://www.hackshed.co.uk/arduino-lcd-keypad-shield-basic-menu-system/
    ana ekranda kodlardaki yer.(saat, oda, nem ve sıcaklığı, akvaryum sıcaklığı)
    menülerde:
    -yemleme
    -su değişimi
    -kova sıcaklığı
    -çiçekler
    -su tamamlama
    vs tarzı menüler
    onları da tıklayınca
    -"ok" "gerçekleşme saati"
    -kova sıcaklığı:
    -"ok" gerçeklşme saati"

    gibi bilgiler yapmayı düşündüm.
    kodlarda loop kısmına ana ekrandaki loop kısmını koyuyorum delay(1000) şeklinde.
    ama menüye atınca dediğim gibi saat "o anki saat, dakika, saniye" veriyor. 5 sn sonra tekrar bakınca sat ilerliyor ama anlık saniye saniye ilerlemiyor. nem sıcaklık değerleri de aynı şekilde.
  • Hocam neden ilerlemediğini size söylüyorum ya , siz araya bekleme sürelerini koymuşsunuz bu yüzden anlık ilerleme göremezsiniz
    sizin yaptığınızı şöyle tarif edeyim ,

    Başla
    Biraz bekle ( 1 saniye burada bekledik
    Saati göster ( diyelim 12.54.03)
    Bekle (1 saniye burada bekledik)
    Bekle (1 saniye burada bekledik)
    Saati göster , ( saat oldu 12.54.07)

  • loop döngüsünün sonuna sadece bir tane mi delay(1000) koymalıyım?
  • hocam gecikme değil sorun, komple o anlık gösterme.
    12:54:03'te baktık diyelim.
    bir daha 3 saat sonra 15:54:03'te de baksanız ekranda 12:54:03 kalıyor.
    gecikme değil akmama problemi var.
  • Sadece modülü alıp tek başına kulladınız mı?
  • evet.
    bakın
    ;
    #include < DS1302.h>
    #include < LiquidCrystal.h>
    #include < dht11.h>
    #include < OneWire.h>
    #include < DallasTemperature.h>

    //KARAKTERLER
    byte karakter0[8] = { 0x00, 0x00, 0x0A, 0x00, 0x11, 0x0E, 0x00, 0x00 }; // gülen surat
    byte karakter1[8] = { 0x0C, 0x12, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00 }; // santigrat
    byte karakter2[8] = {0b00110,0b00100,0b00110,0b00100,0b01110,0b10001,0b10001,0b01110}; //derece
    byte karakter3[8] = {0b01110,0b00100,0b11111,0b00001,0b11101,0b00101,0b00101,0b00101}; // musluk
    byte karakter4[8] = { 0x00, 0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00 }; // kalp
    byte karakter5[8] = { 0b00000,0b00100,0b00100,0b01010,0b10001,0b10001,0b01110,0b00000 }; // damla
    byte karakter6[8] = {0b10000,0b10101,0b11010,0b10000,0b10000,0b10000,0b10000,0b11111}; //akvaryum1
    byte karakter7[8] = {0b00001,0b01011,0b10101,0b00001,0b00001,0b00001,0b00001,0b11111}; //akvaryum2

    //SENSÖRLER
    dht11 DHT; //Oda nem sıcaklık
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    DS1302 rtc(10,11,12);
    //Time t;

    //Akvaryum Sıcaklık
    int temp_sensor = 16;
    float temperature = 0;
    OneWire oneWirePin(temp_sensor);
    DallasTemperature sensors(&oneWirePin);

    //int Led=48; //LED ile zamanlayıcı denemesi
    void setup()
    {
    lcd.begin(16, 2);
    Serial.begin(9600);
    //Akvaryum DS18B20
    // pinMode(Led, OUTPUT);
    sensors.begin();

    //DS1302 setup
    rtc.halt(false);
    rtc.writeProtect(false);
    //rtc.setDOW(MONDAY);
    //rtc.setTime(21, 21, 45);
    //rtc.setDate(26, 9, 2017);

    lcd.createChar(0, karakter0);
    lcd.createChar(1, karakter1);
    lcd.createChar(2, karakter2);
    lcd.createChar(3, karakter3);
    lcd.createChar(4, karakter4);
    lcd.createChar(5, karakter5);
    lcd.createChar(6, karakter6);
    lcd.createChar(7, karakter7);
    lcd.clear();


    lcd.clear();

    }

    void loop()
    {

    DHT.read(A1);
    //Saat Bilgileri
    lcd.setCursor(8,0);
    lcd.print(rtc.getTimeStr());
    //t=rtc.getTime();

    /*if ((t.hour == 18) && (t.min == 38) && (t.sec >= 00 && t.sec <=30 ))<br />{
    digitalWrite(Led,HIGH);
    }
    else
    {
    digitalWrite(Led,LOW);
    }*/



    //Nem-Sıcaklık Bilgileri

    lcd.setCursor(0,2);
    lcd.write(byte(2));
    lcd.setCursor(1,2);
    lcd.print(":");
    lcd.setCursor(2,2);
    lcd.print(DHT.temperature);
    lcd.setCursor(4,2);
    lcd.write(byte(1));
    lcd.setCursor(5,2);
    lcd.print("C");
    lcd.setCursor(0,0);
    lcd.write(byte(5));
    lcd.setCursor(1,0);
    lcd.print(":");
    lcd.setCursor(4,0);
    lcd.print("%");
    lcd.setCursor(2,0);
    lcd.print(DHT.humidity);

    //Akvaryum Sıcaklığı
    lcd.setCursor(7,2);
    lcd.write(byte(6));
    lcd.setCursor(8,2);
    lcd.write(byte(7));
    lcd.setCursor(9,2);
    lcd.print(":");
    lcd.setCursor(10,2);
    sensors.requestTemperatures();
    temperature = sensors.getTempCByIndex(0);
    lcd.print(temperature);
    lcd.setCursor(14,2);
    lcd.write(byte(1));
    lcd.setCursor(15,2);
    lcd.print("C");

    delay (1000);
    }
    bu kodlar sorunsuz çalışırken,
  • aynı kodları bir başka menü kodu içinde deniyorum;

    #include < DS1302.h>
    #include < LiquidCrystal.h>
    #include < dht11.h>
    #include < OneWire.h>
    #include < DallasTemperature.h>

    //KARAKTERLER
    byte karakter0[8] = { 0x00, 0x00, 0x0A, 0x00, 0x11, 0x0E, 0x00, 0x00 }; // gülen surat
    byte karakter1[8] = { 0x0C, 0x12, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00 }; // santigrat
    byte karakter2[8] = {0b00110,0b00100,0b00110,0b00100,0b01110,0b10001,0b10001,0b01110}; //derece
    byte karakter3[8] = {0b01110,0b00100,0b11111,0b00001,0b11101,0b00101,0b00101,0b00101}; // musluk
    byte karakter4[8] = { 0x00, 0x00, 0x0A, 0x1F, 0x1F, 0x0E, 0x04, 0x00 }; // kalp
    byte karakter5[8] = { 0b00000,0b00100,0b00100,0b01010,0b10001,0b10001,0b01110,0b00000 }; // damla
    byte karakter6[8] = {0b10000,0b10101,0b11010,0b10000,0b10000,0b10000,0b10000,0b11111}; //akvaryum1
    byte karakter7[8] = {0b00001,0b01011,0b10101,0b00001,0b00001,0b00001,0b00001,0b11111}; //akvaryum2

    //SENSÖRLER
    dht11 DHT; //Oda nem sıcaklık
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    DS1302 rtc(10,11,12);
    //Time t;

    //Akvaryum Sıcaklık
    int temp_sensor = 16;
    float temperature = 0;
    OneWire oneWirePin(temp_sensor);
    DallasTemperature sensors(&oneWirePin);

    int keypad_pin = A0;
    int keypad_value = 0;
    int keypad_value_old = 0;

    char btn_push;

    byte mainMenuPage = 1;
    byte mainMenuPageOld = 1;
    byte mainMenuTotal = 4;

    void setup()
    {
    lcd.begin(16, 2);
    Serial.begin(9600);
    //Akvaryum DS18B20
    // pinMode(Led, OUTPUT);
    sensors.begin();

    //DS1302 setup
    rtc.halt(false);
    rtc.writeProtect(false);
    //rtc.setDOW(MONDAY);
    //rtc.setTime(21, 21, 45);
    //rtc.setDate(26, 9, 2017);

    lcd.createChar(0, karakter0);
    lcd.createChar(1, karakter1);
    lcd.createChar(2, karakter2);
    lcd.createChar(3, karakter3);
    lcd.createChar(4, karakter4);
    lcd.createChar(5, karakter5);
    lcd.createChar(6, karakter6);
    lcd.createChar(7, karakter7);
    lcd.clear();

    lcd.clear();
    lcd.begin(16,2); //Initialize a 2x16 type LCD

    MainMenuDisplay();
    delay(1000);
    }
    void loop()
    {
    btn_push = ReadKeypad();

    MainMenuBtn();

    if(btn_push == 'S')//enter selected menu
    {
    WaitBtnRelease();
    switch (mainMenuPage)
    {
    case 1:
    MenuA();
    break;
    case 2:
    MenuB();
    break;
    case 3:
    MenuC();
    break;
    case 4:
    MenuD();
    break;
    }

    MainMenuDisplay();
    WaitBtnRelease();
    }



    delay(10);

    }//--------------- End of loop() loop ---------------------
    void MenuA()
    {
    lcd.clear();
    DHT.read(A1);
    //Saat Bilgileri
    lcd.setCursor(8,0);
    lcd.print(rtc.getTimeStr());
    //t=rtc.getTime();

    /*if ((t.hour == 18) && (t.min == 38) && (t.sec >= 00 && t.sec <=30 ))<br />{
    digitalWrite(Led,HIGH);
    }
    else
    {
    digitalWrite(Led,LOW);
    }*/



    //Nem-Sıcaklık Bilgileri

    lcd.setCursor(0,2);
    lcd.write(byte(2));
    lcd.setCursor(1,2);
    lcd.print(":");
    lcd.setCursor(2,2);
    lcd.print(DHT.temperature);
    lcd.setCursor(4,2);
    lcd.write(byte(1));
    lcd.setCursor(5,2);
    lcd.print("C");
    lcd.setCursor(0,0);
    lcd.write(byte(5));
    lcd.setCursor(1,0);
    lcd.print(":");
    lcd.setCursor(4,0);
    lcd.print("%");
    lcd.setCursor(2,0);
    lcd.print(DHT.humidity);

    //Akvaryum Sıcaklığı
    lcd.setCursor(7,2);
    lcd.write(byte(6));
    lcd.setCursor(8,2);
    lcd.write(byte(7));
    lcd.setCursor(9,2);
    lcd.print(":");
    lcd.setCursor(10,2);
    sensors.requestTemperatures();
    temperature = sensors.getTempCByIndex(0);
    lcd.print(temperature);
    lcd.setCursor(14,2);
    lcd.write(byte(1));
    lcd.setCursor(15,2);
    lcd.print("C");



    while(ReadKeypad()!= 'L')
    {
    //Insert Task for Menu A here

    }
    delay (1000);
    }
    void MenuB()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu B");

    while(ReadKeypad()!= 'L')
    {
    //Insert Task for Menu B here

    }
    }
    void MenuC()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu C");

    while(ReadKeypad()!= 'L')
    {
    //Insert Task for Menu C here

    }
    }
    void MenuD()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu D");

    while(ReadKeypad()!= 'L')
    {
    //Insert Task for Menu D here

    }
    }

    void MainMenuDisplay()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    switch (mainMenuPage)
    {
    case 1:
    lcd.print("1. Menu A");
    break;
    case 2:
    lcd.print("2. Menu B");
    break;
    case 3:
    lcd.print("3. Menu C");
    break;
    case 4:
    lcd.print("4. Menu D");
    break;
    }
    }

    void MainMenuBtn()
    {
    WaitBtnRelease();
    if(btn_push == 'U')
    {
    mainMenuPage++;
    if(mainMenuPage > mainMenuTotal)
    mainMenuPage = 1;
    }
    else if(btn_push == 'D')
    {
    mainMenuPage--;
    if(mainMenuPage == 0)
    mainMenuPage = mainMenuTotal;
    }

    if(mainMenuPage != mainMenuPageOld) //only update display when page change
    {
    MainMenuDisplay();
    mainMenuPageOld = mainMenuPage;
    }
    }

    char ReadKeypad()
    {
    /* Keypad button analog Value
    no button pressed 1023
    select 741
    left 503
    down 326
    up 142
    right 0
    */
    keypad_value = analogRead(keypad_pin);

    if(keypad_value < 100)
    return 'R';
    else if(keypad_value < 200)
    return 'U';
    else if(keypad_value < 400)
    return 'D';
    else if(keypad_value < 600)
    return 'L';
    else if(keypad_value < 800)
    return 'S';
    else
    return 'N';

    }

    void WaitBtnRelease()
    {
    while( analogRead(keypad_pin) < 800){}
    }
  • kodlar aynı kodlar.
    setup kısmını menü setup kısmına, loop kısmını bu menüde mesela A menu kısmına koydum. menüyü açtığım andaki değerler gözüküyor. ama değişimler yok ancak çıkıp tekrar girince değişiyor.
  • Hocam çünkü menü yenilendiğinde geliyor fonksiyon , ekranı temizliyor musunuz=
  • video yüklüyorum hocam.
  • video yolladım hocam
  • Hallettim.
    "Inside menu .... " kısmında sadece clear birakip, komutları While'dan sonra yazınca akıcı oluyor.
    Peki ben şimdi mesela servo çalıştığında mesela menü kısmına
    "ok" "gerçekleşme saati"
    Şeklinde kontrol etmek için nasıl komut yazmalıyım?
  • Dediğim gibi clear bırakmanız gerekiyordu :) halletiğinize sevindim. Onun için kafanızda bir menü algoritması oluşturmanız gerekiyor.

    Butonların basılmasına göre , menü içinde gezebileceğiniz tarzda.
  • Clear verince de olmadi ustat.
    Ancak while dongusunden sonra yazinca oldu.
    Benim dedigim Buton basılması ile değil hocam.
    Buton basarak, sayaç şeklinde birkaç örnek "yapildi" tarzında rapor vermek için.
    Ama ds1302 modul ile gerçekleşme saati için bir örnek bulamadım.
    Bir de mesela benim yukardaki örnekteki gibi servo çalışınca yapılsın tarzı bişey bulamadım.
    Genelde buton-sayaç örnekleri var.
  • Mesela benim D menüsünde su tamamlama var.
    Ben normal if döngüsünü yazıyorum mesafe 4cm'den büyükse servo 180,,4 cm olunca servo 0.
    Şeklinde.
    Şimdi inside D menü kısmında şöyle bi kod lazım.
    Servo çalışınca inside menu yerine "ok" "13:26:10" tarzı yapılış saati yazsın takip amaçlı.
  • böyle bir şey hazırlamıştım işinizigörür mü
  • yok hocam ben zamanlamayı zaten kodlarla yaptım.
    sadece kontrolü lazım:
    .
    .
    .
    void MenuE()
    {
    lcd.clear();

    while(ReadKeypad()!= 'L')
    {
    lcd.clear();
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(500);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = (duration/2) / 29.1;
    lcd.setCursor(0,1);
    lcd.print("DERiNLiK:");
    lcd.setCursor(10,1);
    lcd.print(40-distance);
    lcd.setCursor(12,1);
    lcd.print(" CM");
    delay(500);

    SU TAMAMLAMA
    SERVOYLA
    if( distance <5 || distance >7 )


    {
    servo.write(180);
    } else

    servo.write(0);
    }
    .
    .
    .
    .
    .
    şeklinde komut yazdım, servo çalışınca birinci satıra "ok" "14:06:30" gibi gerçekleşme saati ve yapıldı tarzı rapor olsun diye düşündüm.
    ama DS1302 RTC modülden gerçekleşme anı nasıl çekilir bilemedim.
  • yazdıklarından anladğım kadarı ile;

    işlemin tamamlandığı kontrolcüye:

    string suansaat=rtc.getTimeStr());
    lcd.cursor( nereye istiyorsan );
    lcd.print(suansaat);
    ...
    ...
    ...
  • rtc.getTimeStr denedim serial print ten olmadı

    Lcd ile deniyor birdr
  • Normal o andaki saati gösteriyor.
    ikinci bir saat oldu yani.
    ben servonun ne zaman çalıştığını dolayısı ile yemlemenin,su değişiminin hangi saatte olduğunu(daha doğrusu olup olmadığını) kontrol etmek istiyorum.
  • Bos bir sketch ac. Lcdye tarihi yazdirmayi dene.
  • yok hocam akıcı halde gidiyor saat.
    o andaki sat ekranda kalmıyor.
  • Kodlarinda sorun vardir. Kod okuyabiliyor musun
  • Kısmen.
    Hayır verdiğiniz komutları girdim, gerçekleştiği andaki değeri yazmadı ki?
    normal rtc'den saat bilgilerini alıp saniye saniye ilerledi.
  • void MenuE()
    { lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("SU TAMAMLAMA");

    while(ReadKeypad()!= 'L')
    {

    digitalWrite(trigPin, HIGH);
    delayMicroseconds(500);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = (duration/2) / 29.1;
    lcd.setCursor(0,1);
    lcd.print("DERiNLiK:");
    lcd.setCursor(10,1);
    lcd.print(40-distance);
    lcd.setCursor(12,1);
    lcd.print(" CM");
    delay(500);

    //SU TAMAMLAMA
    //SERVOYLA
    if( distance <5 || distance >7 )
    {
    yemleme.write(180);


    }
    else
    {
    yemleme.write(0);
    }
  • Komutun tamamı burda.
    mesafe 5 ile 7 arasıdaysa servo vanayı açıyor, değilse kapalı bekliyor.
    ben açıldığını ve açıldığı saati yukarda su tamamlama kısmı yazan yerde görmek istiyorum.
  • distance içinde fonk tanımla , saati çağır ve gönder

  • Saati çağırmadan problem var üstat.
    Saati çağırınca değer akıcı ilerliyor.
    O anki değer gözükmüyor.
    3 mesaj yukardaki kodu düzenlemenin memnun mu acaba?
    Zaten yemleme kodunun tamamı o.
  • Artı ds1302'de
    If ((t.hour=13)&&(t.min=15)&&(t.sec=0))
    {yemleme.write(180);
    delay (500);
    yemleme.write (0);
    }
    Tarzı birşey de yapamadım. Yani bir zaman gelince işlem yaptıramadim.

    t=rtc.getTime();

    if ((t.hour == 18) && (t.min == 38) && (t.sec >= 00 && t.sec <=30)) <br />

    digitalWrite(role1,LOW);
    }
    else
    {
    digitalWrite(role1,HIGH);
    }

    Bu çalışıyor. Yani role 30 sn sureyle acilip kapaniyor ama o anda sunu yap tarzi bir komut olmuyor?
    Biri calisirken diğeri neden olmuyor anlamadim
  • Multitasking gibi işlemler arduinoya yorar , ben açıkcası mantığınızı da tam anlamadım , anladığım kısmıda kulağa hiç hoş gelmedi , çok düzensiz bir yapı var . neyin ne olacağı hiç belli değil.
  • Bir oda, akvaryum,çiçek sulama ve başka bir yerde su ısıtma otomasyonu var.
    1. Su eksildiğinde otomatik tamamlayacak (ultrasonic sensö+servo ile)
    2. Haftada 1 gün %20 su değişimi yapacak.(2 roleye bağlı iki motor ile)
    3. Sabah-akşam yemleme (servo ile)
    4.ışıklar akşam 7de açılacak 23 de kapanacak(role ile)
    5. Çiçekler higrometreden veri alıp sulama yapacak. (Role yada mini su motoru ile)
    6. Akvaryum ısısı kontrol edilecek ve ayarlanacak (ds18b20+role)
    7.oda ısısı ve nemi kontrol edilecek ve ayarlanacsk (dht11+roleye bağlı nem cihazı ile)
    8. Diğer yerdeki su ısısı kontrol edilecek (diğer ds18b20+role)
    9.bunlar lcd shield menüde gözükecek.
    Kodları yazdım. Lcd shield ekranında oda nem sicaklik ve akvaryum sicakligi vs görüyorum ve diğerleri için menü oluşturdum.
    İki sorunum kaldı.
    1-dediğim gibi da1302 ile zamanlayıcı komutu verip iki süre atası çalışırabiliyorum. (Işıklar için kullanıyorum bunu) ama şu saatte çalış diyemiyorum (servolar için)
    2-lcd menulere girince şu saatte şu oldu diye göremiyorum?
    Bu iki sorun bitse kutulama yapıp bebeğin odasına kuracağım.
  • Neyse bu sorunu da çözdüm.
    İki ayrı if yerine içiçe if, else if şeklinde yaptım tüm zamanlayicilari.
    Tek sorun kaldı.
    İşlemi yapınca ekranda "ok" "gerceklesme saati"

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.