Alimentation station météo

Bonjour à tous,

Je suis sur un projet de balise météo qui récupère les valeurs en ligne de balises PIOUPIOU, utilisées pour le Vol libre et les retransmets en VHF sur la fréquence FFVL 143.9875Mz. Live - Pioupiou for Devs
Ce projet utilise :

Le fonctionnement prévu est le suivant :

  • l'émetteur récupère les données toutes les 10 mn sur l'API Pioupiou et transmet un court message (6 secondes) en VHF
  • puis mise en veille de l'ESP32 et coupure de l'alimentation de l'émetteur SA828 pour 10 mn
  • le cycle recommence.

De plus, coupure de tout le système pendant la nuit. Reprise au matin lorsque le panneau solaire recommence à produire de l'énergie.

Les questions que je me pose tiennent à l'alimentation de ce montage.

  • comment couper complètement l'alimentation pendant la nuit et réalimenter dés que le panneau solaire commence à produire du courant ?
  • comment couper seulement l'alimentation du SA828 en dehors des temps d'émission(10 mn) ?

J'imagine qu'il va falloir un mélange d'électronique et d'informatique pour ce faire et je sollicite donc votre aide pour me guider.

Merci.

PS : a votre disposition si vous souhaitez plus de renseignements

1 Like

Le SA828 consomme 100µA en standby.
Cette consommation est-elle vraiment handicapante ?
L'ESP32 possède un mode veille profonde, donc il est inutile de couper son alimentation. Mais encore faut-il choisir la bonne carte. Certaines cartes consomment plusieurs mA, d'autres comme la FireBeetle seulement 10µA.

Je dirais qu'à partir du moment où une batterie rechargée par un panneau solaire est présente, aucune coupure d'alimentation n'est requise.
Mais pour en dire plus, il vaudrait mieux savoir de quel ESP32 il s'agit.

Là est tout le problème.

1 Like

Bonjour Henri, bonjour à tous,

J'ai plusieurs ESP32 Wroom achetées sur Aliexpress dont je n'ai pas les caractéristiques techniques. Il faudra que je mesure la consommation en mode veille. Sinon je prendrai une FireBeetle.
La fiche technique du SA828 donne une consommation inférieure ou égale à 3 micro A en mode veille. c'est vrai que c'est peu!

Je vais donc suivre tes conseils.

Pour le réveil du matin de la balise, dès que le panneau solaire fournit une certaine tension, existe t'il un moyen pour sortir l'ESP32 du mode veille ?

Merci.

1 Like

Bonjour à tous,

Je reprends ce topic sur lequel j'ai pu avancer mais où je bloque toujours sur la mise en veille le soir et le réveil le matin.
Je suis passé pour le moment au Wemos D1 Pro mini à la place de l'ESP32.

Pour l'émission en journée, le wemos D1 Pro mini ( se réveille toutes les 15 mn, se connecte au serveur Pioupiou via l'API, récupère les données, lance l'émission en VHF, passe le SA828 en "sleeping mode" en mettant à LOW sa broche 23(CS) et passe en deep sleep pour 15 mn.
Première question : En mode Deep sleep de l'ESP, est ce que la pin 7 qui est mise à LOW va conserver cette valeur jusqu'au réveil?

Deuxième question : Pour passer en mode deep sleep "nuit", j'aimerais le faire en mesurant la tension du panneau solaire par l'entrée analogique A0. Si elle est à 0 alors on passe en deep sleep. Mais comment faire pour réveiller l'ESP lorsque le panneau recommence à produire une tension alors que l'ESP est "endormie"?

Troisième question : Existe t'il une autre façon de procéder ?

Merci pour votre aide.

Mon code actuel :

/*
  Rui Santos
  Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/
//ref : http://tilman.de/projekte/wifi-doorbell/
//Pour ESP8266

//Par rapport à pioupiou_test1 : utilise ArduinoJson et son assistant;
//permet de recuperer les Floats pour les directions et vitesses du vent pour arrondir les valeurs

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include "SoftwareSerial.h"
#include <ArduinoJson.h>

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

//**********DFPLAYER***********

SoftwareSerial mySoftwareSerial(D3, D2); // DFPLAYER TX, RX
#include "DFRobotDFPlayerMini.h"
#define FOLDER_title          1
#define FOLDER_directions     2
#define FOLDER_speed          3
#define FOLDER_text           4

static unsigned long timer = millis();
int dir;
const int PTT = D5;
const int PIN_CS_SA828 = D7;

float data_measurements_wind_heading;
float data_measurements_wind_speed_avg;
float data_measurements_wind_speed_max;

int windSpeedAvg;
int readIndex;
int windSpeedMax;
int windHeading;
char *sectors[ ] = {"N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW", "N"};
String compassDir = "";
int number = 0;
const byte degres[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

DFRobotDFPlayerMini dfPlayer;
void printDetail(uint8_t type, int value);

//*************************************************

// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 10 seconds (10000)
unsigned long timerDelay = 10000;

String json;
DynamicJsonDocument doc(1024);

void setup() {
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);

  pinMode(PIN_CS_SA828, OUTPUT);
  pinMode(PTT, OUTPUT);
  Serial.println("");
  Serial.println("Sketch : balisePoupiou_Andran_D1ProMini.ino");

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");

  //************DFPLAYER*************************

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!dfPlayer.begin(mySoftwareSerial)) {
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));

  dfPlayer.setTimeOut(500);
  dfPlayer.EQ(DFPLAYER_EQ_NORMAL);
  dfPlayer.outputDevice(DFPLAYER_DEVICE_SD);

  //  dfPlayer.volume(8);  //Set volume value. From 0 to 30
  //********************************************************

  // Send an HTTP GET request

  // Check WiFi connection status
  if (WiFi.status() == WL_CONNECTED) {
    //WiFiClient client;
    //HTTPClient http;
    //String serverPath = "http://api.pioupiou.fr/v1/live/596";//Digne
    //String serverPath = "http://api.pioupiou.fr/v1/live/594";//Le TRAINON
    //String serverPath = "http://api.pioupiou.fr/v1/live/595";//Aiguines
    String serverPath = "http://api.pioupiou.fr/v1/live/87";//Saint-Andre_Sud

    json = httpGETRequest(serverPath.c_str());
    Serial.println(json);
    // Deserialize the JSON document
    DeserializationError error = deserializeJson(doc, json);

    // Test if parsing succeeds.
    if (error) {
      Serial.print(F("deserializeJson() failed: "));
      Serial.println(error.f_str());
      return;
    }
    JsonObject data = doc["data"];
    int data_id = data["id"];
    const char* data_meta_name = data["meta"]["name"];
    JsonObject data_measurements = data["measurements"];
    data_measurements_wind_heading = data_measurements["wind_heading"];
    data_measurements_wind_speed_avg = data_measurements["wind_speed_avg"];
    data_measurements_wind_speed_max = data_measurements["wind_speed_max"];

    Serial.print("JSON object = "); Serial.println(data);
    Serial.print("Balise : "); Serial.println(data_id);
    Serial.print("BaliseName : "); Serial.println(data_meta_name);

    Serial.print("WindHeading : "); Serial.println(data_measurements_wind_heading);
    Serial.print("Direction : "); Serial.println(compassDir);
    Serial.print("WindSpeedAvg : "); Serial.println(data_measurements_wind_speed_avg);
    Serial.print("WindSpeedMax : "); Serial.println(data_measurements_wind_speed_max);

    windSpeedAvg = round (data_measurements_wind_speed_avg);
    windSpeedMax = round (data_measurements_wind_speed_max);
    windHeading = round(data_measurements_wind_heading);
    Serial.print("windSpeedAvg : "); Serial.println(windSpeedAvg);
    Serial.print("windSpeedMax : "); Serial.println(windSpeedMax);
    getHeading(windHeading);

    digitalWrite(PIN_CS_SA828, HIGH);
    Serial.println("PIN_CS_SA828 HIGHT");
    digitalWrite(PTT, HIGH);
    Serial.println("PPT HIGHT");
    dfPlayer.volume(25);
    delay(1000);

    voice();
    delay(1000);

    digitalWrite(PTT, LOW);
    digitalWrite(PIN_CS_SA828, LOW);
  }
  else {
    Serial.println("WiFi Disconnected");
  }

  delay(1000);
  ESP.deepSleep(900e6);
}

void loop() {

}


String httpGETRequest(const char* serverName) {

  WiFiClient client;
  HTTPClient http;

  // Your IP address with path or Domain name with URL path
  http.begin(client, serverName);

  // Send HTTP POST request
  int httpResponseCode = http.GET();

  String payload = "{}";

  if (httpResponseCode > 0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  // Free resources
  http.end();

  return payload;
}
void voice() {
  Serial.println();
  switch (number) {
    case 0:
      Serial.println(F("NORD"));
      dir = 16;
      break;
    case 1:
      Serial.println(F("NORD-NORD-EST"));
      dir = 1;
      break;
    case 2:
      Serial.println(F("NORD-EST"));
      dir = 2;
      break;
    case 3:
      Serial.println(F("EST-NORD-EST"));
      dir = 3;
      break;
    case 4:
      Serial.println(F("EST"));
      dir = 4;
      break;
    case 5:
      Serial.println(F("EST-SUD-EST"));
      dir = 5;
      break;
    case 6:
      Serial.println(F("SUD-EST"));
      dir = 6;
      break;
    case 7:
      Serial.println(F("SUD-SUD-EST"));
      dir = 7;
      break;
    case 8:
      Serial.println(F("SUD"));
      dir = 8;
      break;
    case 9:
      Serial.println(F("SUD-SUD-OUEST"));
      dir = 9;
      break;
    case 10:
      Serial.println(F("SUD-OUEST"));
      dir = 10;
      break;
    case 11:
      Serial.println(F("OUEST-SUD-OUEST"));
      dir = 11;
      break;
    case 12:
      Serial.println(F("OUEST"));
      dir = 12;
      break;
    case 13:
      Serial.println(F("OUEST-NORD-OUEST"));
      dir = 13;
      break;
    case 14:
      Serial.println(F("NORD-OUEST"));
      dir = 14;
      break;
    case 15:
      Serial.println(F("NORD-NORD-OUEST"));
      dir = 15;
      break;
    case 16:
      Serial.println(F("NORD"));
      dir = 16;
      break;
    default:
      break;
  };
  delay(1000);
  dfPlayer.playFolder(FOLDER_title, 3);//St Andre
  delay(1500);
  dfPlayer.playFolder(FOLDER_directions, dir);
  delay(1500);
  dfPlayer.playFolder(FOLDER_speed, windSpeedAvg);
  delay(1000);
  dfPlayer.playFolder(FOLDER_text, 1);
  delay(1000);
  dfPlayer.playFolder(FOLDER_speed, windSpeedMax);
  delay(1000);
  dfPlayer.playFolder(FOLDER_text, 2);

  if (dfPlayer.available()) {
    printDetail(dfPlayer.readType(), dfPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}
void getHeading(int direction) {
  int index = windHeading % 360;//modulo
  index = round(index / 22.5);
  number = (degres[index]);
  Serial.print("Number : "); Serial.println(number);
  compassDir = (sectors[index]);
}
void printDetail(uint8_t type, int value) {
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}
1 Like

Au réveil, à mon avis, tout retombe à ZÉRO, mais comme c'est ce que tu cherches ...

Un ESP32 qui sort du mode deep-sleep ne se comporte pas comme un ARDUINO ou un STM32. Il redémarre, donc ses GPIOs retombent.

Sauf à utiliser un comparateur hardware qui réveillerait l'ESP32 au dessus d'une certaine valeur de tension, no way.
Mais réveiller l'ESP périodiquement et mesurer la tension est une opération peu consommatrice. 900 secondes (15 minutes) est une valeur qui ne devrait pas engendrer une surconsommation excessive.

1 Like

Ok merci, je vais voir en ce sens.

1 Like

Bonjour à tous,

Je reprends ce fil car je n'arrive pas à alimenter correctement ce montage en 5v avec un panneau solaire et 2 18650 en parallèle.

Je précise qu'en l'alimentant par le cable USB relié au PC, donc en 5 V tout fonctionne.

Je mets ci dessous le schéma du branchement de mon montage :

balise_SA828_D1ProMini_Schema.pdf (81.5 KB)

Avec l'alimentation en 7.4 V que j'ai récupéré sur un éclairage solaire ça fonctionne (2 batteries 18650 en série).

Avec le montage en 5 V, ca ne fonctionne pas. la puissance demandée est trop élevée et la tension en sortie du MT3608 passe de 5 V à 2.3 V.

Pourtant, lorsque le montage est branché au port USB, les valeurs mesurées ne sont pas très élevées :
5.09 V, 210 mA en réception
4.90 V, 480 mA en émission.

Si c'était possible, je préfèrerais l'alimenter en 5 v car le panneau solaire est plus petit en dimensions et le boitier final serait également plus petit.

Pouvez vous m'aiguiller sur la faisabilité (ou pas!) d'alimentation en 5V ?

Merci.

1 Like

Bonsoir @fitness04

:+1: un magnifique schéma comme on aimerait souvent en voir !!

Pouvez vous m'aiguiller sur la faisabilité (ou pas!) d'alimentation en 5V ?

tentative pour une alimentation en "pas tout à fait 5V" :wink:

TENSION d'ALIMENTATION
Pour information : Le régulateur linéaire 3,3V des cartes Lolin D1 Mini (ME6211C33) est réellement 'low drop'....
Il sort encore ses 3,3V quand il ne reçoit que 3,5V en entrée pour le courant que tu mentionnes.

Je profite régulièrement de ça en raccordant directement un accu LI-On entre le bornes "5V" et "GND" de la carte D1 MIni. (ou de petites cartes à ESP32) On arrive alors exploiter presque toute la courbe de décharge d'un accu LI-On, quand il ya 3,5V à ses bornes il ne lui reste plus grand chose comme mAh dans le ventre....

Le DFPlayer Mini fonctionnera alimenté entre 4,2V (accu LI-On pleinement chargé) et 3,5V (accu Li-on presque vide

Le SA828 aussi, il lui faut au moins 3,3V

SOLAIRE

Pour le solaire :sunny:je reste en recherche de solution 'parfaite' :wink: pour des besoins proches des tiens

J'ai actuellement en test depuis deux mois ce petit module bâti autour d'un circuit intégré CN3791
image

C'est du 'quasi MPPT' : le circuit intégré CN3791 ne cherche pas réellement en permanence le point de puissance maximale , il considère que la puissance maxi à tirer du panneau solaire se situe toujours avec une tension égale à 80% de la tension à vide et s'efforce de maintenir ,dans mon cas, à 5V la tension aux bornes du panneau solaire.

C'est une bonne approximation de MPPT qui permet ,il me semble, d'exploiter presque au mieux un petit panneau solaire. Mieux en tous les cas que le TP4056 que j'utilisais avant (module 03962A) qui n'est pas à l'orgine conçu pour exploiter un panneau solaire même s'il le fait pas trop mal

Je teste avec un petit panneau 6V/120mA (environ 10cm2) , d'où le choix de la variante 6V du module

Résultats satisfaisants pour l'instant avec le peu d'ensoleillement actuel
j'ai renouvelé ma commande et commandé également un modèle voisin en version solaire 9V dont la tension de fin de charge est réglable et qui peut donc charger mes LiFePO4

Ma proposition :
*-tester longuement l'ensemble du montage en l'alimentant sous 3,5V
*-si OK virer le convertisseur élévateur, alimnenter directement tout le montage en "3,7V" (en fait de 4,2V à 3,5V)
-améliorer le rendemet de la charge par panneau solaire en prenant un module qui fait du un 'MPPT' approximatif

1 Like

Bonjour al1fch, bonjour à tous,

Merci pour cette réponse. Je teste en branchant directement le montage aux batteries et ça fonctionne.

Je vais commander un CN3791. Mon panneau fournit 5V, doit je prendre un CN3791 6V?

Merci.

1 Like

Bonjour @fitness04

Je teste en branchant directement le montage aux batteries et ça fonctionne

Y compris avec un accu presque déchargé , aux alentours de 3,4V ?

Mon panneau fournit 5V, doit je prendre un CN3791 6V?

5v est sa tension à vide ou en charge ?
une photo du panneau ou un lien seraient disponibles ?

Le point de fonctionnement du "MPPT" est fixé par un pont diviseur, on peut donc en principe le décaler en jouant .... avec les minuscules résistances CMS R3 et R4 qui le composent et donc adapter un module 6V en module 5V si nécessaire en abaissant son point de fonctionnement du MPPT à 4V
image

1 Like

Bonsoir al1fch,

C'est ce panneau solaire :
https://fr.aliexpress.com/item/32952046749.html?spm=a2g0o.order_list.order_list_main.10.37655e5bsbLyoZ&gatewayAdapt=glo2fra

1 Like

Bonjour,

J'ai un petit doute sur la puissance max fournie par ce panneau. La puissance solaire sur 1 m2 est de l'ordre de 1000W ce panneau à une surface de 9x14.5 soit 0.013 m2, il recevrait donc 13 W du soleil. Le rendement d'un panneau solaire est entre 13 et 24% (source). Prenons une valeur optimiste de 20% on obtient 2,7W seulement. :confused:

Ceci dit, ce n'est peut être pas grave en fonction de la consommation journalière de votre montage.

A+

1 Like

Bonsoir

en étant très opimiste, oui :wink:

les vendeurs de petits panneaux solaires semblent parfois pratiquer la même exagération que le vendeurs daccus Lion quand aux performances de leurs produits...

Pour avoir, par une autre voie, une idée des puissances maxi de divers petits panneaux solaires polycristallins, voir ici en bas de page le tableau fourni par le vendeur

On peut y voir les valeurs :
-de la tension à vide,
-du courant de cout-circuit
-de la puissance maxi avec indication de la tension et du courant en ce point de fonctionnement optimal

1 Like

Bonjour à tous les deux,

Merci pour vos réponses.
Effectivement, le panneau ne doit pas fournir 5 W, mais pour l'instant, en test ça fonctionne.
il faut dire qu'il fait beau dans le sud avec un grand soleil...

Je ne sais pas encore si ça suffira pour les jours de mauvais temps!

J'ai mesuré qu'en veille nocturne, le montage consomme tout de même 90 mA. Le DFplayer mini a un mode Sleep mais la consommation ne baisse pas.

Je me demande de plus en plus si la solution finale n'est pas de couper totalement l'alimentation pendant la nuit dés que le panneau ne produit plus de courant, avec un mosfet ou un transistor comme indiqué ci dessous?

1 Like

Bonjour @fitness04

+1 pour un MOSFET canal P dont la valeur de VGS soit suffisement faible pour garantir sa pleine conduction avec 3,3V sur sa grille, ce n'est pas tout à fait le cas de la référence mentionnée ci dessus.

Des référence içi chez @hbachetti :

1 Like

Bonjour,

Est ce qu'un Mosfet IRF4905 conviendrait?

Il est en boitier TO-220 ce qui me conviendrait mieux pour souder!

Sinon, pour les boitiers avec soudure en surface, peut-on les souder avec un fer à souder 30 w avec une panne pointue? Il me semble que ce doit être dur de maintenir le composant en place sans bouger!

Merci.

1 Like

Bonsoir @fitness04
ce n'est pas garanti

ici le fabricant indique qu'un IRF4905 s'entre-ouvre (=laisse passer un courant de
µA) si la tension entre Source et Grille vaut, selon les exempleirs , entre 2V et 4V.

C'est donc la loterie , avec un peu de chance tu auras en mains un exemplaire laissant passer les 100 mA dont tu as besoin , avec 3,3V entre Source et Grille

désolé je n'ai pas en tête de référence de MOSFET canal P en boitier TO220 dont le VGSth soit de l'ordre de 2V pour avoir la garantie qu'à 3,3V il laissera passer tout le courant nécessaire

1 Like

Le choix en matière de P-MOSFETs est assez réduit, surtout en TO220.
Le SUP90P06 est pas trop mal, mais un AO3401 le bat à plates coutures.
Il ne faut pas craindre les SOT23 :


Ici une carte avec 16 MOSFETs, soudés à la main.

Je dirais oui, sans problème.

1 Like

A défaut le boitier DPAK (TO252) est presque aussi maniable que l'antique TO220

1 Like

Aussi, AOI409 par exemple.

1 Like