Arduino Uno Düzensiz Çalışıyor
  • Arkadaşlar merhaba, uzun zamandır projemin üzerinde denemeler yapıyorum. Saatte 1 kere sıcaklık verisini alıp GPRS ile client sorgusu yapıp veritabanını yazdırıyor. Fakat bi düzensizlik var, çıldırmak üzereyim. Arduinoya enerjiyi veriyorum verileri saatte bir göndermeye başlıyor sonra bi ara veri gelmiyor 2 saat sonra geliyor, bazen hiç gelmiyor, bazen 5-6 saat sonra gelmemeye başlıyor, gidiyorum ışıkları yanıyor enerji var ama tıkanmış kalmış, resetliyorum düzeliyor falan filan.
    - Klon arduino kullanıyorum, hunharca kullandım, acaba düzensiz çalışma ondan mı kaynaklanıyor?
    - Kodlarda mı sıkıntı var?
    - Watdog tarzı bişey mi kullanmam lazım?
    Ben bu cihazı evde adaptörle besliyorum, şu düzeni sağladığımda araziye çıkaracağım ama lanet olsun ki güvenemiyorum.
    10 Watt Güneş Paneli + Solar Charger Controller + 12V 9A akü ile sistemi bile kurdum.

    Kullandığım kodları sizinle paylaşıyım belki yanlış olan bir şey vardır, bir fikir verirsiniz:



    #include <GSM.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>

    #define ONE_WIRE_BUS 8
    #define PINNUMBER ""


    // APN data
    #define GPRS_APN "internet" // replace your GPRS APN
    #define GPRS_LOGIN "" // replace with your GPRS login
    #define GPRS_PASSWORD "" // replace with your GPRS password

    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    GSMClient client;
    GPRS gprs;
    GSM gsmAccess;

    unsigned long suankizaman,oncekizaman=0;
    char server[] = "semercioglufidancilik.com";
    int port = 80;
    int sayac,i=0;


    void setup() {
    // initialize serial communications and wait for port to open:
    Serial.begin(9600);
    sensors.begin();

    Serial.println("Arduino Datalogger Hazirlaniyor..");


    }

    void loop() {

    suankizaman =millis();

    if(suankizaman - oncekizaman >= 60000) //1 dakikada bir sayac degiskeni artacak
    {
    oncekizaman = suankizaman;
    sayac++;

    }
    if(sayac == 60) //60 dakika = 1 saat
    {
    sayac = 0;
    sensors.requestTemperatures();

    Serial.println("Modem aciliyoor!");

    boolean notConnected = true;

    while (notConnected) {
    if ((gsmAccess.begin(PINNUMBER) == GSM_READY) &
    (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY)) {
    notConnected = false;
    } else {
    Serial.println("Baglanti hatasi!");
    delay(1000);
    }

    Serial.println("baglaniyor...");
    }
    i++;
    String path;
    path= "";
    path += "/arduino/php/add_data.php?id=";
    path += i;
    path += "&sicaklik=";
    path += double (sensors.getTempCByIndex(0));


    if (client.connect(server, port)) {

    // Make a HTTP request:
    client.print("GET ");
    client.print(path);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(server);
    client.println("Connection: close");
    client.println();
    Serial.println("veri yazildi..");
    } else {
    // if you didn't get a connection to the server:
    Serial.println("veri yazilamadi!");
    }

    gsmAccess.shutdown();
    Serial.println("Modem kapatildi!");
    }

    }

  • if(suankizaman - oncekizaman >= 60000) yerine
    şu şekilde dene
    if(suankizaman - oncekizaman >= 60000L)
  • global değişkenleri loopun içine aldım yani local değişken yaptım bakalım şimdi deneyecem nasıl olacak, Arduinoyaya olan güvenim gitgide azalıyor :((
  • milis değeri için unsigned long veya long kullansam ne değişir? tanımlanan en son long degerine gelince nolur, sıfırlanır mı? yada hiç milis işine girmeden delay(3600000000); yani 1 saat delay versem, hangisi daha mantıklı :) @fatihaslamaci
  • GSM e baglanmak için While döngüsü var büyük ihtimal oradan da döngüden çıkımıyor vs gibi bişeyler kaynaklanıyor olabilir. HTTP sorgusu yapmak için AT komutlarını bilen varsa paylaşabilir mi?
  • mumkunse gprs bağlantısını en başta setup kısmında halledin bağlantının devamlı açık olmasının size zararı yok gsm de genel bağlantı kurma ve yaşatma bayağı zordur operatorler bağlantı kopsa bıle bunu rapor etmıyorlar, sunucunuza verı yollasanızda yollamasanızda belirli peryotlarla bır el sıkışma yapın sunucuyu gormuyorsanız bağlantıyı koparıp yenıden kurmayı deneyın. birde sunucunuzsun ayarlarınde keep_alive aktif olsun genelde standart sunucularda port aktif olmasın diye 10-15 dakika sonra port kapatılır hatta port 80 de portu devamlı açıp tutmaz http de verıyı alır atar bırdaha bağlantı kalamaz yenıden bağlanmayı denersın bu sefer sunuc cevap vermez fılan hep dert. websunucu kullanmak yerıne tcp-ip dırek haberleşecegınız bir yapı kurabılırsenız daha sağlıklı olur. web suncularda yoğun bir trafik yoksa uyumaya fılan gecer bağlanmaya çalıştıgınızda sununun tekrar aktif olması dbleri açması fılan bazen 30sn yi gecer bu kısımları halletmezsenız yada test etmezsenız cok sıkıntı yaşarsınız. arduunonun stabılıtesı dusuk kutuphaneleri daha yazmadım bıle. ticari operasyonlara uygun degıl arduıno eğer kullanacaksanız her kutuphanenın ve işin neredeyse kendı işinize uygun versıyonlarını yazmanız şart
  • Görüşleriniz için teşekkür ederim, yani istediğim aslında cok zor birşeyde degil gibi görünüyor yada bilmiyorum, Arduino ile evet ticari operasyonlara uygun değil ama ev otomasyonlarında bunları sorunsuz kullanan bir sürü insan var, yapan bu işi iyi yapıyor. Artık isyanlardayım yani.
    - Sunucuyu cogu kez test ettim sorguyu yapar yapmaz veritabanına anında çakıyor veriyi o yandan sıkıntı yok.
    - Tek sıkıntı şu arduinoyu stabil çalıştırmak. Saatte bir veriyi göndermek için sizce nasıl bi timer kullanmalıyım? http sorgusunu birde AT komutlarıyla yapmayı deneyeceğim.
    - GSM bağlanma işini setupda yapıp bitirin demişsiniz ama her http sorgusu öncesi bağlanmak istiyor. Kafam allak pullak...

    Yani aslında Arduinodan kaçış yok, öğrenci işi, ucuz maliyet.. Derin elektronik bilgim olsa kendim için microdenetleyici kart devre vs ile yapardım ama yardımlarınız için teşekkürler. @okoman
  • milis fonksiyonu ıle gecen her saniyeyi ayrıca sayın ve bır değikende tutun yada sanıyede bir artan bir tımer kurun yada bir rtc modul alın zamanı oradan kontrol edın.
  • ya RTC modülünede güven olmuyor ki geçen datalogger kurdum sd karta veri yazan 3. günde RTC modülü yanmış, her bi yandan geliyorlar arkadaş
  • ben olsam karşılıklı konuşmalı yapardım.
    Örneğin, her webservere data gönderdiğimde alındı diye cevap gönderirdim webserverdan.

    arduino tarafında ise,
    her saat dolduğunda datayı gönderir alındı cevabını beklerdim eğer cevap gelmezse tekrar tekrar gönderirdim.

    Bana kalsa senin problemin şu,
    senin zaman fonksiyonuna göre 1 saat doluyor ve göndermeyi deniyorsun zamanı da sıfırlıyorsun. Yani olurda en ufak bir aksilikte gönderemezsen tekrar öteki saati bekliyorsun. bu yüzdendir ki bazen 1 saatte bazen 3 bazen 5 saatte gidiyor.
  • Haklısın @ekmekci Madem öyle diyosun, kodlamada bana yardım et :)
    Veritabanı yazması için http sorgusu yaptığında Web sayfasının html dökümünü okuyoruz oraya ben "veri yazildi!" koydum. Bu okumayı gerçekleştirmezse yeniden okuma yapma komutunu vericez dimi
  • evet öyle,
    sıralaman şu olsun.
    1) arduinodan servere data gönder.
    2)server tarafında data alınırsa bir indikatör ile alındı mesajı oluştur
    3)arduinodan tekrar git ve data alındı mı diye kontrol et
    4)data alındıysa beklemeye geç ve 1 saat bekle, data alınmadıysa alınana kadar tekrar tekrar gönder

Howdy, Stranger!

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

Login with Facebook

Tagged

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