esp 8266, dotmatrix,wunderground güncelleme sorunu yardım.
  • Merhaba ekteki kodlarla yapılan dotmatrix uygulamasında wunderground bilgileri ilk açılışta güncelleniyor bir daha güncellenmiyor.Tekrar güncellenmesi için enerjiyi kesip vermem gerekiyor.Yazılımda nasıl bir değişiklik yaparsam otomatik olarak belirli aralıklarla güncelleme yaptırabilirim.




    #include < SPI.h>



    #include < TimeClient.h>
    //#include < Arduino.h>
    #include < WundergroundClient.h>


    /*
    * Arduino Geliştirme Platformu
    * Facebook: https://www.facebook.com/groups/Arduino.Pic
    * Youtube : https://www.youtube.com/ArduinoPicGelistirmePlatformu
    * Web Site: http://arduproje.blogspot.com.tr
    * ESP8266 4x8 Dot matrix Display
    * Yasin EKEN
    * 03/06/2017
    */
    #include < SPI.h>
    #include < ESP8266WiFi.h>
    #include < Wire.h>

    #include "WundergroundClient.h"
    #include "TimeClient.h"
    const float UTC_OFFSET = 2;
    const boolean IS_METRIC = true;
    const String WUNDERGRROUND_API_KEY = "*********"; // Buraya WUNDERGRROUND Api Key'inızı Yazınız Yoksa Çalışmaz
    const String WUNDERGRROUND_LANGUAGE = "TR";
    const String WUNDERGROUND_COUNTRY = "TR";
    const String WUNDERGROUND_CITY = "Abdalkuyusu"; // Buraya Bulunduğunuz İli İlk Harf Büyük Olacak Şekilde Türkçe Karakter Kullanmadan Yazınız
    TimeClient timeClient(UTC_OFFSET);
    WundergroundClient wunderground(IS_METRIC);
    /*
    * NODEMCU PIN SPI
    * CLK D5
    * DIN D7
    * CS D8
    */
    #define CS 15
    #define MAXS 4
    const char ssid[] = "****";
    const char pass[] = "**********";
    unsigned short maxX = MAXS * 8 - 1;
    unsigned short LED[MAXS][8];
    unsigned short LMAX[MAXS * 8];
    unsigned short HMAX[MAXS * 8];
    unsigned short stringtoshort ( String s );
    void stringToDisplay ( String s , int x, int y, int t);
    void max7219_init(void);
    void max7219_set_br(unsigned short br);
    void led_init(void);
    void clear_Display(void);
    void refresh_display(void);
    void char2Arr(unsigned short ch, int PosX, short PosY);
    //**************************************************************************************************
    void connect_to_WiFi() {
    WiFi.begin(ssid, pass);
    while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    for (byte i = 0; i < 133; i++) {
    delay(10);
    stringToDisplay ("Connect to " + String(ssid) , i, 0, 800);
    }
    }
    }
    void setup() {
    pinMode(CS, OUTPUT);
    digitalWrite(CS, HIGH);
    Serial.begin(115200);
    Serial.println();
    SPI.begin();
    led_init();
    max7219_init();
    max7219_set_br(10); // 0 to 15 Ekran Parlaklığı
    clear_Display();
    connect_to_WiFi();
    wunderground.updateConditions(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);
    wunderground.updateForecast(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);
    timeClient.updateTime();
    Serial.print("wunderground.getDate()= "); Serial.println(wunderground.getDate());
    IPAddress IP = WiFi.localIP();
    for (byte i = 0; i < 218; i++) {
    delay(10);
    stringToDisplay ("IP address: " + String(IP[0]) + "." + String(IP[1]) + "." + String(IP[2]) + "." + String(IP[3]) , i, 0, 800);
    }
    }
    //**************************************************************************************************
    int x = 0;
    int y = 0;
    byte oldh1;
    byte oldh2;
    byte oldm1;
    byte oldm2;
    byte h1, h2, m1, m2 = 0;
    void loop() {
    while (true) {
    delay(1);
    String text = "SICAKLIK:" + wunderground.getCurrentTemp() +
    " HISSEDILEN:" + wunderground.getFeelsLike() +
    " NEM:" + wunderground.getHumidity() +
    " BASINC:" + wunderground.getPressure() +
    " RUZGAR:" + wunderground.getWindSpeed() +
    " UV: " + wunderground.getUV() +
    // " GUNDOGUMU: " +wunderground.getSunriseTime() +
    //" GUNBATİMİ: " +wunderground.getSunsetTime() +

    " DURUM: " + wunderground.getWeatherText() +
    " TARIH: " + wunderground.getDate() +
    " " + wunderground.getForecastTitle(0);

    byte h = timeClient.getFormattedTime().substring(0, 2).toInt() + 1;
    byte m = timeClient.getFormattedTime().substring(3, 5).toInt();
    byte s = timeClient.getFormattedTime().substring(6, 8).toInt();
    if ( h > 23 ) h = 0;

    stringToDisplay (text , x, 0, 400);

    char2Arr (stringtoshort(String(h / 10)), 29 + x, h1);
    char2Arr (stringtoshort(String(h % 10)), 23 + x, 0);
    if (timeClient.getFormattedTime().substring(6, 8).toInt() % 2 == 0 )
    char2Arr (stringtoshort(timeClient.getFormattedTime().substring(2, 3)), 16 + x, 0);
    else
    char2Arr (stringtoshort(" "), 16 + x, 0);
    char2Arr (stringtoshort(String(m / 10)), 12 + x, 0);
    char2Arr (stringtoshort(String(m % 10)), 6 + x, 0);

    refresh_display();
    if ( s > 0 && s < 5 || x < 0 || x > 0 ) {
    x++;
    }
    if (x > ((int)text.length() * 6) + 40) x = -30;



    }
    }
  • şu satırları da loop un ilk satırları olarak kullanmak faydalı olabilir

    connect_to_WiFi();
    wunderground.updateConditions(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);
    wunderground.updateForecast(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);
    timeClient.updateTime();

    bilgiyi aldıktan sonra bağlantıyı sıte kapatıyor olabılır tekrar kurmak ıcıb bunlar işe yarar
  • Öncelikle teşekkürler. Loopun içinde denedim olmadı sürekli wifi ye bağlanmaya çalışıyor.connect_to_WiFi den önce 10 sn delay ekledim hata verdi.
  • Connect wifi kaldir update ve sonrasi kalsin 10sn de bir update calissin
  • void loop() {
    delay(2000);

    wunderground.updateConditions(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);
    wunderground.updateForecast(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);
    timeClient.updateTime();


    Bu kodları kullandım.Maalesef olmadı döngü içinde otomatik güncellemiyor.Ağa tekrar bağlandığında(devre enerjisini kesip verdiğimde) güncelleme yapıyor.Acaba 10 dk bir esp nin ağa tekrar bağlanmasını sağlayabilirmiyiz.
  • Merhaba kodlarla uğraştım fakat bir türlü güncelleme işlemini yaptıramadım.Bende esp ye restart yapma yoluna gittim fakat onuda beceremiyorum.Yabancı forumlarda bayağı bir araştırdım (millis) denedim çalışmıyor.100 sn yapınca çalışmıyor.10 sn yapınca Esp.restart(); komutu çalışıyor.Başka yol gösterecek varmı yardımlarınızı bekliyorum.

    ilk denediğim:
    unsigned long eskiZaman=0;
    unsigned long yeniZaman;
    yeniZaman = millis();
    if(yeniZaman-eskiZaman > 100000){
    Esp.restart();
    eskiZaman = yeniZaman;

    }


    ikinci denediğim:

    unsigned long interval = 100000;
    if(millis() >= interval) {

    ESP.restart();

    }
  • Bence restart atarak güncelleme işlemini yapmak pek mantıklı değil , sonuç itibariyle o api güncel veriyi göndermekte , yazılımsal olarak bir probleminiz var gibi , daha öncesinde güncel veri çekebiliyordum ben. Zaten kodunuza göre saati çekiyorsa , o veriyi de çekmesi gerekiyor.
  • Bende restart atmasını istemem ama yazılımsal problemi bulamıyorum.
  • millis timer0 kullanıyor 8 bitlik bir timer yani , bakın bakalım 100 saniye ulaşabiliyor mu yoksa kendini mi resetliyor? Dilerseniz şuradan referans alıp 100 saniye için gerekli işlemi yapabilirsiniz.
  • Teşekkür ederim fakat bunlar beni aşıyor mazur görün daha acemiyim bu işlerde.
  • #include Ticker.h
    const int UPDATE_INTERVAL_SECS = 10 * 60; // Update every 10 minutes
    / flag changed in the ticker function every 10 minutes
    bool readyForWeatherUpdate = false;

    String lastUpdate = "--";



    Ticker ticker;

    void setReadyForWeatherUpdate();
    ticker.attach(UPDATE_INTERVAL_SECS, setReadyForWeatherUpdate);

    ilgili kütüphanenin olduğu sitede böyle birşey yapılmış ama ben çalıştıramadım.

    https://github.com/squix78/esp8266-weather-station/blob/master/examples/WeatherStationDemo/WeatherStationDemo.ino

  • incelemediğim için bilgim yok kütüphane hakkında.
  • #include Ticker.h
    void restart() {
    ESP.restart();
    }
    const int UPDATE_INTERVAL_SECS = 10 * 60; // 10 dk bir restart
    Ticker ticker;


    void setup() {
    ticker.attach(UPDATE_INTERVAL_SECS, restart);

    Maalesef kendi kütüphanesi ile güncelleme yapmıyor.Bende ticker.h kütüphanesi ile esp ye 10 dk bir restart yapmayı başardım.ticker verilen süre içerisinde bir fonksiyonu çağırabiliyormuş.Temel Ticker kullanımı

    Ticker, belli bir periyotla verilen bir fonksiyonu çağıracak bir nesnedir.
    Her Ticker bir işlev çağırır. İstediğiniz kadar çok Ticker alabilirsiniz,
    Bellek sadece sınırlamadır.

    Bir işlev bir işaretleyiciye eklenebilir ve işaretleyiciden ayrılabilir.
    Attach işlevinin iki değişik türü vardır: attach ve attach_ms.
    İlki saniyeler içinde, ikincisi milisaniye cinsinden sürer.Umarım yararlı olur.
  • ben olsam bu projeyı anlayarak yenıden yapardım bir sistemin yeniden resetlenerek bir iş yaptırılması tamamı ıle başarısızlıktır. problemı kalıcı olarak çözmeyı veya anlamayı deneyın.
  • Haklisiniz.Bu gecici bir çözüm.Bu işlerde acemi biri olarak bana göre bir başarı sayılır. gerçek çözümü buldugumda burada paylaşacağım.Teşekkürler.

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.