Skocz do zawartości

Pomocna odpowiedź

Napisano

Witam Mam na imię Mariusz i mam 52 lata. Dopiero zaczynam z ESP32 i mam pewien problem. Tak naprawdę to dopiero zaczynam moją przygodę z programowaniem.

Potrzebuję żeby ESP32 co 5min wyświetlał informacje że minęło 5min i nie bardzo mogę sobie z tym poradzić.

Chciałbym żeby to było proste rozwiązanie. 

Proszę o pomoc. 🙂

  • Lubię! 1

@sq1taw witam na forum 🙂 Jest wiele metod na rozwiązanie tego problemu - możesz wykorzystać funkcję millis() lub bibliotekę Ticker. Powiedz tylko coś więcej o projekcie, gdzie dokładnie ma być wyświetlana ta informacja?

Dnia 2.02.2025 o 14:56, Treker napisał:

@sq1taw witam na forum 🙂 Jest wiele metod na rozwiązanie tego problemu - możesz wykorzystać funkcję millis() lub bibliotekę Ticker. Powiedz tylko coś więcej o projekcie, gdzie dokładnie ma być wyświetlana ta informacja?

Witam kolegę. I dziękuję za reakcje na mój post. Załączyłem plik przykładowy. Program po uruchomieniu wpisuje dane o temperaturze i wilgotności do tabeli na serwerze. Sęk w tym że zapisuje ich 200 na 5 sekund a ja  potrzebuję zapisać najwyżej 4 wpisy na godzinę. Inne funkcje muszą działać dalej a w trakcie co 15 minut wpis danych do tabeli . A że dopiero  uczę się to strasznie się motam z tym. Jeśli mógłbyś choć troszkę mi pomóc będę wdzięczny.

db.rar

@sq1taw

uint32_t last_time;

if (millis() - last_time > 1000UL) {
  // zapisz wartość czy co tam chcesz
  last_time = millis();
  }

To jest taki nie blokujący przykład użycia...liczba "1000UL" oznacza że ten warunek if wykona się co sekundę (czas podajesz poprostu w ms) 

Zmienną "last_time" zapisz sobie na samej górze kodu w obszarze zmiennych globalnych...

Jeśli chcesz wykonywać więcej czynności co określony czas to powiel sobie ten powyższy warunek z tym że każdy ma mieć zmienną uint32_t o innej nazwie...

(edytowany)

Przede wszystkim ciągłe wywoływanie w pętli loop() procedury łączenia się z siecią, bez względu na potrzebę, nie ma sensu. Usunąłem to.

Można to wszystko oczywiście zrobić trochę lepiej, ale specjalnie starałem się aby moje zmiany są możliwie niewielkie, byś się w nich nie pogubił. 

Programu nie kompilowałem, więc może być jakiś niewielki błąd.

#include "esp_sntp.h"
#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>
#define DHTPIN 41
#define DHTTYPE DHT11

#define INTERVAL  1000*60*15   // odczyt i wysłanie danych co 15 minut

DHT dht11(DHTPIN, DHTTYPE);

String URL = "";

const char* ssid = "";
const char* password = "";

float temperature = 0;
float humidity = 0;
int a = 0;
void setup() {
  Serial.begin(115200);
  dht11.begin();
  connectWiFi();
}

void loop()
{
  static unsigned long oldmillis = millis();
  
  if (WiFi.status() != WL_CONNECTED)
  {
    connectWiFi();
  }
  if (millis() - oldmillis > INTERVAL) {
    oldmillis = millis();
    Load_DHT11_Data();
    Send_DHT11_Data();
  }
}

void connectWiFi()
{

  WiFi.mode(WIFI_OFF);
  delay(1000);
  //This line hides the viewing of ESP as wifi hotspot
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
}
 
void Send_DHT11_Data() 
{
  String postData = "temperature=" + String(temperature) + "&humidity=" + String(humidity);
  HTTPClient http;
  http.begin(URL);
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  int httpCode = http.POST(postData);
  String payload = http.getString();
  Serial.print("URL : "); Serial.println(URL);
  Serial.print("Data: "); Serial.println(postData);
  Serial.print("httpCode: "); Serial.println(httpCode);
  Serial.print("payload : "); Serial.println(payload);
  Serial.println("--------------------------------------------------");
  Serial.print("connected to : "); Serial.println(ssid);
  Serial.print("IP address: "); Serial.println(WiFi.localIP());
}

void Load_DHT11_Data()
{
  temperature = dht11.readTemperature(); //Celsius
  humidity = dht11.readHumidity();
  if (isnan(temperature) || isnan(humidity)) {
    Serial.println("Failed to read from DHT sensor!");
    temperature = 0;
    humidity = 0;
  }
  Serial.printf("Temperature: %d °C\n", temperature);
  Serial.printf("Humidity: %d %%\n", humidity);
}

 

Edytowano przez jand

Ja bym użył struktur z biblioteki time.h do tego dwie zmienne jedną do sprawdzenia czy upłynęło te 5 czy tam 15 minut, drugą - flagę czy dane zostały wysłane. Choć lepiej i tak użyć osobnego taska do tych zadań, ale że kolega się w tym jeszcze nie orientuje to chyba metoda pierwsza będzie czytelniejsza

Witam ponownie. Dziękuję za taki duży odzew. Wykorzystałem drugi sposób i sprawdza się znakomicie oczywiście w ramach potrzeb zmodernizuję tę metodę. Wielkie dzięki panowie bo naprawdę pomogliście mi. Chcę zbudować sterownik do pieca CO i robię wstępne próby. Czekam na wyświetlacz i zaczynam pisać program. Pewnie odezwie się jeszcze tutaj bo dopiero się uczę a najlepiej uczyć się od kogoś kto umie lepiej. Jednak nie chcę polegać na kopiuj wklej więc będę starał się sam pisać resztę. Jeszcze raz dzięki wielkie za pomoc i pozdrawiam.

Ps. Co jakiś czas wrzucę tu rozwój projektu.

10 godzin temu, _LM_ napisał:

Ja bym użył struktur z biblioteki time.h do tego dwie zmienne jedną do sprawdzenia czy upłynęło te 5 czy tam 15 minut, drugą - flagę czy dane zostały wysłane. Choć lepiej i tak użyć osobnego taska do tych zadań, ale że kolega się w tym jeszcze nie orientuje to chyba metoda pierwsza będzie czytelniejsza

Witam chciałbym korzystać z bibliotek ale to jeszcze daleka droga i dużo nauki przede mną. Pozdrawiam

6 minut temu, sq1taw napisał:

Witam chciałbym korzystać z bibliotek ale to jeszcze daleka droga i dużo nauki przede mną. Pozdrawiam

To ucz się tego od początku bo praktycznie do wszystkiego masz gotowe biblioteki...np. dla twojego wyświetlacza i czujnika temperatury użyjesz bibliotek i nie będziesz musiał wiedzieć jak to działa od podstaw, bo bez bibliotek trzeba szperać po rejestrach i dokumentacji a tego byś nie chciał na początku 😉

  • 2 tygodnie później...

Witam wszystkich ponownie. Nadal przygotowuje się do sterownika i trafiłem na mały problem.

Posiadam ESP32-S3-WROOM 1 taka z dwoma portami USB-C i kupiłem wyświetlacz TFT LCD 3,5″ ILI9488 320x480px z czytnikiem SD SPI.

Powiedzcie mi czy jest jakieś uniwersalne podłączenie wyświetlacza do tej pory próbowałem różnych konfiguracji znalezionych w internecie ale żaden sposób nie pasuje. Zauwarzyłęm że we wszystkich sposobach jest podłączenie do GPIO23 tak zwany MOSI którego na moim ESP nie ma.

Proszę wyjaśnijcie mi jak  szukać podłączeń, jest tyle sposobów podłączenia więc to nie jest jakieś stałe podłączenie tak jak przy wyświetlaczu LCD 2/16 czy 4/20.

Z góry dziękuję za pomoc. Pozdrawiam

@sq1taw bo pewnie masz inny pinout dla tej płytki niż devkit...wpisz sobie w google model swojej płytki dodając "pinout"...napewno znajdziesz jakąś grafikę, później zostaje instalacja jakiejś biblioteki, na początek adafruit się nada 

(edytowany)

Piny sobie ustawiasz jak chcesz - dokładnie ten sam wyświetlacz podpiąłem do xiao s3 i działa. Jak będę przy kompie to podrzucę kawałek kodu (działa wyświetlacz i czytnik)

@farmaceuta akurat adafruit nie ma drivera do tego wyświetlacza (tzn. Ma ale nie działa)

Edytowano przez ethanak
  • Lubię! 1
1 godzinę temu, ethanak napisał:

 

@farmaceuta akurat adafruit nie ma drivera do tego wyświetlacza (tzn. Ma ale nie działa)

Chciałem odrazu polecić tft_espi no ale autor wątku może mieć problem z konfiguracją odpowiednich plików 

3 godziny temu, farmaceuta napisał:

Chciałem odrazu polecić tft_espi no ale autor wątku może mieć problem z konfiguracją odpowiednich plików 

Próbowałem z biblioteką ILI9488.h tam można deklarować piny

#define TFT_CS         4

#define TFT_DC         21

#define TFT_LED        0

#define TFT_RST        36

Ale wyświetla mi błąd 

d:\Projekty ARDUINO\libraries\ILI9488\ILI9488.cpp:121:20: error: 'clkpinmask' was not declared in this scope
  121 |       *clkport |=  clkpinmask;

Pozdrawiam.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...