Liviu M Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 Pana la urma ce și pe ce rand afișezi? Că în poza din primul post zilele sunt pe primul rând. Nu c-ar mai conta (merge cu strlen), da' m-ar ajuta să înțeleg de ce nu merge. Link spre comentariu
mihaicozac Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 Aşa e când lucrezi cu pointeri, rişti să ajungi prin zone de memorie aiurea. Eu aş modifica funcţia aia să returneze string în loc de pointer. Link spre comentariu
fratello Postat Martie 27, 2021 Autor Partajează Postat Martie 27, 2021 Scuze, cred ca nu am actualizat toate informatiile. Atasez o poza cu afisarea curenta. Link spre comentariu
mihaicozac Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 Acum 39 minute, Liviu M a spus: Pana la urma ce și pe ce rand afișezi? Că în poza din primul post zilele sunt pe primul rând. Nu c-ar mai conta (merge cu strlen), da' m-ar ajuta să înțeleg de ce nu merge. 1 reprezintă a doua linie, 0 e primul rând. Link spre comentariu
Vizitator Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 34 minutes ago, mihaicozac said: Eu aş modifica funcţia aia să returneze string în loc de pointer. In limbajul C, o functie nu poate returna un string. Link spre comentariu
mihaicozac Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 Mă rog, atunci o variabilă globală de tip string care să ia valorile respective, fără return. Cum a făcut cu variabila position. Sau creată o arie de 7 stringuri şi referire la poziţia din arie. Link spre comentariu
Liviu M Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 @Liviu.Mihaiu- pe de o parte mediul Arduino lucreaza cu (avr-gc)c++ si stie de stringuri, pe de alta (ca sa nu ramana doar informatia partiala de pe pagina anterioara) in topicul asta e vorba de ESP8266 la care pointerii sunt mai lungi de 2. @mihaicozac- in primul post e o poza cu alta aranjare a datelor pe afisor si nu se mai pupa ce stiam eu deja despre proiect cu ce se discuta de o pagina incoace. @fratello- daca postezi ultimul cod poate il imbunatatim. Oricum in functia getTimeReducedTraffic() ai o mica scapare - lcd.clear() n-are nici un efect, fiind dupa return(). bool getTimeReducedTraffic(int ms) { { uint32_t start = millis(); do { time(&now); localtime_r(&now, &timeinfo); delay(10); } while (((millis() - start) <= (1000000 * ms)) && (timeinfo.tm_year < (2016 - 1900))); if (timeinfo.tm_year <= (2016 - 1900)) return false; // the NTP call was not successful Serial.print("Time Now: "); Serial.println(now); StrTempC = readDSTemperatureC(); Serial.print(StrTempC); } return true; lcd.clear(); } Link spre comentariu
fratello Postat Martie 27, 2021 Autor Partajează Postat Martie 27, 2021 Va multumesc tuturor pentru implicare ! Accept cu recunostinta orice idee/propunere de imbunatatire a codului (care, repet, nu imi apartine : eu doar am "imbinat" diverse portiuni de cod de pe net). Codul utlizat acum : // by ND - 2021 - ELFORUM #ifdef ESP8266 #include <ESP8266WiFi.h> #else #include <WiFi.h> #endif #include <Arduino.h> #define ONE_WIRE_BUS 0 #include <OneWire.h> #include <DallasTemperature.h> #include <time.h> #include <LiquidCrystal_I2C.h> #include <stdio.h> #include <ostream> LiquidCrystal_I2C lcd(0x27, 16, 2); // Configure LiquidCrystal_I2C library with 0x27 address, 16 columns and 2 rows byte customChar[] = { 0x08, 0x14, 0x08, 0x07, 0x08, 0x08, 0x07, 0x00 }; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); const char* ssid = "xxx"; const char* password = "yyy"; const char* NTP_SERVER = "ch.pool.ntp.org"; const char* TZ_INFO = "EET-2EEST-3,M3.5.0/03:00:00,M10.5.0/04:00:00"; tm timeinfo; time_t now; long unsigned lastNTPtime; unsigned long lastEntryTime; String StrTempC; String ziua = ""; String readDSTemperatureC() { sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0); float fTempAfis = tempC; String sTempToStr = ""; if(tempC == -127.00) { Serial.println("Failed to read from DS18B20 sensor"); return "--"; } else { Serial.print("Temperature Celsius: "); Serial.println(tempC,1); } if(tempC < 0.0){ sTempToStr = "-"; fTempAfis *= -1; } else { sTempToStr = " "; } if (fTempAfis < 9.9) { //sTempToStr += "0"; sTempToStr += " "; } return (sTempToStr + String(fTempAfis,1)); } void setup() { sensors.begin(); Serial.begin(115200); lcd.begin(4, 5); // Initialize I2C LCD module (SDA = D2, SCL = D1) WiFi.begin(ssid, password); Serial.print("Connecting to network"); int counter = 0; while (WiFi.status() != WL_CONNECTED) { delay(200); if (++counter > 100) ESP.restart(); Serial.print( "." ); } Serial.println("\nWiFi connected\n\n"); configTime(0, 0, NTP_SERVER); setenv("TZ", TZ_INFO, 1); if (getTimeReducedTraffic(43200000)) { // wait up to 10sec to sync } else { Serial.println("Time not set"); ESP.restart(); } showTime(&timeinfo); lastNTPtime = time(&now); lastEntryTime = millis(); lcd.createChar(0, customChar); lcd.home(); lcd.write(0); } void loop() { getTimeReducedTraffic(43200000); showTime(&timeinfo); delay(1000); } bool getTimeReducedTraffic(int ms) { { uint32_t start = millis(); do { time(&now); localtime_r(&now, &timeinfo); delay(10); } while (((millis() - start) <= (1000000 * ms)) && (timeinfo.tm_year < (2016 - 1900))); if (timeinfo.tm_year <= (2016 - 1900)) return false; // the NTP call was not successful Serial.print("Time Now: "); Serial.println(now); StrTempC = readDSTemperatureC(); Serial.print(StrTempC); } return true; lcd.clear(); } void showTime(tm *localTime) { //print to serial terminal if you want ; remove // from bellow //Serial.print(localTime->tm_mday); //Serial.print('/'); //Serial.print(localTime->tm_mon + 1); //Serial.print('/'); //Serial.print(localTime->tm_year - 100); //Serial.print('-'); //Serial.print(localTime->tm_hour); //Serial.print(':'); //Serial.print(localTime->tm_min); //Serial.print(':'); //Serial.print(localTime->tm_sec); //Serial.print(" Day of Week "); //Serial.println(localTime->tm_wday); //Serial.println(); //display on LCD char time_output[40]; lcd.setCursor(0, 0); sprintf(time_output, "%02d:%02d:%02d", localTime->tm_hour, localTime->tm_min, localTime->tm_sec); lcd.print(time_output); lcd.setCursor(0,1); sprintf(time_output, "%02d/%02d", localTime->tm_mday, localTime->tm_mon + 1); // sprintf(time_output, "%02d/%02d/%02d", localTime->tm_mday, localTime->tm_mon + 1, localTime->tm_year-100); // sprintf(time_output, "%02d/%02d/%02d", localTime->tm_mday, localTime->tm_mon + 1, localTime->tm_year+1900); lcd.print(time_output); //lcd.setCursor(7, 1); // lcd.setCursor(8+(8-strlen(getDOW(localTime->tm_wday))),1); //Serial.print(sizeof(getDOW(localTime->tm_wday))); lcd.print(getDOW(localTime->tm_wday)); lcd.setCursor(10, 0); lcd.print(StrTempC); lcd.setCursor(15, 0); lcd.write(0); } char * getDOW(uint8_t tm_wday) { switch(tm_wday) { case 1: return "Luni"; break; case 2: return "Marti"; break; case 3: return "Miercuri"; break; case 4: return "Joi "; break; case 5: return "Vineri"; break; case 6: return "Sambata"; break; case 0: return "Duminica"; break; default: return "Error"; break; } } Link spre comentariu
Vizitator Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 1 hour ago, Liviu M said: in topicul asta e vorba de ESP8266 la care pointerii sunt mai lungi de 2. Ok. posibil ca ESP8266 sa aiba un spatiu de adresare mai mare. Nu am lucrat cu asa ceva. Dar sizeof(pointer) returneza o constanta. Asta era ideea. Link spre comentariu
Vizitator Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 @fratello Ca idee, poate functia getDOW arata mai frumos asa: char * getDOW(uint8_t tm_wday) { char * dayname[] = {"Duminica", "Luni", "Marti", "Miercuri", "Joi", "Vineri", "Sambata"}; return dayname[tm_wday]; } Eventual cu test si return "Error" daca tw_day > 6. Dar nu cred ca este cazul. Link spre comentariu
Vizitator Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 (editat) 1 hour ago, Liviu M said: pe de o parte mediul Arduino lucreaza cu (avr-gc)c++ si stie de stringuri Evident ca stie de stringuri (de fapt array de caractere). Dar transferul de parametrii catre o functie si returnarea rezultatului se face prin stack. Cum s-ar putea returna un string de 1 k (sa zicem) prin stiva ? Se poate, dar nu se face asa ceva. Se returneaza un pointer, adresa stringului existent undeva in memorie. Editat Martie 27, 2021 de Vizitator Link spre comentariu
Liviu M Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 OK, incep sa inteleg ce zici, da' formularea initiala a fost cel putin nefericita. Link spre comentariu
cimitavita Postat Martie 27, 2021 Partajează Postat Martie 27, 2021 Nu umblu in C ci doar in asm. Și ca să simplific chestia cu alinierea, atunci când vreau să aliniez la stânga scriu "miercuri-","joi-----","vineri--", iar dacă vreau să aliniez la dreapta scriu "-miercuri","-----joi","--vineri". Am pus "-" în loc de spațiu ca să se vadă mai bine. În felul ăsta, afișarea denumirii zilei începe întotdeauna din același loc iar spațiile introduse șterg literele zilei precedente dacă denumirea care trebuie afișată e mai scurtă. Dacă aș face ca programul să completeze automat cu spații pentru aliniere, partea de program care ar face asta ocupă mai multe locații în flash decât acele câteva spații adăugate în plus la denumirile zilelor. Mai pe scurt, trebuie să faci în așa fel încât toate denumirile zilelor să aibă aceeași lungime. La fel e și cu denumirile lunilor, atunci când trebuie afișate. Link spre comentariu
fratello Postat Martie 28, 2021 Autor Partajează Postat Martie 28, 2021 Multumesc si pentru aceasta sugestie ! Azi afiseaza corect cu codul de mai sus. Daca si maine este bine, inseamna ca avem un castigator . Duminica frumoasa ! Link spre comentariu
XAN77 Postat Martie 28, 2021 Partajează Postat Martie 28, 2021 Și eu aș folosi la următorul ceas NTP server, e interesant. De fapt ESP-urile sunt interesante. Fratello încearcă să modifici codul ca să-i adaugi posibilitatea de rescriere a codului din browser, deci fără să mai fie necesar accesul fizic la modulul esp. E foarte util mai ales la început când faci programări dese și nu numai, este mai elegant. Eu m-am inspirat de aici https://randomnerdtutorials.com/esp8266-nodemcu-ota-over-the-air-arduino/ Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum