Sari la conținut
ELFORUM - Forumul electronistilor

Wemos D1 - ceas, termometru - temperaturi negative ??


fratello

Postări Recomandate

  • Răspunsuri 73
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

@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

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
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

@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
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 de Vizitator
Link spre comentariu

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

Ș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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări