Open diffstorm opened 4 years ago
Internal RTC ye okuma ve yazma fonksiyonları yazıldı.Ancak aşağıdaki adımların akışı nasıl olmalı? internal RTC 'ye saat set etme , yazma fonksiyonu kullanılarak mı yapılacak. internal RTC'den saat okuma, okuma fonksiyonu kullanılarak mı yapılacak. Saat ntp'den alındıktan sonra sürekli RTC'deki belli bir lokasyona(adrese) güncel olarak mı yazılacak? @diffstorm
NTP için ayrı bir taskımız var. NTP handler fonksiyonu DeviceConfigde belirlenmiş periyoda göre, bağlantı varsa çağırılacak ve saat aldıktan sonra RTC saat yazma fonksiyonunu kullanarak saati RTC ye set edecek. Yine timezone düzeltmesini NTP de yapmış olacak. RTC de 2 özellik lazım, 1 - saat-tarih yazma okuma 2 - RTC ramine buffer yazma okuma (reset sonrası bazı değişkenlerin silinmesini engellemek için)
RTC.cpp - RTC.h içinde bu işlemler için kullanılacak fonksiyonlar olacak. Bir handler olmayacak eğer ESP nin RTC kısmı için bir handler gereksinimi yoksa.
RTC memory alanına yazma ve okuma fonksiyonları yazıldı. Fakat her yazma ve okuma işlemi için RTC_memory alanında adres belirtmek gerekiyor. Bu da verileri yazarken sabit adres belirtirsek hep üstüne yazmaya sebebiyet veriyor.Adresin fonksiyona parametre olarak verilmesi de pratikten kullanışlı olmayacağı için dosya sistemi gibi kaldığı yerden data ları yaz mantığı burada nasıl kurulabilir. Araştırdım fakat bulamadım. @diffstorm
Bence sen oraya RTCMemory_t isminde bir struct yap ve bu structin icine minimal ihtiyac olan degiskenleri atalim. Yazma okuma islemi de sadece bu structi yazip okusun. Baska adres falan bisey bilmemize gerek yok. Ihtiyac oldukca structin icine eklemeler yapariz. RTCMemory_Read ve Write gibi iki fonksiyon yeterli.
512 byte veri tutan struct yaratılıp ilgili elemanları oluşturuldu.Kodu pushladım.
Saat kısmı kaldı.
Aslında ben böyle paddingler, 512 byte tutma durumu falan dememiştim. Mesela 1 byte tutan struct olsa, sonra eklemeler yapılır. Küçük olsun padding olmasın direkt yaz oku durumu işte.
Gerekli düzeltmeler yapılıp kodu pushladım.Fakat; RTC timer kullanılarak zaman bilgisini set ve get etmeye istinaden; https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_en.pdf kaynağında APPENDIX-A (syf:174) kaynağında verilen kod örneğinde rtc timer kullanımını göstermiş fakat os_timer_setfn(&rtc_test_t,rtc_count,NULL); fonksiyonu derleme sırasında hata veriyor. Dolayısıyla RTC_timer ı harici kullanma ile ilgili bir yol haritası nasıl izlemeliyiz. @diffstorm
Ornek kodun ustundeki include lari eklemeyi denedin mi?
Pdf de sntp bolumu de var ve ntp taski icin direkt kullanilabilir gorunuyor.
Denedim fakat aşağıdaki hatayı alıyorum. Kod derlenmiyor. collect2.exe: error: ld returned 1 exit status *** [.pio\build\nodemcuv2\firmware.elf] Error 1
uint32_t currentTime=0; uint32_t previousTime=0; void setup() { // put your setup code here, to run once: Serial.begin(115200); }
void loop() {
currentTime=millis();
Serial.printf("current Time: %lu\n", currentTime);
delay(1000); //1 saniye uyuyor
//ESP.deepSleep(1000); //1 saniye uyuyor
}
Kod test edildi fakat ESPuyandığında timer kaldığı yerden saymayıp kendini sıfırlıyor.
Bu yüzden aşağıdaki adımlar yapılması uygun olacaktır:
-NTP'den saat bilgisi çekilir(Saatte bir veya parametrik belirlenir)
-Saat bilgisi RTC memory'deki belirli bir adrese sürekli yazılır.
-ESP.deepSleep(time) belirlenen süre kadar uyuyup uyandığında RTC_memory'deki saat bilgisi çekilir
-Çekilen bu saat bilgisine ESP nin uykuda kaldığı süre eklenir
-Yeni saat bilgisi set edilir.
-Saat bilgisi RTC memory'deki belirli bir adrese sürekli yazılır.
Yukarıdaki logic olacak şekilde fonksiyon yazılacaktır.
Saat arttırıp, sleepten önce rtc memory e kaydeden kısmı da sen yaz, NTP sadece RTC nin bir fonksiyonunu çağırıp saati güncellesin yeterli.
RTC memory alanına ntp den çekilen güncel saati deepSleep fonksiyonundan önce deepSleep zamanı kadar arttırp saati güncelleyen fonksiyon yazılıp rtc branchine pushlandı. . Fakat şu senaryoya göre sistem nasıl çalışacak: -Güncel saat çekildi. -İnternet bağlantısı 3 saat koptu -DeepSleep zamanı 100ms kadar sürekli ekleyip güncelliyoruz RTC'yi. Fakat aslında gerçek anlamda doğru bir saat elde etmiş olmuyoruz. Kodun çalışması örneğin 400 saniye sürdü. Biz yine deepSleep kadar ekleyip saati RTC'ye yazmış oluyoruz. Yukarıdaki sorunlar için gerçek bir RTC modül kullanmadan çözüm bulmak mümkün müdür @diffstorm ?
Problem yok bence. Internetten gunde 1 defa bile saat cekebildiyse o arttirmalarla buyuk sapma olusmamasi lazim. Mesela 1 dakika sapma bu urunde problem olmaz. Onun disinda, defs.h icinde dusuk guc modu icin bir define var. Dusuk guc modu normalde kapali olacak, o sonra gelistirecegimiz bir ozellik, o yuzden simdilik kabaca bir cozum bile yeterli olur. UTC yi milisaniye cinsinden tutmak ve arttirmak lazim bence. O da SysTick icindeki diff ile yapilabilir.
RTC memory time bilgisini kaydetmek için şu yöntem düşünülerek yazıldı: -UTC time ın milisaniye kısmını tutan ayrı bir memory alanı ayrıldı. -1 ms de bir burada tutulan değişken arttırılıp tekrar RTC'ye yazılıyor -Buradaki değer 1000'e ulaştığında UTC time 'ın yazıldığı kısımdaki saniye bölümüne ekleniyor. -Bu sayede UTC time ESP 100 ms de bir uyusa bile saatini güncelleyebilecek.
RTC.cpp ye deneyip çalıştığını gördüğüm kodu yoruma alıp yazdım. Fakat yazılım mimarisi açısından bu fonksiyonları tam olarak nasıl yerleştirip projenin tamamına yayacağım ve tasarlayacağım konusunda müsait olduğunda yardımcı olabilir misin Eray abi @diffstorm
ESP8266 üzerinde RTC API kısmı kullanılarak tarih-saat set etme, okuma ve RTC raminde bilgi saklamak için fonksiyonlar yazılması.
Handler şeklinde değil, sadece fonksiyon şeklinde kullanılmak üzere.