<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.myows.top/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.197.195.126&amp;*</id>
	<title> - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.myows.top/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.197.195.126&amp;*"/>
	<link rel="alternate" type="text/html" href="https://wiki.myows.top/index.php?title=Special:Contributions/178.197.195.126"/>
	<updated>2026-05-13T22:14:21Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1907</id>
		<title>CrowPanel-ESP32-E-Paper-HMI-1.54</title>
		<link rel="alternate" type="text/html" href="https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1907"/>
		<updated>2025-11-26T19:23:44Z</updated>

		<summary type="html">&lt;p&gt;178.197.195.126: /* Code HelloWord */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== E-Paper-HMI-1.54 (Elecrow) ==&lt;br /&gt;
&lt;br /&gt;
=== Liens externes ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_HMI_1.54-inch_Display.html Wiki&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_1.54-inch_Arduino_Tutorial.html Arduino Setup&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/crowpanel-esp32-1-54-e-paper-hmi-display-with-152-152-resolution-black-white-color-driven-by-spi-interface.html Shop&lt;br /&gt;
&lt;br /&gt;
 BLE debugging assistant&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/1-54-inch-152-152-e-paper-display-black-white-e-ink-display-with-spi-communication.html&lt;br /&gt;
&lt;br /&gt;
=== Caractéristiques ===&lt;br /&gt;
&lt;br /&gt;
Driver Chip : &amp;lt;b&amp;gt;SSD1680&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Résolution 152 x 152&amp;lt;br&amp;gt;&lt;br /&gt;
Couleur noir et blanc&amp;lt;br&amp;gt;&lt;br /&gt;
Pilote ESP32-S3 comme contrôleur principal&amp;lt;br&amp;gt;&lt;br /&gt;
PSRAM : 8MB&amp;lt;br&amp;gt;&lt;br /&gt;
Flash :	8MB&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
[[File:E-Paper-HMI-1.54-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[File:E-Paper-HMI-1.54-2.png|300px]]&lt;br /&gt;
[[File:E-Paper-HMI-1.54-3.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/download/product/CrowPanel/E-paper/Image2Lcd_v2.9.zip Image2Lcd_v2.9&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152 GitHub&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152/archive/refs/heads/master.zip GitHub ZIP&lt;br /&gt;
&lt;br /&gt;
=== Arduine Mise en route (Setup) ===&lt;br /&gt;
&lt;br /&gt;
Click &amp;quot;Tools&amp;quot;-&amp;gt;&amp;quot;Board&amp;quot;-&amp;gt;&amp;quot;esp32&amp;quot;-&amp;gt;&amp;quot;ESP32S3 Dev Module&amp;quot;, &lt;br /&gt;
&lt;br /&gt;
and the &amp;quot;Partition Scheme&amp;quot; select &lt;br /&gt;
&amp;quot;Huge APP (3MB No OTA/1MB SPIFFS)&amp;quot;, &lt;br /&gt;
&amp;quot;PSRAM&amp;quot; select &amp;quot;OPI PSRAM&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Setup-Arduino-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Librairies ===&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;Arduino.h&amp;gt;   // Inclure la bibliothèque principale Arduino&lt;br /&gt;
 #include &amp;quot;EPD_GUI.h&amp;quot;   // Inclure la bibliothèque pour l&amp;#039;écran à encre électronique&lt;br /&gt;
 #include &amp;quot;Pic.h&amp;quot;       // Inclure la bibliothèque de fonctions personnalisées&lt;br /&gt;
 #include &amp;quot;FS.h&amp;quot;        // Bibliothèque du système de fichiers pour les opérations sur les fichiers&lt;br /&gt;
 #include &amp;quot;SPIFFS.h&amp;quot;    // Bibliothèque du système de fichiers SPIFFS pour la lecture et l&amp;#039;écriture de fichiers&lt;br /&gt;
 #include &amp;lt;WiFi.h&amp;gt;      // Bibliothèque WiFi pour la création et la gestion des connexions WiFi&lt;br /&gt;
 #include &amp;lt;Ticker.h&amp;gt;    // Bibliothèque de chronométrage&lt;br /&gt;
 #include &amp;lt;WebServer.h&amp;gt; // Bibliothèque de serveur Web pour la création d&amp;#039;un serveur HTTP&lt;br /&gt;
&lt;br /&gt;
=== Code Exemples ===&lt;br /&gt;
&lt;br /&gt;
Arduino Code for demos&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_WIFI_refresh.ino &amp;lt;b&amp;gt;Update via WiFi&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_ble_refresh.ino  &amp;lt;b&amp;gt;Update via Bluetooth&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi_http_openweather.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arduino Code for examples&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_PWR.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_BLE.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_key.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_Global_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_partial_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=smDFHRxDYdw&lt;br /&gt;
&lt;br /&gt;
=== Code wifi_http_openweather ===&lt;br /&gt;
&lt;br /&gt;
https://openweathermap.org/ Veuillez vous enregistrer afin de vous procurer votre OpenWeatherMap API key&lt;br /&gt;
&lt;br /&gt;
http://bulk.openweathermap.org/sample/ on trouve ici : city.list.json.gz, le countryCode de votre ville (variable city)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HTTPClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino_JSON.h&amp;gt;&lt;br /&gt;
#include &amp;quot;EPD_GUI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Pic.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Define an array for black and white image data, which serves as the buffer for the e-paper display.&lt;br /&gt;
// The size of the buffer is determined according to the resolution of the e-paper display.&lt;br /&gt;
uint8_t ImageBW[2888];&lt;br /&gt;
&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Variables related to timing and API calls.&lt;br /&gt;
// lastTime keeps track of the last time the API was called.&lt;br /&gt;
unsigned long lastTime = 0;&lt;br /&gt;
// timerDelay determines the time interval between API calls. For testing, it&amp;#039;s set to 10 seconds (10000 milliseconds).&lt;br /&gt;
// In a final application, this should be set according to the API call limits per hour/minute.&lt;br /&gt;
unsigned long timerDelay = 10000;&lt;br /&gt;
&lt;br /&gt;
// Variables related to JSON data.&lt;br /&gt;
// jsonBuffer stores the raw JSON data received from the API.&lt;br /&gt;
String jsonBuffer;&lt;br /&gt;
// httpResponseCode holds the response code from the HTTP request.&lt;br /&gt;
int httpResponseCode;&lt;br /&gt;
// myObject is a JSON variable that will hold the parsed JSON data.&lt;br /&gt;
JSONVar myObject;&lt;br /&gt;
&lt;br /&gt;
// Variables related to weather information.&lt;br /&gt;
// weather stores the main weather description.&lt;br /&gt;
String weather;&lt;br /&gt;
// temperature stores the temperature value.&lt;br /&gt;
String temperature;&lt;br /&gt;
// humidity stores the humidity value.&lt;br /&gt;
String humidity;&lt;br /&gt;
// sea_level stores the sea level value.&lt;br /&gt;
String sea_level;&lt;br /&gt;
// wind_speed stores the wind speed value.&lt;br /&gt;
String wind_speed;&lt;br /&gt;
// city_js stores the name of the city.&lt;br /&gt;
String city_js;&lt;br /&gt;
// weather_flag is a flag that determines which weather icon to display based on the weather description.&lt;br /&gt;
int weather_flag = 0;&lt;br /&gt;
&lt;br /&gt;
// Function to display weather forecast on the e-paper display.&lt;br /&gt;
void UI_weather_forecast()&lt;br /&gt;
{&lt;br /&gt;
  char buffer[40];&lt;br /&gt;
&lt;br /&gt;
  EPD_HW_RESET();&lt;br /&gt;
&lt;br /&gt;
  // Display a background picture on the e-paper.&lt;br /&gt;
  EPD_ShowPicture(0, 0, 152, 152, pic, BLACK);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Visit&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_visit, BLACK);&lt;br /&gt;
  //Wind&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_wind, BLACK);&lt;br /&gt;
  //Temp&lt;br /&gt;
  //  EPD_ShowPicture(92, 0, 56, 72, gImage_temp, BLACK);&lt;br /&gt;
  //Hum&lt;br /&gt;
&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 270, WHITE);&lt;br /&gt;
  // Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  // EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
&lt;br /&gt;
  // Display the update time (it seems to be mislabeled as city_js here, might need to be corrected depending on the actual intention).&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, city_js);&lt;br /&gt;
  EPD_ShowString(20, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Hum&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, humidity);&lt;br /&gt;
  EPD_ShowString(105, 140, buffer,  12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Temp&lt;br /&gt;
  //       memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //       snprintf(buffer, sizeof(buffer), &amp;quot;%s C&amp;quot;, temperature);&lt;br /&gt;
  //       EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Wind&lt;br /&gt;
  // memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  // snprintf(buffer, sizeof(buffer), &amp;quot;%s m/s&amp;quot;, wind_speed);&lt;br /&gt;
  // EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //visit&lt;br /&gt;
  //  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, sea_level);&lt;br /&gt;
  //  EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  // Update the e-paper display with the new content.&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200); // Initialize the serial communication.&lt;br /&gt;
&lt;br /&gt;
  // Connect to the WiFi network.&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
  Serial.println(&amp;quot;Connecting&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    delay(500);&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Connected to WiFi network with IP Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP()); // Print the IP address of the device after successful connection.&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Set pin 7 as an output pin to control the power of the e-paper display.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
  digitalWrite(7, HIGH);&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 0, WHITE);&lt;br /&gt;
  Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  js_analysis();&lt;br /&gt;
  UI_weather_forecast();&lt;br /&gt;
  delay(1000 * 60 * 60);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void js_analysis()&lt;br /&gt;
{&lt;br /&gt;
  // Check if the device is connected to the WiFi network.&lt;br /&gt;
  if (WiFi.status() == WL_CONNECTED) {&lt;br /&gt;
    // Construct the URL for the OpenWeatherMap API request.&lt;br /&gt;
    String serverPath = &amp;quot;http://api.openweathermap.org/data/2.5/weather?q=&amp;quot; + city + &amp;quot;,&amp;quot; + countryCode + &amp;quot;&amp;amp;APPID=&amp;quot; + openWeatherMapApiKey + &amp;quot;&amp;amp;units=metric&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // Keep trying until a successful response (status code 200) is received.&lt;br /&gt;
    while (httpResponseCode != 200) {&lt;br /&gt;
      // Make an HTTP GET request to the API and store the response in jsonBuffer.&lt;br /&gt;
      jsonBuffer = httpGETRequest(serverPath.c_str());&lt;br /&gt;
      Serial.println(jsonBuffer);&lt;br /&gt;
      myObject = JSON.parse(jsonBuffer);&lt;br /&gt;
&lt;br /&gt;
      // Check if the JSON parsing was successful.&lt;br /&gt;
      if (JSON.typeof(myObject) == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
        Serial.println(&amp;quot;Parsing input failed!&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      delay(2000);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Extract weather information from the parsed JSON data.&lt;br /&gt;
    weather = JSON.stringify(myObject[&amp;quot;weather&amp;quot;][0][&amp;quot;main&amp;quot;]);&lt;br /&gt;
    temperature = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;]);&lt;br /&gt;
    humidity = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;humidity&amp;quot;]);&lt;br /&gt;
    sea_level = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;sea_level&amp;quot;]);&lt;br /&gt;
    wind_speed = JSON.stringify(myObject[&amp;quot;wind&amp;quot;][&amp;quot;speed&amp;quot;]);&lt;br /&gt;
    city_js = JSON.stringify(myObject[&amp;quot;name&amp;quot;]);&lt;br /&gt;
&lt;br /&gt;
    // Print the extracted weather information for debugging purposes.&lt;br /&gt;
    Serial.print(&amp;quot;String weather: &amp;quot;);&lt;br /&gt;
    Serial.println(weather);&lt;br /&gt;
    Serial.print(&amp;quot;String Temperature: &amp;quot;);&lt;br /&gt;
    Serial.println(temperature);&lt;br /&gt;
    Serial.print(&amp;quot;String humidity: &amp;quot;);&lt;br /&gt;
    Serial.println(humidity);&lt;br /&gt;
    Serial.print(&amp;quot;String sea_level: &amp;quot;);&lt;br /&gt;
    Serial.println(sea_level);&lt;br /&gt;
    Serial.print(&amp;quot;String wind_speed: &amp;quot;);&lt;br /&gt;
    Serial.println(wind_speed);&lt;br /&gt;
    Serial.print(&amp;quot;String city_js: &amp;quot;);&lt;br /&gt;
    Serial.println(city_js);&lt;br /&gt;
&lt;br /&gt;
    // Determine the weather icon based on the weather description.&lt;br /&gt;
    if (weather.indexOf(&amp;quot;clouds&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clouds&amp;quot;) != -1 ) {&lt;br /&gt;
      weather_flag = 1;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;clear sky&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clear sky&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 3;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;rain&amp;quot;) != -1 || weather.indexOf(&amp;quot;Rain&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 5;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;thunderstorm&amp;quot;) != -1 || weather.indexOf(&amp;quot;Thunderstorm&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 2;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;snow&amp;quot;) != -1 || weather.indexOf(&amp;quot;Snow&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 4;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;mist&amp;quot;) != -1 || weather.indexOf(&amp;quot;Mist&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    // Print a message if the device is not connected to the WiFi network.&lt;br /&gt;
    Serial.println(&amp;quot;WiFi Disconnected&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Function to make an HTTP GET request and return the response.&lt;br /&gt;
String httpGETRequest(const char* serverName) {&lt;br /&gt;
  WiFiClient client;&lt;br /&gt;
  HTTPClient http;&lt;br /&gt;
&lt;br /&gt;
  // Initialize the HTTP client with the server name.&lt;br /&gt;
  http.begin(client, serverName);&lt;br /&gt;
&lt;br /&gt;
  // Send an HTTP GET request.&lt;br /&gt;
  httpResponseCode = http.GET();&lt;br /&gt;
&lt;br /&gt;
  // Initialize the response payload as an empty JSON object.&lt;br /&gt;
  String payload = &amp;quot;{}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  // Check if the response code is positive (indicating a successful request).&lt;br /&gt;
  if (httpResponseCode &amp;gt; 0) {&lt;br /&gt;
    Serial.print(&amp;quot;HTTP Response code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
    payload = http.getString();&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Serial.print(&amp;quot;Error code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Close the HTTP connection.&lt;br /&gt;
  http.end();&lt;br /&gt;
&lt;br /&gt;
  return payload;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Explications : Partie à modifier avec vos données, ssid, password, openWeatherMapApiKey, city, countryCode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code HelloWord ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
	* @file HelloWorld.ino&lt;br /&gt;
	* @author HalfSweet (Email:HalfSweet@HalfSweet.cn or QQ:2522182733)&lt;br /&gt;
	* @brief Ce fichier est un exemple de programme permettant d&amp;#039;afficher «Hello World» sur un écran à encre électronique. Il illustre uniquement la méthode la plus simple pour allumer l&amp;#039;écran. &lt;br /&gt;
        * Veuillez consulter la documentation pour connaître l&amp;#039;utilisation des différentes fonctions.&lt;br /&gt;
	* @version 0.1&lt;br /&gt;
	* @date 2022-01-30&lt;br /&gt;
	*&lt;br /&gt;
	* @copyright Copyright (c) 2022&lt;br /&gt;
	*&lt;br /&gt;
*/ &lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;EPaperDrive.h&amp;gt;&lt;br /&gt;
// Inclure le système de fichiers à utiliser, par exemple:&lt;br /&gt;
#include &amp;lt;LittleFS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUD_SPEED 74880 // Débit en bauds pour le débogage du port série, modifiable selon les besoins&lt;br /&gt;
&lt;br /&gt;
#define CS 15&lt;br /&gt;
#define RST 2&lt;br /&gt;
#define DC 0&lt;br /&gt;
#define BUSY 4&lt;br /&gt;
#define CLK 14&lt;br /&gt;
#define DIN 13&lt;br /&gt;
&lt;br /&gt;
EPaperDrive EPD(0, CS, RST, DC, BUSY, CLK, DIN); //Instanciation de la bibliothèque de pilotes, utilisant ici le protocole SPI logiciel&lt;br /&gt;
&lt;br /&gt;
const uint8_t city_icon[24] = {&lt;br /&gt;
	/* 0X01,0X01,0X0C,0X00,0X0C,0X00, */&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0X60,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0XC0,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
	void setup()&lt;br /&gt;
	{&lt;br /&gt;
	Serial.begin(BAUD_SPEED);&lt;br /&gt;
	LittleFS.begin(); 			  // Veuillez initialiser manuellement le système de fichiers avant de passer le pointeur.&lt;br /&gt;
&lt;br /&gt;
	EPD.SetFS(&amp;amp;LittleFS); 			 // Définit le système de fichiers pour le stockage des polices. La valeur passée est le pointeur d&amp;#039;opération pour ce système de fichiers. &lt;br /&gt;
                                                 //Vous pouvez la modifier.&lt;br /&gt;
	EPD.EPD_Set_Model(HINKE0266A15A0); 	 // Définit le type d&amp;#039;écran. Consultez la documentation pour les modèles spécifiques.&lt;br /&gt;
	EPD.EPD_init_Full(); 			// Initialisation du rafraîchissement complet, en utilisant la forme d&amp;#039;onde de rafraîchissement complet.&lt;br /&gt;
	EPD.clearbuffer(); 		        // Efface le tampon (écran blanc).&lt;br /&gt;
	EPD.fontscale = 2; 			// Facteur d&amp;#039;échelle des polices (1 et 2 pris en charge, également applicable aux images. &lt;br /&gt;
                                                // N&amp;#039;oubliez pas de le remettre à 1 après utilisation).&lt;br /&gt;
	EPD.SetFont(FONT12); 		       // Sélectionne la police. Consultez la documentation pour connaître les polices prises en charge.&lt;br /&gt;
	EPD.DrawUTF(0, 0, &amp;quot;Hello&amp;quot;); &amp;quot;World&amp;quot;);  // Dessiner la chaîne&lt;br /&gt;
	EPD.DrawUTF(26, 0, &amp;quot;J&amp;#039;aime les écrans à encre électronique&amp;quot;); 	&lt;br /&gt;
                                               // Dessiner la chaîne&lt;br /&gt;
	EPD.fontscale = 1; 		       // Rétablir le facteur d&amp;#039;échelle de la police à 1&lt;br /&gt;
	EPD.DrawXbm_P(60, 0, 12, 12, (uint8_t *)city_icon); 			 // Dessiner l&amp;#039;image&lt;br /&gt;
&lt;br /&gt;
	Serial.printf(&amp;quot;Image tamponnée dessinée, prête pour un rafraîchissement complet\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Full((uint8_t *)EPD.EPDbuffer, 1); // Transmettre l&amp;#039;image tamponnée à la puce de contrôle de l&amp;#039;écran pour un rafraîchissement complet&lt;br /&gt;
	EPD.deepsleep(); // Mettre l&amp;#039;écran en veille&lt;br /&gt;
	Serial.println(&amp;quot;Rafraîchissement complet terminé&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	delay(5000);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_init_Part(); // Initialiser la partie Actualisation&lt;br /&gt;
	EPD.clearbuffer();&lt;br /&gt;
	EPD.fontscale = 2;&lt;br /&gt;
	EPD.SetFont(FONT12); EPD.DrawUTF(0, 0, &amp;quot;Actualisation locale activée&amp;quot;);&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale en cours\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Part(0, 23, 0, 199, (uint8_t *)EPD.EPDbuffer, 1); // Transfert de l&amp;#039;image du tampon vers la puce de contrôle d&amp;#039;écran pour l&amp;#039;actualisation locale sur le nouvel écran&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale terminée\n&amp;quot;);&lt;br /&gt;
	EPD.deepsleep();&lt;br /&gt;
&lt;br /&gt;
} void loop()&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	delay(1); // Empêcher le chien de garde de s&amp;#039;interrompre&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>178.197.195.126</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1906</id>
		<title>CrowPanel-ESP32-E-Paper-HMI-1.54</title>
		<link rel="alternate" type="text/html" href="https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1906"/>
		<updated>2025-11-26T19:21:31Z</updated>

		<summary type="html">&lt;p&gt;178.197.195.126: /* Code HelloWord */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== E-Paper-HMI-1.54 (Elecrow) ==&lt;br /&gt;
&lt;br /&gt;
=== Liens externes ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_HMI_1.54-inch_Display.html Wiki&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_1.54-inch_Arduino_Tutorial.html Arduino Setup&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/crowpanel-esp32-1-54-e-paper-hmi-display-with-152-152-resolution-black-white-color-driven-by-spi-interface.html Shop&lt;br /&gt;
&lt;br /&gt;
 BLE debugging assistant&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/1-54-inch-152-152-e-paper-display-black-white-e-ink-display-with-spi-communication.html&lt;br /&gt;
&lt;br /&gt;
=== Caractéristiques ===&lt;br /&gt;
&lt;br /&gt;
Driver Chip : &amp;lt;b&amp;gt;SSD1680&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Résolution 152 x 152&amp;lt;br&amp;gt;&lt;br /&gt;
Couleur noir et blanc&amp;lt;br&amp;gt;&lt;br /&gt;
Pilote ESP32-S3 comme contrôleur principal&amp;lt;br&amp;gt;&lt;br /&gt;
PSRAM : 8MB&amp;lt;br&amp;gt;&lt;br /&gt;
Flash :	8MB&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
[[File:E-Paper-HMI-1.54-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[File:E-Paper-HMI-1.54-2.png|300px]]&lt;br /&gt;
[[File:E-Paper-HMI-1.54-3.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/download/product/CrowPanel/E-paper/Image2Lcd_v2.9.zip Image2Lcd_v2.9&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152 GitHub&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152/archive/refs/heads/master.zip GitHub ZIP&lt;br /&gt;
&lt;br /&gt;
=== Arduine Mise en route (Setup) ===&lt;br /&gt;
&lt;br /&gt;
Click &amp;quot;Tools&amp;quot;-&amp;gt;&amp;quot;Board&amp;quot;-&amp;gt;&amp;quot;esp32&amp;quot;-&amp;gt;&amp;quot;ESP32S3 Dev Module&amp;quot;, &lt;br /&gt;
&lt;br /&gt;
and the &amp;quot;Partition Scheme&amp;quot; select &lt;br /&gt;
&amp;quot;Huge APP (3MB No OTA/1MB SPIFFS)&amp;quot;, &lt;br /&gt;
&amp;quot;PSRAM&amp;quot; select &amp;quot;OPI PSRAM&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Setup-Arduino-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Librairies ===&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;Arduino.h&amp;gt;   // Inclure la bibliothèque principale Arduino&lt;br /&gt;
 #include &amp;quot;EPD_GUI.h&amp;quot;   // Inclure la bibliothèque pour l&amp;#039;écran à encre électronique&lt;br /&gt;
 #include &amp;quot;Pic.h&amp;quot;       // Inclure la bibliothèque de fonctions personnalisées&lt;br /&gt;
 #include &amp;quot;FS.h&amp;quot;        // Bibliothèque du système de fichiers pour les opérations sur les fichiers&lt;br /&gt;
 #include &amp;quot;SPIFFS.h&amp;quot;    // Bibliothèque du système de fichiers SPIFFS pour la lecture et l&amp;#039;écriture de fichiers&lt;br /&gt;
 #include &amp;lt;WiFi.h&amp;gt;      // Bibliothèque WiFi pour la création et la gestion des connexions WiFi&lt;br /&gt;
 #include &amp;lt;Ticker.h&amp;gt;    // Bibliothèque de chronométrage&lt;br /&gt;
 #include &amp;lt;WebServer.h&amp;gt; // Bibliothèque de serveur Web pour la création d&amp;#039;un serveur HTTP&lt;br /&gt;
&lt;br /&gt;
=== Code Exemples ===&lt;br /&gt;
&lt;br /&gt;
Arduino Code for demos&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_WIFI_refresh.ino &amp;lt;b&amp;gt;Update via WiFi&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_ble_refresh.ino  &amp;lt;b&amp;gt;Update via Bluetooth&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi_http_openweather.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arduino Code for examples&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_PWR.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_BLE.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_key.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_Global_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_partial_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=smDFHRxDYdw&lt;br /&gt;
&lt;br /&gt;
=== Code wifi_http_openweather ===&lt;br /&gt;
&lt;br /&gt;
https://openweathermap.org/ Veuillez vous enregistrer afin de vous procurer votre OpenWeatherMap API key&lt;br /&gt;
&lt;br /&gt;
http://bulk.openweathermap.org/sample/ on trouve ici : city.list.json.gz, le countryCode de votre ville (variable city)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HTTPClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino_JSON.h&amp;gt;&lt;br /&gt;
#include &amp;quot;EPD_GUI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Pic.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Define an array for black and white image data, which serves as the buffer for the e-paper display.&lt;br /&gt;
// The size of the buffer is determined according to the resolution of the e-paper display.&lt;br /&gt;
uint8_t ImageBW[2888];&lt;br /&gt;
&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Variables related to timing and API calls.&lt;br /&gt;
// lastTime keeps track of the last time the API was called.&lt;br /&gt;
unsigned long lastTime = 0;&lt;br /&gt;
// timerDelay determines the time interval between API calls. For testing, it&amp;#039;s set to 10 seconds (10000 milliseconds).&lt;br /&gt;
// In a final application, this should be set according to the API call limits per hour/minute.&lt;br /&gt;
unsigned long timerDelay = 10000;&lt;br /&gt;
&lt;br /&gt;
// Variables related to JSON data.&lt;br /&gt;
// jsonBuffer stores the raw JSON data received from the API.&lt;br /&gt;
String jsonBuffer;&lt;br /&gt;
// httpResponseCode holds the response code from the HTTP request.&lt;br /&gt;
int httpResponseCode;&lt;br /&gt;
// myObject is a JSON variable that will hold the parsed JSON data.&lt;br /&gt;
JSONVar myObject;&lt;br /&gt;
&lt;br /&gt;
// Variables related to weather information.&lt;br /&gt;
// weather stores the main weather description.&lt;br /&gt;
String weather;&lt;br /&gt;
// temperature stores the temperature value.&lt;br /&gt;
String temperature;&lt;br /&gt;
// humidity stores the humidity value.&lt;br /&gt;
String humidity;&lt;br /&gt;
// sea_level stores the sea level value.&lt;br /&gt;
String sea_level;&lt;br /&gt;
// wind_speed stores the wind speed value.&lt;br /&gt;
String wind_speed;&lt;br /&gt;
// city_js stores the name of the city.&lt;br /&gt;
String city_js;&lt;br /&gt;
// weather_flag is a flag that determines which weather icon to display based on the weather description.&lt;br /&gt;
int weather_flag = 0;&lt;br /&gt;
&lt;br /&gt;
// Function to display weather forecast on the e-paper display.&lt;br /&gt;
void UI_weather_forecast()&lt;br /&gt;
{&lt;br /&gt;
  char buffer[40];&lt;br /&gt;
&lt;br /&gt;
  EPD_HW_RESET();&lt;br /&gt;
&lt;br /&gt;
  // Display a background picture on the e-paper.&lt;br /&gt;
  EPD_ShowPicture(0, 0, 152, 152, pic, BLACK);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Visit&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_visit, BLACK);&lt;br /&gt;
  //Wind&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_wind, BLACK);&lt;br /&gt;
  //Temp&lt;br /&gt;
  //  EPD_ShowPicture(92, 0, 56, 72, gImage_temp, BLACK);&lt;br /&gt;
  //Hum&lt;br /&gt;
&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 270, WHITE);&lt;br /&gt;
  // Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  // EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
&lt;br /&gt;
  // Display the update time (it seems to be mislabeled as city_js here, might need to be corrected depending on the actual intention).&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, city_js);&lt;br /&gt;
  EPD_ShowString(20, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Hum&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, humidity);&lt;br /&gt;
  EPD_ShowString(105, 140, buffer,  12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Temp&lt;br /&gt;
  //       memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //       snprintf(buffer, sizeof(buffer), &amp;quot;%s C&amp;quot;, temperature);&lt;br /&gt;
  //       EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Wind&lt;br /&gt;
  // memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  // snprintf(buffer, sizeof(buffer), &amp;quot;%s m/s&amp;quot;, wind_speed);&lt;br /&gt;
  // EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //visit&lt;br /&gt;
  //  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, sea_level);&lt;br /&gt;
  //  EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  // Update the e-paper display with the new content.&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200); // Initialize the serial communication.&lt;br /&gt;
&lt;br /&gt;
  // Connect to the WiFi network.&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
  Serial.println(&amp;quot;Connecting&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    delay(500);&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Connected to WiFi network with IP Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP()); // Print the IP address of the device after successful connection.&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Set pin 7 as an output pin to control the power of the e-paper display.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
  digitalWrite(7, HIGH);&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 0, WHITE);&lt;br /&gt;
  Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  js_analysis();&lt;br /&gt;
  UI_weather_forecast();&lt;br /&gt;
  delay(1000 * 60 * 60);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void js_analysis()&lt;br /&gt;
{&lt;br /&gt;
  // Check if the device is connected to the WiFi network.&lt;br /&gt;
  if (WiFi.status() == WL_CONNECTED) {&lt;br /&gt;
    // Construct the URL for the OpenWeatherMap API request.&lt;br /&gt;
    String serverPath = &amp;quot;http://api.openweathermap.org/data/2.5/weather?q=&amp;quot; + city + &amp;quot;,&amp;quot; + countryCode + &amp;quot;&amp;amp;APPID=&amp;quot; + openWeatherMapApiKey + &amp;quot;&amp;amp;units=metric&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // Keep trying until a successful response (status code 200) is received.&lt;br /&gt;
    while (httpResponseCode != 200) {&lt;br /&gt;
      // Make an HTTP GET request to the API and store the response in jsonBuffer.&lt;br /&gt;
      jsonBuffer = httpGETRequest(serverPath.c_str());&lt;br /&gt;
      Serial.println(jsonBuffer);&lt;br /&gt;
      myObject = JSON.parse(jsonBuffer);&lt;br /&gt;
&lt;br /&gt;
      // Check if the JSON parsing was successful.&lt;br /&gt;
      if (JSON.typeof(myObject) == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
        Serial.println(&amp;quot;Parsing input failed!&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      delay(2000);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Extract weather information from the parsed JSON data.&lt;br /&gt;
    weather = JSON.stringify(myObject[&amp;quot;weather&amp;quot;][0][&amp;quot;main&amp;quot;]);&lt;br /&gt;
    temperature = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;]);&lt;br /&gt;
    humidity = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;humidity&amp;quot;]);&lt;br /&gt;
    sea_level = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;sea_level&amp;quot;]);&lt;br /&gt;
    wind_speed = JSON.stringify(myObject[&amp;quot;wind&amp;quot;][&amp;quot;speed&amp;quot;]);&lt;br /&gt;
    city_js = JSON.stringify(myObject[&amp;quot;name&amp;quot;]);&lt;br /&gt;
&lt;br /&gt;
    // Print the extracted weather information for debugging purposes.&lt;br /&gt;
    Serial.print(&amp;quot;String weather: &amp;quot;);&lt;br /&gt;
    Serial.println(weather);&lt;br /&gt;
    Serial.print(&amp;quot;String Temperature: &amp;quot;);&lt;br /&gt;
    Serial.println(temperature);&lt;br /&gt;
    Serial.print(&amp;quot;String humidity: &amp;quot;);&lt;br /&gt;
    Serial.println(humidity);&lt;br /&gt;
    Serial.print(&amp;quot;String sea_level: &amp;quot;);&lt;br /&gt;
    Serial.println(sea_level);&lt;br /&gt;
    Serial.print(&amp;quot;String wind_speed: &amp;quot;);&lt;br /&gt;
    Serial.println(wind_speed);&lt;br /&gt;
    Serial.print(&amp;quot;String city_js: &amp;quot;);&lt;br /&gt;
    Serial.println(city_js);&lt;br /&gt;
&lt;br /&gt;
    // Determine the weather icon based on the weather description.&lt;br /&gt;
    if (weather.indexOf(&amp;quot;clouds&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clouds&amp;quot;) != -1 ) {&lt;br /&gt;
      weather_flag = 1;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;clear sky&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clear sky&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 3;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;rain&amp;quot;) != -1 || weather.indexOf(&amp;quot;Rain&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 5;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;thunderstorm&amp;quot;) != -1 || weather.indexOf(&amp;quot;Thunderstorm&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 2;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;snow&amp;quot;) != -1 || weather.indexOf(&amp;quot;Snow&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 4;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;mist&amp;quot;) != -1 || weather.indexOf(&amp;quot;Mist&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    // Print a message if the device is not connected to the WiFi network.&lt;br /&gt;
    Serial.println(&amp;quot;WiFi Disconnected&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Function to make an HTTP GET request and return the response.&lt;br /&gt;
String httpGETRequest(const char* serverName) {&lt;br /&gt;
  WiFiClient client;&lt;br /&gt;
  HTTPClient http;&lt;br /&gt;
&lt;br /&gt;
  // Initialize the HTTP client with the server name.&lt;br /&gt;
  http.begin(client, serverName);&lt;br /&gt;
&lt;br /&gt;
  // Send an HTTP GET request.&lt;br /&gt;
  httpResponseCode = http.GET();&lt;br /&gt;
&lt;br /&gt;
  // Initialize the response payload as an empty JSON object.&lt;br /&gt;
  String payload = &amp;quot;{}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  // Check if the response code is positive (indicating a successful request).&lt;br /&gt;
  if (httpResponseCode &amp;gt; 0) {&lt;br /&gt;
    Serial.print(&amp;quot;HTTP Response code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
    payload = http.getString();&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Serial.print(&amp;quot;Error code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Close the HTTP connection.&lt;br /&gt;
  http.end();&lt;br /&gt;
&lt;br /&gt;
  return payload;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Explications : Partie à modifier avec vos données, ssid, password, openWeatherMapApiKey, city, countryCode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code HelloWord ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
	* @file HelloWorld.ino&lt;br /&gt;
	* @author HalfSweet (Email:HalfSweet@HalfSweet.cn or QQ:2522182733)&lt;br /&gt;
	* @brief Ce fichier est un exemple de programme permettant d&amp;#039;afficher «Hello World» sur un écran à encre électronique. Il illustre uniquement la méthode la plus simple pour allumer l&amp;#039;écran. &lt;br /&gt;
        * Veuillez consulter la documentation pour connaître l&amp;#039;utilisation des différentes fonctions.&lt;br /&gt;
	* @version 0.1&lt;br /&gt;
	* @date 2022-01-30&lt;br /&gt;
	*&lt;br /&gt;
	* @copyright Copyright (c) 2022&lt;br /&gt;
	*&lt;br /&gt;
*/ &lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;EPaperDrive.h&amp;gt;&lt;br /&gt;
// Inclure le système de fichiers à utiliser, par exemple:&lt;br /&gt;
#include &amp;lt;LittleFS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUD_SPEED 74880 // Débit en bauds pour le débogage du port série, modifiable selon les besoins&lt;br /&gt;
&lt;br /&gt;
#define CS 15&lt;br /&gt;
#define RST 2&lt;br /&gt;
#define DC 0&lt;br /&gt;
#define BUSY 4&lt;br /&gt;
#define CLK 14&lt;br /&gt;
#define DIN 13&lt;br /&gt;
&lt;br /&gt;
EPaperDrive EPD(0, CS, RST, DC, BUSY, CLK, DIN); //Instanciation de la bibliothèque de pilotes, utilisant ici le protocole SPI logiciel&lt;br /&gt;
&lt;br /&gt;
const uint8_t city_icon[24] = {&lt;br /&gt;
	/* 0X01,0X01,0X0C,0X00,0X0C,0X00, */&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0X60,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0XC0,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
	void setup()&lt;br /&gt;
	{&lt;br /&gt;
	Serial.begin(BAUD_SPEED);&lt;br /&gt;
	LittleFS.begin(); 			  // Veuillez initialiser manuellement le système de fichiers avant de passer le pointeur.&lt;br /&gt;
&lt;br /&gt;
	EPD.SetFS(&amp;amp;LittleFS); 			 // Définit le système de fichiers pour le stockage des polices. La valeur passée est le pointeur d&amp;#039;opération pour ce système de fichiers. &lt;br /&gt;
                                                 //Vous pouvez la modifier.&lt;br /&gt;
	EPD.EPD_Set_Model(HINKE0266A15A0); 	 // Définit le type d&amp;#039;écran. Consultez la documentation pour les modèles spécifiques.&lt;br /&gt;
	EPD.EPD_init_Full(); 			// Initialisation du rafraîchissement complet, en utilisant la forme d&amp;#039;onde de rafraîchissement complet.&lt;br /&gt;
	EPD.clearbuffer(); 		        // Efface le tampon (écran blanc).&lt;br /&gt;
	EPD.fontscale = 2; 			// Facteur d&amp;#039;échelle des polices (1 et 2 pris en charge, également applicable aux images. &lt;br /&gt;
                                                // N&amp;#039;oubliez pas de le remettre à 1 après utilisation).&lt;br /&gt;
	EPD.SetFont(FONT12); 		       // Sélectionne la police. Consultez la documentation pour connaître les polices prises en charge.&lt;br /&gt;
	EPD.DrawUTF(0, 0, &amp;quot;Hello&amp;quot;); &amp;quot;World&amp;quot;);  // Dessiner la chaîne&lt;br /&gt;
	EPD.DrawUTF(26, 0, &amp;quot;J&amp;#039;aime les écrans à encre électronique&amp;quot;); 	&lt;br /&gt;
                                               // Dessiner la chaîne&lt;br /&gt;
	EPD.fontscale = 1; 												                    // Rétablir le facteur d&amp;#039;échelle de la police à 1&lt;br /&gt;
	EPD.DrawXbm_P(60, 0, 12, 12, (uint8_t *)city_icon); 			// Dessiner l&amp;#039;image&lt;br /&gt;
&lt;br /&gt;
	Serial.printf(&amp;quot;Image tamponnée dessinée, prête pour un rafraîchissement complet\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Full((uint8_t *)EPD.EPDbuffer, 1); // Transmettre l&amp;#039;image tamponnée à la puce de contrôle de l&amp;#039;écran pour un rafraîchissement complet&lt;br /&gt;
	EPD.deepsleep(); // Mettre l&amp;#039;écran en veille&lt;br /&gt;
	Serial.println(&amp;quot;Rafraîchissement complet terminé&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	delay(5000);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_init_Part(); // Initialiser la partie Actualisation&lt;br /&gt;
	EPD.clearbuffer();&lt;br /&gt;
	EPD.fontscale = 2;&lt;br /&gt;
	EPD.SetFont(FONT12); EPD.DrawUTF(0, 0, &amp;quot;Actualisation locale activée&amp;quot;);&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale en cours\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Part(0, 23, 0, 199, (uint8_t *)EPD.EPDbuffer, 1); // Transfert de l&amp;#039;image du tampon vers la puce de contrôle d&amp;#039;écran pour l&amp;#039;actualisation locale sur le nouvel écran&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale terminée\n&amp;quot;);&lt;br /&gt;
	EPD.deepsleep();&lt;br /&gt;
&lt;br /&gt;
} void loop()&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	delay(1); // Empêcher le chien de garde de s&amp;#039;interrompre&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>178.197.195.126</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1905</id>
		<title>CrowPanel-ESP32-E-Paper-HMI-1.54</title>
		<link rel="alternate" type="text/html" href="https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1905"/>
		<updated>2025-11-26T19:20:29Z</updated>

		<summary type="html">&lt;p&gt;178.197.195.126: /* Code HelloWord */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== E-Paper-HMI-1.54 (Elecrow) ==&lt;br /&gt;
&lt;br /&gt;
=== Liens externes ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_HMI_1.54-inch_Display.html Wiki&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_1.54-inch_Arduino_Tutorial.html Arduino Setup&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/crowpanel-esp32-1-54-e-paper-hmi-display-with-152-152-resolution-black-white-color-driven-by-spi-interface.html Shop&lt;br /&gt;
&lt;br /&gt;
 BLE debugging assistant&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/1-54-inch-152-152-e-paper-display-black-white-e-ink-display-with-spi-communication.html&lt;br /&gt;
&lt;br /&gt;
=== Caractéristiques ===&lt;br /&gt;
&lt;br /&gt;
Driver Chip : &amp;lt;b&amp;gt;SSD1680&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Résolution 152 x 152&amp;lt;br&amp;gt;&lt;br /&gt;
Couleur noir et blanc&amp;lt;br&amp;gt;&lt;br /&gt;
Pilote ESP32-S3 comme contrôleur principal&amp;lt;br&amp;gt;&lt;br /&gt;
PSRAM : 8MB&amp;lt;br&amp;gt;&lt;br /&gt;
Flash :	8MB&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
[[File:E-Paper-HMI-1.54-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[File:E-Paper-HMI-1.54-2.png|300px]]&lt;br /&gt;
[[File:E-Paper-HMI-1.54-3.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/download/product/CrowPanel/E-paper/Image2Lcd_v2.9.zip Image2Lcd_v2.9&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152 GitHub&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152/archive/refs/heads/master.zip GitHub ZIP&lt;br /&gt;
&lt;br /&gt;
=== Arduine Mise en route (Setup) ===&lt;br /&gt;
&lt;br /&gt;
Click &amp;quot;Tools&amp;quot;-&amp;gt;&amp;quot;Board&amp;quot;-&amp;gt;&amp;quot;esp32&amp;quot;-&amp;gt;&amp;quot;ESP32S3 Dev Module&amp;quot;, &lt;br /&gt;
&lt;br /&gt;
and the &amp;quot;Partition Scheme&amp;quot; select &lt;br /&gt;
&amp;quot;Huge APP (3MB No OTA/1MB SPIFFS)&amp;quot;, &lt;br /&gt;
&amp;quot;PSRAM&amp;quot; select &amp;quot;OPI PSRAM&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Setup-Arduino-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Librairies ===&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;Arduino.h&amp;gt;   // Inclure la bibliothèque principale Arduino&lt;br /&gt;
 #include &amp;quot;EPD_GUI.h&amp;quot;   // Inclure la bibliothèque pour l&amp;#039;écran à encre électronique&lt;br /&gt;
 #include &amp;quot;Pic.h&amp;quot;       // Inclure la bibliothèque de fonctions personnalisées&lt;br /&gt;
 #include &amp;quot;FS.h&amp;quot;        // Bibliothèque du système de fichiers pour les opérations sur les fichiers&lt;br /&gt;
 #include &amp;quot;SPIFFS.h&amp;quot;    // Bibliothèque du système de fichiers SPIFFS pour la lecture et l&amp;#039;écriture de fichiers&lt;br /&gt;
 #include &amp;lt;WiFi.h&amp;gt;      // Bibliothèque WiFi pour la création et la gestion des connexions WiFi&lt;br /&gt;
 #include &amp;lt;Ticker.h&amp;gt;    // Bibliothèque de chronométrage&lt;br /&gt;
 #include &amp;lt;WebServer.h&amp;gt; // Bibliothèque de serveur Web pour la création d&amp;#039;un serveur HTTP&lt;br /&gt;
&lt;br /&gt;
=== Code Exemples ===&lt;br /&gt;
&lt;br /&gt;
Arduino Code for demos&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_WIFI_refresh.ino &amp;lt;b&amp;gt;Update via WiFi&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_ble_refresh.ino  &amp;lt;b&amp;gt;Update via Bluetooth&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi_http_openweather.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arduino Code for examples&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_PWR.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_BLE.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_key.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_Global_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_partial_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=smDFHRxDYdw&lt;br /&gt;
&lt;br /&gt;
=== Code wifi_http_openweather ===&lt;br /&gt;
&lt;br /&gt;
https://openweathermap.org/ Veuillez vous enregistrer afin de vous procurer votre OpenWeatherMap API key&lt;br /&gt;
&lt;br /&gt;
http://bulk.openweathermap.org/sample/ on trouve ici : city.list.json.gz, le countryCode de votre ville (variable city)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HTTPClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino_JSON.h&amp;gt;&lt;br /&gt;
#include &amp;quot;EPD_GUI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Pic.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Define an array for black and white image data, which serves as the buffer for the e-paper display.&lt;br /&gt;
// The size of the buffer is determined according to the resolution of the e-paper display.&lt;br /&gt;
uint8_t ImageBW[2888];&lt;br /&gt;
&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Variables related to timing and API calls.&lt;br /&gt;
// lastTime keeps track of the last time the API was called.&lt;br /&gt;
unsigned long lastTime = 0;&lt;br /&gt;
// timerDelay determines the time interval between API calls. For testing, it&amp;#039;s set to 10 seconds (10000 milliseconds).&lt;br /&gt;
// In a final application, this should be set according to the API call limits per hour/minute.&lt;br /&gt;
unsigned long timerDelay = 10000;&lt;br /&gt;
&lt;br /&gt;
// Variables related to JSON data.&lt;br /&gt;
// jsonBuffer stores the raw JSON data received from the API.&lt;br /&gt;
String jsonBuffer;&lt;br /&gt;
// httpResponseCode holds the response code from the HTTP request.&lt;br /&gt;
int httpResponseCode;&lt;br /&gt;
// myObject is a JSON variable that will hold the parsed JSON data.&lt;br /&gt;
JSONVar myObject;&lt;br /&gt;
&lt;br /&gt;
// Variables related to weather information.&lt;br /&gt;
// weather stores the main weather description.&lt;br /&gt;
String weather;&lt;br /&gt;
// temperature stores the temperature value.&lt;br /&gt;
String temperature;&lt;br /&gt;
// humidity stores the humidity value.&lt;br /&gt;
String humidity;&lt;br /&gt;
// sea_level stores the sea level value.&lt;br /&gt;
String sea_level;&lt;br /&gt;
// wind_speed stores the wind speed value.&lt;br /&gt;
String wind_speed;&lt;br /&gt;
// city_js stores the name of the city.&lt;br /&gt;
String city_js;&lt;br /&gt;
// weather_flag is a flag that determines which weather icon to display based on the weather description.&lt;br /&gt;
int weather_flag = 0;&lt;br /&gt;
&lt;br /&gt;
// Function to display weather forecast on the e-paper display.&lt;br /&gt;
void UI_weather_forecast()&lt;br /&gt;
{&lt;br /&gt;
  char buffer[40];&lt;br /&gt;
&lt;br /&gt;
  EPD_HW_RESET();&lt;br /&gt;
&lt;br /&gt;
  // Display a background picture on the e-paper.&lt;br /&gt;
  EPD_ShowPicture(0, 0, 152, 152, pic, BLACK);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Visit&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_visit, BLACK);&lt;br /&gt;
  //Wind&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_wind, BLACK);&lt;br /&gt;
  //Temp&lt;br /&gt;
  //  EPD_ShowPicture(92, 0, 56, 72, gImage_temp, BLACK);&lt;br /&gt;
  //Hum&lt;br /&gt;
&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 270, WHITE);&lt;br /&gt;
  // Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  // EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
&lt;br /&gt;
  // Display the update time (it seems to be mislabeled as city_js here, might need to be corrected depending on the actual intention).&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, city_js);&lt;br /&gt;
  EPD_ShowString(20, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Hum&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, humidity);&lt;br /&gt;
  EPD_ShowString(105, 140, buffer,  12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Temp&lt;br /&gt;
  //       memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //       snprintf(buffer, sizeof(buffer), &amp;quot;%s C&amp;quot;, temperature);&lt;br /&gt;
  //       EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Wind&lt;br /&gt;
  // memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  // snprintf(buffer, sizeof(buffer), &amp;quot;%s m/s&amp;quot;, wind_speed);&lt;br /&gt;
  // EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //visit&lt;br /&gt;
  //  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, sea_level);&lt;br /&gt;
  //  EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  // Update the e-paper display with the new content.&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200); // Initialize the serial communication.&lt;br /&gt;
&lt;br /&gt;
  // Connect to the WiFi network.&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
  Serial.println(&amp;quot;Connecting&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    delay(500);&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Connected to WiFi network with IP Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP()); // Print the IP address of the device after successful connection.&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Set pin 7 as an output pin to control the power of the e-paper display.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
  digitalWrite(7, HIGH);&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 0, WHITE);&lt;br /&gt;
  Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  js_analysis();&lt;br /&gt;
  UI_weather_forecast();&lt;br /&gt;
  delay(1000 * 60 * 60);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void js_analysis()&lt;br /&gt;
{&lt;br /&gt;
  // Check if the device is connected to the WiFi network.&lt;br /&gt;
  if (WiFi.status() == WL_CONNECTED) {&lt;br /&gt;
    // Construct the URL for the OpenWeatherMap API request.&lt;br /&gt;
    String serverPath = &amp;quot;http://api.openweathermap.org/data/2.5/weather?q=&amp;quot; + city + &amp;quot;,&amp;quot; + countryCode + &amp;quot;&amp;amp;APPID=&amp;quot; + openWeatherMapApiKey + &amp;quot;&amp;amp;units=metric&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // Keep trying until a successful response (status code 200) is received.&lt;br /&gt;
    while (httpResponseCode != 200) {&lt;br /&gt;
      // Make an HTTP GET request to the API and store the response in jsonBuffer.&lt;br /&gt;
      jsonBuffer = httpGETRequest(serverPath.c_str());&lt;br /&gt;
      Serial.println(jsonBuffer);&lt;br /&gt;
      myObject = JSON.parse(jsonBuffer);&lt;br /&gt;
&lt;br /&gt;
      // Check if the JSON parsing was successful.&lt;br /&gt;
      if (JSON.typeof(myObject) == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
        Serial.println(&amp;quot;Parsing input failed!&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      delay(2000);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Extract weather information from the parsed JSON data.&lt;br /&gt;
    weather = JSON.stringify(myObject[&amp;quot;weather&amp;quot;][0][&amp;quot;main&amp;quot;]);&lt;br /&gt;
    temperature = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;]);&lt;br /&gt;
    humidity = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;humidity&amp;quot;]);&lt;br /&gt;
    sea_level = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;sea_level&amp;quot;]);&lt;br /&gt;
    wind_speed = JSON.stringify(myObject[&amp;quot;wind&amp;quot;][&amp;quot;speed&amp;quot;]);&lt;br /&gt;
    city_js = JSON.stringify(myObject[&amp;quot;name&amp;quot;]);&lt;br /&gt;
&lt;br /&gt;
    // Print the extracted weather information for debugging purposes.&lt;br /&gt;
    Serial.print(&amp;quot;String weather: &amp;quot;);&lt;br /&gt;
    Serial.println(weather);&lt;br /&gt;
    Serial.print(&amp;quot;String Temperature: &amp;quot;);&lt;br /&gt;
    Serial.println(temperature);&lt;br /&gt;
    Serial.print(&amp;quot;String humidity: &amp;quot;);&lt;br /&gt;
    Serial.println(humidity);&lt;br /&gt;
    Serial.print(&amp;quot;String sea_level: &amp;quot;);&lt;br /&gt;
    Serial.println(sea_level);&lt;br /&gt;
    Serial.print(&amp;quot;String wind_speed: &amp;quot;);&lt;br /&gt;
    Serial.println(wind_speed);&lt;br /&gt;
    Serial.print(&amp;quot;String city_js: &amp;quot;);&lt;br /&gt;
    Serial.println(city_js);&lt;br /&gt;
&lt;br /&gt;
    // Determine the weather icon based on the weather description.&lt;br /&gt;
    if (weather.indexOf(&amp;quot;clouds&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clouds&amp;quot;) != -1 ) {&lt;br /&gt;
      weather_flag = 1;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;clear sky&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clear sky&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 3;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;rain&amp;quot;) != -1 || weather.indexOf(&amp;quot;Rain&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 5;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;thunderstorm&amp;quot;) != -1 || weather.indexOf(&amp;quot;Thunderstorm&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 2;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;snow&amp;quot;) != -1 || weather.indexOf(&amp;quot;Snow&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 4;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;mist&amp;quot;) != -1 || weather.indexOf(&amp;quot;Mist&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    // Print a message if the device is not connected to the WiFi network.&lt;br /&gt;
    Serial.println(&amp;quot;WiFi Disconnected&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Function to make an HTTP GET request and return the response.&lt;br /&gt;
String httpGETRequest(const char* serverName) {&lt;br /&gt;
  WiFiClient client;&lt;br /&gt;
  HTTPClient http;&lt;br /&gt;
&lt;br /&gt;
  // Initialize the HTTP client with the server name.&lt;br /&gt;
  http.begin(client, serverName);&lt;br /&gt;
&lt;br /&gt;
  // Send an HTTP GET request.&lt;br /&gt;
  httpResponseCode = http.GET();&lt;br /&gt;
&lt;br /&gt;
  // Initialize the response payload as an empty JSON object.&lt;br /&gt;
  String payload = &amp;quot;{}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  // Check if the response code is positive (indicating a successful request).&lt;br /&gt;
  if (httpResponseCode &amp;gt; 0) {&lt;br /&gt;
    Serial.print(&amp;quot;HTTP Response code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
    payload = http.getString();&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Serial.print(&amp;quot;Error code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Close the HTTP connection.&lt;br /&gt;
  http.end();&lt;br /&gt;
&lt;br /&gt;
  return payload;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Explications : Partie à modifier avec vos données, ssid, password, openWeatherMapApiKey, city, countryCode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code HelloWord ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
	* @file HelloWorld.ino&lt;br /&gt;
	* @author HalfSweet (Email:HalfSweet@HalfSweet.cn or QQ:2522182733)&lt;br /&gt;
	* @brief Ce fichier est un exemple de programme permettant d&amp;#039;afficher «Hello World» sur un écran à encre électronique. Il illustre uniquement la méthode la plus simple pour allumer l&amp;#039;écran. &lt;br /&gt;
        * Veuillez consulter la documentation pour connaître l&amp;#039;utilisation des différentes fonctions.&lt;br /&gt;
	* @version 0.1&lt;br /&gt;
	* @date 2022-01-30&lt;br /&gt;
	*&lt;br /&gt;
	* @copyright Copyright (c) 2022&lt;br /&gt;
	*&lt;br /&gt;
*/ &lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;EPaperDrive.h&amp;gt;&lt;br /&gt;
// Inclure le système de fichiers à utiliser, par exemple:&lt;br /&gt;
#include &amp;lt;LittleFS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUD_SPEED 74880 // Débit en bauds pour le débogage du port série, modifiable selon les besoins&lt;br /&gt;
&lt;br /&gt;
#define CS 15&lt;br /&gt;
#define RST 2&lt;br /&gt;
#define DC 0&lt;br /&gt;
#define BUSY 4&lt;br /&gt;
#define CLK 14&lt;br /&gt;
#define DIN 13&lt;br /&gt;
&lt;br /&gt;
EPaperDrive EPD(0, CS, RST, DC, BUSY, CLK, DIN); //Instanciation de la bibliothèque de pilotes, utilisant ici le protocole SPI logiciel&lt;br /&gt;
&lt;br /&gt;
const uint8_t city_icon[24] = {&lt;br /&gt;
	/* 0X01,0X01,0X0C,0X00,0X0C,0X00, */&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0X60,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0XC0,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
	void setup()&lt;br /&gt;
	{&lt;br /&gt;
	Serial.begin(BAUD_SPEED);&lt;br /&gt;
	LittleFS.begin(); 			  // Veuillez initialiser manuellement le système de fichiers avant de passer le pointeur.&lt;br /&gt;
&lt;br /&gt;
	EPD.SetFS(&amp;amp;LittleFS); 			 // Définit le système de fichiers pour le stockage des polices. La valeur passée est le pointeur d&amp;#039;opération pour ce système de fichiers. &lt;br /&gt;
                                                 //Vous pouvez la modifier.&lt;br /&gt;
	EPD.EPD_Set_Model(HINKE0266A15A0); 	   // Définit le type d&amp;#039;écran. Consultez la documentation pour les modèles spécifiques.&lt;br /&gt;
	EPD.EPD_init_Full(); 			// Initialisation du rafraîchissement complet, en utilisant la forme d&amp;#039;onde de rafraîchissement complet.&lt;br /&gt;
	EPD.clearbuffer(); 		       // Efface le tampon (écran blanc).&lt;br /&gt;
	EPD.fontscale = 2; 			// Facteur d&amp;#039;échelle des polices (1 et 2 pris en charge, également applicable aux images. &lt;br /&gt;
                                                //N&amp;#039;oubliez pas de le remettre à 1 après utilisation).&lt;br /&gt;
	EPD.SetFont(FONT12); 		       // Sélectionne la police. Consultez la documentation pour connaître les polices prises en charge.&lt;br /&gt;
	EPD.DrawUTF(0, 0, &amp;quot;Hello&amp;quot;); &amp;quot;World&amp;quot;); 	// Dessiner la chaîne&lt;br /&gt;
	EPD.DrawUTF(26, 0, &amp;quot;J&amp;#039;aime les écrans à encre électronique&amp;quot;); 	&lt;br /&gt;
                                                // Dessiner la chaîne&lt;br /&gt;
	EPD.fontscale = 1; 												                    // Rétablir le facteur d&amp;#039;échelle de la police à 1&lt;br /&gt;
	EPD.DrawXbm_P(60, 0, 12, 12, (uint8_t *)city_icon); 			// Dessiner l&amp;#039;image&lt;br /&gt;
&lt;br /&gt;
	Serial.printf(&amp;quot;Image tamponnée dessinée, prête pour un rafraîchissement complet\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Full((uint8_t *)EPD.EPDbuffer, 1); // Transmettre l&amp;#039;image tamponnée à la puce de contrôle de l&amp;#039;écran pour un rafraîchissement complet&lt;br /&gt;
	EPD.deepsleep(); // Mettre l&amp;#039;écran en veille&lt;br /&gt;
	Serial.println(&amp;quot;Rafraîchissement complet terminé&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	delay(5000);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_init_Part(); // Initialiser la partie Actualisation&lt;br /&gt;
	EPD.clearbuffer();&lt;br /&gt;
	EPD.fontscale = 2;&lt;br /&gt;
	EPD.SetFont(FONT12); EPD.DrawUTF(0, 0, &amp;quot;Actualisation locale activée&amp;quot;);&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale en cours\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Part(0, 23, 0, 199, (uint8_t *)EPD.EPDbuffer, 1); // Transfert de l&amp;#039;image du tampon vers la puce de contrôle d&amp;#039;écran pour l&amp;#039;actualisation locale sur le nouvel écran&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale terminée\n&amp;quot;);&lt;br /&gt;
	EPD.deepsleep();&lt;br /&gt;
&lt;br /&gt;
} void loop()&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	delay(1); // Empêcher le chien de garde de s&amp;#039;interrompre&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>178.197.195.126</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1904</id>
		<title>CrowPanel-ESP32-E-Paper-HMI-1.54</title>
		<link rel="alternate" type="text/html" href="https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1904"/>
		<updated>2025-11-26T19:19:50Z</updated>

		<summary type="html">&lt;p&gt;178.197.195.126: /* Code HelloWord */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== E-Paper-HMI-1.54 (Elecrow) ==&lt;br /&gt;
&lt;br /&gt;
=== Liens externes ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_HMI_1.54-inch_Display.html Wiki&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_1.54-inch_Arduino_Tutorial.html Arduino Setup&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/crowpanel-esp32-1-54-e-paper-hmi-display-with-152-152-resolution-black-white-color-driven-by-spi-interface.html Shop&lt;br /&gt;
&lt;br /&gt;
 BLE debugging assistant&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/1-54-inch-152-152-e-paper-display-black-white-e-ink-display-with-spi-communication.html&lt;br /&gt;
&lt;br /&gt;
=== Caractéristiques ===&lt;br /&gt;
&lt;br /&gt;
Driver Chip : &amp;lt;b&amp;gt;SSD1680&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Résolution 152 x 152&amp;lt;br&amp;gt;&lt;br /&gt;
Couleur noir et blanc&amp;lt;br&amp;gt;&lt;br /&gt;
Pilote ESP32-S3 comme contrôleur principal&amp;lt;br&amp;gt;&lt;br /&gt;
PSRAM : 8MB&amp;lt;br&amp;gt;&lt;br /&gt;
Flash :	8MB&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
[[File:E-Paper-HMI-1.54-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[File:E-Paper-HMI-1.54-2.png|300px]]&lt;br /&gt;
[[File:E-Paper-HMI-1.54-3.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/download/product/CrowPanel/E-paper/Image2Lcd_v2.9.zip Image2Lcd_v2.9&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152 GitHub&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152/archive/refs/heads/master.zip GitHub ZIP&lt;br /&gt;
&lt;br /&gt;
=== Arduine Mise en route (Setup) ===&lt;br /&gt;
&lt;br /&gt;
Click &amp;quot;Tools&amp;quot;-&amp;gt;&amp;quot;Board&amp;quot;-&amp;gt;&amp;quot;esp32&amp;quot;-&amp;gt;&amp;quot;ESP32S3 Dev Module&amp;quot;, &lt;br /&gt;
&lt;br /&gt;
and the &amp;quot;Partition Scheme&amp;quot; select &lt;br /&gt;
&amp;quot;Huge APP (3MB No OTA/1MB SPIFFS)&amp;quot;, &lt;br /&gt;
&amp;quot;PSRAM&amp;quot; select &amp;quot;OPI PSRAM&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Setup-Arduino-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Librairies ===&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;Arduino.h&amp;gt;   // Inclure la bibliothèque principale Arduino&lt;br /&gt;
 #include &amp;quot;EPD_GUI.h&amp;quot;   // Inclure la bibliothèque pour l&amp;#039;écran à encre électronique&lt;br /&gt;
 #include &amp;quot;Pic.h&amp;quot;       // Inclure la bibliothèque de fonctions personnalisées&lt;br /&gt;
 #include &amp;quot;FS.h&amp;quot;        // Bibliothèque du système de fichiers pour les opérations sur les fichiers&lt;br /&gt;
 #include &amp;quot;SPIFFS.h&amp;quot;    // Bibliothèque du système de fichiers SPIFFS pour la lecture et l&amp;#039;écriture de fichiers&lt;br /&gt;
 #include &amp;lt;WiFi.h&amp;gt;      // Bibliothèque WiFi pour la création et la gestion des connexions WiFi&lt;br /&gt;
 #include &amp;lt;Ticker.h&amp;gt;    // Bibliothèque de chronométrage&lt;br /&gt;
 #include &amp;lt;WebServer.h&amp;gt; // Bibliothèque de serveur Web pour la création d&amp;#039;un serveur HTTP&lt;br /&gt;
&lt;br /&gt;
=== Code Exemples ===&lt;br /&gt;
&lt;br /&gt;
Arduino Code for demos&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_WIFI_refresh.ino &amp;lt;b&amp;gt;Update via WiFi&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_ble_refresh.ino  &amp;lt;b&amp;gt;Update via Bluetooth&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi_http_openweather.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arduino Code for examples&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_PWR.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_BLE.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_key.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_Global_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_partial_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=smDFHRxDYdw&lt;br /&gt;
&lt;br /&gt;
=== Code wifi_http_openweather ===&lt;br /&gt;
&lt;br /&gt;
https://openweathermap.org/ Veuillez vous enregistrer afin de vous procurer votre OpenWeatherMap API key&lt;br /&gt;
&lt;br /&gt;
http://bulk.openweathermap.org/sample/ on trouve ici : city.list.json.gz, le countryCode de votre ville (variable city)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HTTPClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino_JSON.h&amp;gt;&lt;br /&gt;
#include &amp;quot;EPD_GUI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Pic.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Define an array for black and white image data, which serves as the buffer for the e-paper display.&lt;br /&gt;
// The size of the buffer is determined according to the resolution of the e-paper display.&lt;br /&gt;
uint8_t ImageBW[2888];&lt;br /&gt;
&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Variables related to timing and API calls.&lt;br /&gt;
// lastTime keeps track of the last time the API was called.&lt;br /&gt;
unsigned long lastTime = 0;&lt;br /&gt;
// timerDelay determines the time interval between API calls. For testing, it&amp;#039;s set to 10 seconds (10000 milliseconds).&lt;br /&gt;
// In a final application, this should be set according to the API call limits per hour/minute.&lt;br /&gt;
unsigned long timerDelay = 10000;&lt;br /&gt;
&lt;br /&gt;
// Variables related to JSON data.&lt;br /&gt;
// jsonBuffer stores the raw JSON data received from the API.&lt;br /&gt;
String jsonBuffer;&lt;br /&gt;
// httpResponseCode holds the response code from the HTTP request.&lt;br /&gt;
int httpResponseCode;&lt;br /&gt;
// myObject is a JSON variable that will hold the parsed JSON data.&lt;br /&gt;
JSONVar myObject;&lt;br /&gt;
&lt;br /&gt;
// Variables related to weather information.&lt;br /&gt;
// weather stores the main weather description.&lt;br /&gt;
String weather;&lt;br /&gt;
// temperature stores the temperature value.&lt;br /&gt;
String temperature;&lt;br /&gt;
// humidity stores the humidity value.&lt;br /&gt;
String humidity;&lt;br /&gt;
// sea_level stores the sea level value.&lt;br /&gt;
String sea_level;&lt;br /&gt;
// wind_speed stores the wind speed value.&lt;br /&gt;
String wind_speed;&lt;br /&gt;
// city_js stores the name of the city.&lt;br /&gt;
String city_js;&lt;br /&gt;
// weather_flag is a flag that determines which weather icon to display based on the weather description.&lt;br /&gt;
int weather_flag = 0;&lt;br /&gt;
&lt;br /&gt;
// Function to display weather forecast on the e-paper display.&lt;br /&gt;
void UI_weather_forecast()&lt;br /&gt;
{&lt;br /&gt;
  char buffer[40];&lt;br /&gt;
&lt;br /&gt;
  EPD_HW_RESET();&lt;br /&gt;
&lt;br /&gt;
  // Display a background picture on the e-paper.&lt;br /&gt;
  EPD_ShowPicture(0, 0, 152, 152, pic, BLACK);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Visit&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_visit, BLACK);&lt;br /&gt;
  //Wind&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_wind, BLACK);&lt;br /&gt;
  //Temp&lt;br /&gt;
  //  EPD_ShowPicture(92, 0, 56, 72, gImage_temp, BLACK);&lt;br /&gt;
  //Hum&lt;br /&gt;
&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 270, WHITE);&lt;br /&gt;
  // Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  // EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
&lt;br /&gt;
  // Display the update time (it seems to be mislabeled as city_js here, might need to be corrected depending on the actual intention).&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, city_js);&lt;br /&gt;
  EPD_ShowString(20, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Hum&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, humidity);&lt;br /&gt;
  EPD_ShowString(105, 140, buffer,  12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Temp&lt;br /&gt;
  //       memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //       snprintf(buffer, sizeof(buffer), &amp;quot;%s C&amp;quot;, temperature);&lt;br /&gt;
  //       EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Wind&lt;br /&gt;
  // memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  // snprintf(buffer, sizeof(buffer), &amp;quot;%s m/s&amp;quot;, wind_speed);&lt;br /&gt;
  // EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //visit&lt;br /&gt;
  //  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, sea_level);&lt;br /&gt;
  //  EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  // Update the e-paper display with the new content.&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200); // Initialize the serial communication.&lt;br /&gt;
&lt;br /&gt;
  // Connect to the WiFi network.&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
  Serial.println(&amp;quot;Connecting&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    delay(500);&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Connected to WiFi network with IP Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP()); // Print the IP address of the device after successful connection.&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Set pin 7 as an output pin to control the power of the e-paper display.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
  digitalWrite(7, HIGH);&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 0, WHITE);&lt;br /&gt;
  Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  js_analysis();&lt;br /&gt;
  UI_weather_forecast();&lt;br /&gt;
  delay(1000 * 60 * 60);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void js_analysis()&lt;br /&gt;
{&lt;br /&gt;
  // Check if the device is connected to the WiFi network.&lt;br /&gt;
  if (WiFi.status() == WL_CONNECTED) {&lt;br /&gt;
    // Construct the URL for the OpenWeatherMap API request.&lt;br /&gt;
    String serverPath = &amp;quot;http://api.openweathermap.org/data/2.5/weather?q=&amp;quot; + city + &amp;quot;,&amp;quot; + countryCode + &amp;quot;&amp;amp;APPID=&amp;quot; + openWeatherMapApiKey + &amp;quot;&amp;amp;units=metric&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // Keep trying until a successful response (status code 200) is received.&lt;br /&gt;
    while (httpResponseCode != 200) {&lt;br /&gt;
      // Make an HTTP GET request to the API and store the response in jsonBuffer.&lt;br /&gt;
      jsonBuffer = httpGETRequest(serverPath.c_str());&lt;br /&gt;
      Serial.println(jsonBuffer);&lt;br /&gt;
      myObject = JSON.parse(jsonBuffer);&lt;br /&gt;
&lt;br /&gt;
      // Check if the JSON parsing was successful.&lt;br /&gt;
      if (JSON.typeof(myObject) == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
        Serial.println(&amp;quot;Parsing input failed!&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      delay(2000);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Extract weather information from the parsed JSON data.&lt;br /&gt;
    weather = JSON.stringify(myObject[&amp;quot;weather&amp;quot;][0][&amp;quot;main&amp;quot;]);&lt;br /&gt;
    temperature = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;]);&lt;br /&gt;
    humidity = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;humidity&amp;quot;]);&lt;br /&gt;
    sea_level = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;sea_level&amp;quot;]);&lt;br /&gt;
    wind_speed = JSON.stringify(myObject[&amp;quot;wind&amp;quot;][&amp;quot;speed&amp;quot;]);&lt;br /&gt;
    city_js = JSON.stringify(myObject[&amp;quot;name&amp;quot;]);&lt;br /&gt;
&lt;br /&gt;
    // Print the extracted weather information for debugging purposes.&lt;br /&gt;
    Serial.print(&amp;quot;String weather: &amp;quot;);&lt;br /&gt;
    Serial.println(weather);&lt;br /&gt;
    Serial.print(&amp;quot;String Temperature: &amp;quot;);&lt;br /&gt;
    Serial.println(temperature);&lt;br /&gt;
    Serial.print(&amp;quot;String humidity: &amp;quot;);&lt;br /&gt;
    Serial.println(humidity);&lt;br /&gt;
    Serial.print(&amp;quot;String sea_level: &amp;quot;);&lt;br /&gt;
    Serial.println(sea_level);&lt;br /&gt;
    Serial.print(&amp;quot;String wind_speed: &amp;quot;);&lt;br /&gt;
    Serial.println(wind_speed);&lt;br /&gt;
    Serial.print(&amp;quot;String city_js: &amp;quot;);&lt;br /&gt;
    Serial.println(city_js);&lt;br /&gt;
&lt;br /&gt;
    // Determine the weather icon based on the weather description.&lt;br /&gt;
    if (weather.indexOf(&amp;quot;clouds&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clouds&amp;quot;) != -1 ) {&lt;br /&gt;
      weather_flag = 1;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;clear sky&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clear sky&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 3;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;rain&amp;quot;) != -1 || weather.indexOf(&amp;quot;Rain&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 5;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;thunderstorm&amp;quot;) != -1 || weather.indexOf(&amp;quot;Thunderstorm&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 2;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;snow&amp;quot;) != -1 || weather.indexOf(&amp;quot;Snow&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 4;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;mist&amp;quot;) != -1 || weather.indexOf(&amp;quot;Mist&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    // Print a message if the device is not connected to the WiFi network.&lt;br /&gt;
    Serial.println(&amp;quot;WiFi Disconnected&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Function to make an HTTP GET request and return the response.&lt;br /&gt;
String httpGETRequest(const char* serverName) {&lt;br /&gt;
  WiFiClient client;&lt;br /&gt;
  HTTPClient http;&lt;br /&gt;
&lt;br /&gt;
  // Initialize the HTTP client with the server name.&lt;br /&gt;
  http.begin(client, serverName);&lt;br /&gt;
&lt;br /&gt;
  // Send an HTTP GET request.&lt;br /&gt;
  httpResponseCode = http.GET();&lt;br /&gt;
&lt;br /&gt;
  // Initialize the response payload as an empty JSON object.&lt;br /&gt;
  String payload = &amp;quot;{}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  // Check if the response code is positive (indicating a successful request).&lt;br /&gt;
  if (httpResponseCode &amp;gt; 0) {&lt;br /&gt;
    Serial.print(&amp;quot;HTTP Response code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
    payload = http.getString();&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Serial.print(&amp;quot;Error code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Close the HTTP connection.&lt;br /&gt;
  http.end();&lt;br /&gt;
&lt;br /&gt;
  return payload;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Explications : Partie à modifier avec vos données, ssid, password, openWeatherMapApiKey, city, countryCode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code HelloWord ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
	* @file HelloWorld.ino&lt;br /&gt;
	* @author HalfSweet (Email:HalfSweet@HalfSweet.cn or QQ:2522182733)&lt;br /&gt;
	* @brief Ce fichier est un exemple de programme permettant d&amp;#039;afficher «Hello World» sur un écran à encre électronique. Il illustre uniquement la méthode la plus simple pour allumer l&amp;#039;écran. &lt;br /&gt;
        * Veuillez consulter la documentation pour connaître l&amp;#039;utilisation des différentes fonctions.&lt;br /&gt;
	* @version 0.1&lt;br /&gt;
	* @date 2022-01-30&lt;br /&gt;
	*&lt;br /&gt;
	* @copyright Copyright (c) 2022&lt;br /&gt;
	*&lt;br /&gt;
*/ &lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;EPaperDrive.h&amp;gt;&lt;br /&gt;
// Inclure le système de fichiers à utiliser, par exemple:&lt;br /&gt;
#include &amp;lt;LittleFS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUD_SPEED 74880 // Débit en bauds pour le débogage du port série, modifiable selon les besoins&lt;br /&gt;
&lt;br /&gt;
#define CS 15&lt;br /&gt;
#define RST 2&lt;br /&gt;
#define DC 0&lt;br /&gt;
#define BUSY 4&lt;br /&gt;
#define CLK 14&lt;br /&gt;
#define DIN 13&lt;br /&gt;
&lt;br /&gt;
EPaperDrive EPD(0, CS, RST, DC, BUSY, CLK, DIN); //Instanciation de la bibliothèque de pilotes, utilisant ici le protocole SPI logiciel&lt;br /&gt;
&lt;br /&gt;
const uint8_t city_icon[24] = {&lt;br /&gt;
	/* 0X01,0X01,0X0C,0X00,0X0C,0X00, */&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0X60,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0XC0,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
	void setup()&lt;br /&gt;
	{&lt;br /&gt;
	Serial.begin(BAUD_SPEED);&lt;br /&gt;
	LittleFS.begin(); 			  // Veuillez initialiser manuellement le système de fichiers avant de passer le pointeur.&lt;br /&gt;
&lt;br /&gt;
	EPD.SetFS(&amp;amp;LittleFS); 			    // Définit le système de fichiers pour le stockage des polices. La valeur passée est le pointeur d&amp;#039;opération pour ce système de fichiers. &lt;br /&gt;
                                                   //Vous pouvez la modifier.&lt;br /&gt;
	EPD.EPD_Set_Model(HINKE0266A15A0); 	   // Définit le type d&amp;#039;écran. Consultez la documentation pour les modèles spécifiques.&lt;br /&gt;
	EPD.EPD_init_Full(); 			// Initialisation du rafraîchissement complet, en utilisant la forme d&amp;#039;onde de rafraîchissement complet.&lt;br /&gt;
	EPD.clearbuffer(); 			// Efface le tampon (écran blanc).&lt;br /&gt;
	EPD.fontscale = 2; 			// Facteur d&amp;#039;échelle des polices (1 et 2 pris en charge, également applicable aux images. &lt;br /&gt;
                                                //N&amp;#039;oubliez pas de le remettre à 1 après utilisation).&lt;br /&gt;
	EPD.SetFont(FONT12); 		       // Sélectionne la police. Consultez la documentation pour connaître les polices prises en charge.&lt;br /&gt;
	EPD.DrawUTF(0, 0, &amp;quot;Hello&amp;quot;); &amp;quot;World&amp;quot;); 	// Dessiner la chaîne&lt;br /&gt;
	EPD.DrawUTF(26, 0, &amp;quot;J&amp;#039;aime les écrans à encre électronique&amp;quot;); 	&lt;br /&gt;
                                                // Dessiner la chaîne&lt;br /&gt;
	EPD.fontscale = 1; 												                    // Rétablir le facteur d&amp;#039;échelle de la police à 1&lt;br /&gt;
	EPD.DrawXbm_P(60, 0, 12, 12, (uint8_t *)city_icon); 			// Dessiner l&amp;#039;image&lt;br /&gt;
&lt;br /&gt;
	Serial.printf(&amp;quot;Image tamponnée dessinée, prête pour un rafraîchissement complet\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Full((uint8_t *)EPD.EPDbuffer, 1); // Transmettre l&amp;#039;image tamponnée à la puce de contrôle de l&amp;#039;écran pour un rafraîchissement complet&lt;br /&gt;
	EPD.deepsleep(); // Mettre l&amp;#039;écran en veille&lt;br /&gt;
	Serial.println(&amp;quot;Rafraîchissement complet terminé&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	delay(5000);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_init_Part(); // Initialiser la partie Actualisation&lt;br /&gt;
	EPD.clearbuffer();&lt;br /&gt;
	EPD.fontscale = 2;&lt;br /&gt;
	EPD.SetFont(FONT12); EPD.DrawUTF(0, 0, &amp;quot;Actualisation locale activée&amp;quot;);&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale en cours\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Part(0, 23, 0, 199, (uint8_t *)EPD.EPDbuffer, 1); // Transfert de l&amp;#039;image du tampon vers la puce de contrôle d&amp;#039;écran pour l&amp;#039;actualisation locale sur le nouvel écran&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale terminée\n&amp;quot;);&lt;br /&gt;
	EPD.deepsleep();&lt;br /&gt;
&lt;br /&gt;
} void loop()&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	delay(1); // Empêcher le chien de garde de s&amp;#039;interrompre&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>178.197.195.126</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1903</id>
		<title>CrowPanel-ESP32-E-Paper-HMI-1.54</title>
		<link rel="alternate" type="text/html" href="https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1903"/>
		<updated>2025-11-26T19:19:01Z</updated>

		<summary type="html">&lt;p&gt;178.197.195.126: /* Code HelloWord */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== E-Paper-HMI-1.54 (Elecrow) ==&lt;br /&gt;
&lt;br /&gt;
=== Liens externes ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_HMI_1.54-inch_Display.html Wiki&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_1.54-inch_Arduino_Tutorial.html Arduino Setup&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/crowpanel-esp32-1-54-e-paper-hmi-display-with-152-152-resolution-black-white-color-driven-by-spi-interface.html Shop&lt;br /&gt;
&lt;br /&gt;
 BLE debugging assistant&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/1-54-inch-152-152-e-paper-display-black-white-e-ink-display-with-spi-communication.html&lt;br /&gt;
&lt;br /&gt;
=== Caractéristiques ===&lt;br /&gt;
&lt;br /&gt;
Driver Chip : &amp;lt;b&amp;gt;SSD1680&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Résolution 152 x 152&amp;lt;br&amp;gt;&lt;br /&gt;
Couleur noir et blanc&amp;lt;br&amp;gt;&lt;br /&gt;
Pilote ESP32-S3 comme contrôleur principal&amp;lt;br&amp;gt;&lt;br /&gt;
PSRAM : 8MB&amp;lt;br&amp;gt;&lt;br /&gt;
Flash :	8MB&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
[[File:E-Paper-HMI-1.54-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[File:E-Paper-HMI-1.54-2.png|300px]]&lt;br /&gt;
[[File:E-Paper-HMI-1.54-3.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/download/product/CrowPanel/E-paper/Image2Lcd_v2.9.zip Image2Lcd_v2.9&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152 GitHub&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152/archive/refs/heads/master.zip GitHub ZIP&lt;br /&gt;
&lt;br /&gt;
=== Arduine Mise en route (Setup) ===&lt;br /&gt;
&lt;br /&gt;
Click &amp;quot;Tools&amp;quot;-&amp;gt;&amp;quot;Board&amp;quot;-&amp;gt;&amp;quot;esp32&amp;quot;-&amp;gt;&amp;quot;ESP32S3 Dev Module&amp;quot;, &lt;br /&gt;
&lt;br /&gt;
and the &amp;quot;Partition Scheme&amp;quot; select &lt;br /&gt;
&amp;quot;Huge APP (3MB No OTA/1MB SPIFFS)&amp;quot;, &lt;br /&gt;
&amp;quot;PSRAM&amp;quot; select &amp;quot;OPI PSRAM&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Setup-Arduino-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Librairies ===&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;Arduino.h&amp;gt;   // Inclure la bibliothèque principale Arduino&lt;br /&gt;
 #include &amp;quot;EPD_GUI.h&amp;quot;   // Inclure la bibliothèque pour l&amp;#039;écran à encre électronique&lt;br /&gt;
 #include &amp;quot;Pic.h&amp;quot;       // Inclure la bibliothèque de fonctions personnalisées&lt;br /&gt;
 #include &amp;quot;FS.h&amp;quot;        // Bibliothèque du système de fichiers pour les opérations sur les fichiers&lt;br /&gt;
 #include &amp;quot;SPIFFS.h&amp;quot;    // Bibliothèque du système de fichiers SPIFFS pour la lecture et l&amp;#039;écriture de fichiers&lt;br /&gt;
 #include &amp;lt;WiFi.h&amp;gt;      // Bibliothèque WiFi pour la création et la gestion des connexions WiFi&lt;br /&gt;
 #include &amp;lt;Ticker.h&amp;gt;    // Bibliothèque de chronométrage&lt;br /&gt;
 #include &amp;lt;WebServer.h&amp;gt; // Bibliothèque de serveur Web pour la création d&amp;#039;un serveur HTTP&lt;br /&gt;
&lt;br /&gt;
=== Code Exemples ===&lt;br /&gt;
&lt;br /&gt;
Arduino Code for demos&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_WIFI_refresh.ino &amp;lt;b&amp;gt;Update via WiFi&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_ble_refresh.ino  &amp;lt;b&amp;gt;Update via Bluetooth&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi_http_openweather.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arduino Code for examples&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_PWR.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_BLE.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_key.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_Global_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_partial_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=smDFHRxDYdw&lt;br /&gt;
&lt;br /&gt;
=== Code wifi_http_openweather ===&lt;br /&gt;
&lt;br /&gt;
https://openweathermap.org/ Veuillez vous enregistrer afin de vous procurer votre OpenWeatherMap API key&lt;br /&gt;
&lt;br /&gt;
http://bulk.openweathermap.org/sample/ on trouve ici : city.list.json.gz, le countryCode de votre ville (variable city)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HTTPClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino_JSON.h&amp;gt;&lt;br /&gt;
#include &amp;quot;EPD_GUI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Pic.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Define an array for black and white image data, which serves as the buffer for the e-paper display.&lt;br /&gt;
// The size of the buffer is determined according to the resolution of the e-paper display.&lt;br /&gt;
uint8_t ImageBW[2888];&lt;br /&gt;
&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Variables related to timing and API calls.&lt;br /&gt;
// lastTime keeps track of the last time the API was called.&lt;br /&gt;
unsigned long lastTime = 0;&lt;br /&gt;
// timerDelay determines the time interval between API calls. For testing, it&amp;#039;s set to 10 seconds (10000 milliseconds).&lt;br /&gt;
// In a final application, this should be set according to the API call limits per hour/minute.&lt;br /&gt;
unsigned long timerDelay = 10000;&lt;br /&gt;
&lt;br /&gt;
// Variables related to JSON data.&lt;br /&gt;
// jsonBuffer stores the raw JSON data received from the API.&lt;br /&gt;
String jsonBuffer;&lt;br /&gt;
// httpResponseCode holds the response code from the HTTP request.&lt;br /&gt;
int httpResponseCode;&lt;br /&gt;
// myObject is a JSON variable that will hold the parsed JSON data.&lt;br /&gt;
JSONVar myObject;&lt;br /&gt;
&lt;br /&gt;
// Variables related to weather information.&lt;br /&gt;
// weather stores the main weather description.&lt;br /&gt;
String weather;&lt;br /&gt;
// temperature stores the temperature value.&lt;br /&gt;
String temperature;&lt;br /&gt;
// humidity stores the humidity value.&lt;br /&gt;
String humidity;&lt;br /&gt;
// sea_level stores the sea level value.&lt;br /&gt;
String sea_level;&lt;br /&gt;
// wind_speed stores the wind speed value.&lt;br /&gt;
String wind_speed;&lt;br /&gt;
// city_js stores the name of the city.&lt;br /&gt;
String city_js;&lt;br /&gt;
// weather_flag is a flag that determines which weather icon to display based on the weather description.&lt;br /&gt;
int weather_flag = 0;&lt;br /&gt;
&lt;br /&gt;
// Function to display weather forecast on the e-paper display.&lt;br /&gt;
void UI_weather_forecast()&lt;br /&gt;
{&lt;br /&gt;
  char buffer[40];&lt;br /&gt;
&lt;br /&gt;
  EPD_HW_RESET();&lt;br /&gt;
&lt;br /&gt;
  // Display a background picture on the e-paper.&lt;br /&gt;
  EPD_ShowPicture(0, 0, 152, 152, pic, BLACK);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Visit&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_visit, BLACK);&lt;br /&gt;
  //Wind&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_wind, BLACK);&lt;br /&gt;
  //Temp&lt;br /&gt;
  //  EPD_ShowPicture(92, 0, 56, 72, gImage_temp, BLACK);&lt;br /&gt;
  //Hum&lt;br /&gt;
&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 270, WHITE);&lt;br /&gt;
  // Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  // EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
&lt;br /&gt;
  // Display the update time (it seems to be mislabeled as city_js here, might need to be corrected depending on the actual intention).&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, city_js);&lt;br /&gt;
  EPD_ShowString(20, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Hum&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, humidity);&lt;br /&gt;
  EPD_ShowString(105, 140, buffer,  12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Temp&lt;br /&gt;
  //       memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //       snprintf(buffer, sizeof(buffer), &amp;quot;%s C&amp;quot;, temperature);&lt;br /&gt;
  //       EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Wind&lt;br /&gt;
  // memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  // snprintf(buffer, sizeof(buffer), &amp;quot;%s m/s&amp;quot;, wind_speed);&lt;br /&gt;
  // EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //visit&lt;br /&gt;
  //  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, sea_level);&lt;br /&gt;
  //  EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  // Update the e-paper display with the new content.&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200); // Initialize the serial communication.&lt;br /&gt;
&lt;br /&gt;
  // Connect to the WiFi network.&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
  Serial.println(&amp;quot;Connecting&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    delay(500);&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Connected to WiFi network with IP Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP()); // Print the IP address of the device after successful connection.&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Set pin 7 as an output pin to control the power of the e-paper display.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
  digitalWrite(7, HIGH);&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 0, WHITE);&lt;br /&gt;
  Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  js_analysis();&lt;br /&gt;
  UI_weather_forecast();&lt;br /&gt;
  delay(1000 * 60 * 60);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void js_analysis()&lt;br /&gt;
{&lt;br /&gt;
  // Check if the device is connected to the WiFi network.&lt;br /&gt;
  if (WiFi.status() == WL_CONNECTED) {&lt;br /&gt;
    // Construct the URL for the OpenWeatherMap API request.&lt;br /&gt;
    String serverPath = &amp;quot;http://api.openweathermap.org/data/2.5/weather?q=&amp;quot; + city + &amp;quot;,&amp;quot; + countryCode + &amp;quot;&amp;amp;APPID=&amp;quot; + openWeatherMapApiKey + &amp;quot;&amp;amp;units=metric&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // Keep trying until a successful response (status code 200) is received.&lt;br /&gt;
    while (httpResponseCode != 200) {&lt;br /&gt;
      // Make an HTTP GET request to the API and store the response in jsonBuffer.&lt;br /&gt;
      jsonBuffer = httpGETRequest(serverPath.c_str());&lt;br /&gt;
      Serial.println(jsonBuffer);&lt;br /&gt;
      myObject = JSON.parse(jsonBuffer);&lt;br /&gt;
&lt;br /&gt;
      // Check if the JSON parsing was successful.&lt;br /&gt;
      if (JSON.typeof(myObject) == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
        Serial.println(&amp;quot;Parsing input failed!&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      delay(2000);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Extract weather information from the parsed JSON data.&lt;br /&gt;
    weather = JSON.stringify(myObject[&amp;quot;weather&amp;quot;][0][&amp;quot;main&amp;quot;]);&lt;br /&gt;
    temperature = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;]);&lt;br /&gt;
    humidity = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;humidity&amp;quot;]);&lt;br /&gt;
    sea_level = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;sea_level&amp;quot;]);&lt;br /&gt;
    wind_speed = JSON.stringify(myObject[&amp;quot;wind&amp;quot;][&amp;quot;speed&amp;quot;]);&lt;br /&gt;
    city_js = JSON.stringify(myObject[&amp;quot;name&amp;quot;]);&lt;br /&gt;
&lt;br /&gt;
    // Print the extracted weather information for debugging purposes.&lt;br /&gt;
    Serial.print(&amp;quot;String weather: &amp;quot;);&lt;br /&gt;
    Serial.println(weather);&lt;br /&gt;
    Serial.print(&amp;quot;String Temperature: &amp;quot;);&lt;br /&gt;
    Serial.println(temperature);&lt;br /&gt;
    Serial.print(&amp;quot;String humidity: &amp;quot;);&lt;br /&gt;
    Serial.println(humidity);&lt;br /&gt;
    Serial.print(&amp;quot;String sea_level: &amp;quot;);&lt;br /&gt;
    Serial.println(sea_level);&lt;br /&gt;
    Serial.print(&amp;quot;String wind_speed: &amp;quot;);&lt;br /&gt;
    Serial.println(wind_speed);&lt;br /&gt;
    Serial.print(&amp;quot;String city_js: &amp;quot;);&lt;br /&gt;
    Serial.println(city_js);&lt;br /&gt;
&lt;br /&gt;
    // Determine the weather icon based on the weather description.&lt;br /&gt;
    if (weather.indexOf(&amp;quot;clouds&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clouds&amp;quot;) != -1 ) {&lt;br /&gt;
      weather_flag = 1;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;clear sky&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clear sky&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 3;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;rain&amp;quot;) != -1 || weather.indexOf(&amp;quot;Rain&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 5;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;thunderstorm&amp;quot;) != -1 || weather.indexOf(&amp;quot;Thunderstorm&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 2;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;snow&amp;quot;) != -1 || weather.indexOf(&amp;quot;Snow&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 4;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;mist&amp;quot;) != -1 || weather.indexOf(&amp;quot;Mist&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    // Print a message if the device is not connected to the WiFi network.&lt;br /&gt;
    Serial.println(&amp;quot;WiFi Disconnected&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Function to make an HTTP GET request and return the response.&lt;br /&gt;
String httpGETRequest(const char* serverName) {&lt;br /&gt;
  WiFiClient client;&lt;br /&gt;
  HTTPClient http;&lt;br /&gt;
&lt;br /&gt;
  // Initialize the HTTP client with the server name.&lt;br /&gt;
  http.begin(client, serverName);&lt;br /&gt;
&lt;br /&gt;
  // Send an HTTP GET request.&lt;br /&gt;
  httpResponseCode = http.GET();&lt;br /&gt;
&lt;br /&gt;
  // Initialize the response payload as an empty JSON object.&lt;br /&gt;
  String payload = &amp;quot;{}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  // Check if the response code is positive (indicating a successful request).&lt;br /&gt;
  if (httpResponseCode &amp;gt; 0) {&lt;br /&gt;
    Serial.print(&amp;quot;HTTP Response code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
    payload = http.getString();&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Serial.print(&amp;quot;Error code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Close the HTTP connection.&lt;br /&gt;
  http.end();&lt;br /&gt;
&lt;br /&gt;
  return payload;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Explications : Partie à modifier avec vos données, ssid, password, openWeatherMapApiKey, city, countryCode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code HelloWord ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
	* @file HelloWorld.ino&lt;br /&gt;
	* @author HalfSweet (Email:HalfSweet@HalfSweet.cn or QQ:2522182733)&lt;br /&gt;
	* @brief Ce fichier est un exemple de programme permettant d&amp;#039;afficher «Hello World» sur un écran à encre électronique. Il illustre uniquement la méthode la plus simple pour allumer l&amp;#039;écran. &lt;br /&gt;
        * Veuillez consulter la documentation pour connaître l&amp;#039;utilisation des différentes fonctions.&lt;br /&gt;
	* @version 0.1&lt;br /&gt;
	* @date 2022-01-30&lt;br /&gt;
	*&lt;br /&gt;
	* @copyright Copyright (c) 2022&lt;br /&gt;
	*&lt;br /&gt;
*/ &lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;EPaperDrive.h&amp;gt;&lt;br /&gt;
// Inclure le système de fichiers à utiliser, par exemple:&lt;br /&gt;
#include &amp;lt;LittleFS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUD_SPEED 74880 // Débit en bauds pour le débogage du port série, modifiable selon les besoins&lt;br /&gt;
&lt;br /&gt;
#define CS 15&lt;br /&gt;
#define RST 2&lt;br /&gt;
#define DC 0&lt;br /&gt;
#define BUSY 4&lt;br /&gt;
#define CLK 14&lt;br /&gt;
#define DIN 13&lt;br /&gt;
&lt;br /&gt;
EPaperDrive EPD(0, CS, RST, DC, BUSY, CLK, DIN); //Instanciation de la bibliothèque de pilotes, utilisant ici le protocole SPI logiciel&lt;br /&gt;
&lt;br /&gt;
const uint8_t city_icon[24] = {&lt;br /&gt;
	/* 0X01,0X01,0X0C,0X00,0X0C,0X00, */&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0X60,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0XC0,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
	void setup()&lt;br /&gt;
	{&lt;br /&gt;
	Serial.begin(BAUD_SPEED);&lt;br /&gt;
	LittleFS.begin(); 			    // Veuillez initialiser manuellement le système de fichiers avant de passer le pointeur.&lt;br /&gt;
&lt;br /&gt;
	EPD.SetFS(&amp;amp;LittleFS); 			    // Définit le système de fichiers pour le stockage des polices. La valeur passée est le pointeur d&amp;#039;opération pour ce système de fichiers. &lt;br /&gt;
                                                   //Vous pouvez la modifier.&lt;br /&gt;
	EPD.EPD_Set_Model(HINKE0266A15A0); 	   // Définit le type d&amp;#039;écran. Consultez la documentation pour les modèles spécifiques.&lt;br /&gt;
	EPD.EPD_init_Full(); 			// Initialisation du rafraîchissement complet, en utilisant la forme d&amp;#039;onde de rafraîchissement complet.&lt;br /&gt;
	EPD.clearbuffer(); 			// Efface le tampon (écran blanc).&lt;br /&gt;
	EPD.fontscale = 2; 			// Facteur d&amp;#039;échelle des polices (1 et 2 pris en charge, également applicable aux images. &lt;br /&gt;
                                                //N&amp;#039;oubliez pas de le remettre à 1 après utilisation).&lt;br /&gt;
	EPD.SetFont(FONT12); 		       // Sélectionne la police. Consultez la documentation pour connaître les polices prises en charge.&lt;br /&gt;
	EPD.DrawUTF(0, 0, &amp;quot;Hello&amp;quot;); &amp;quot;World&amp;quot;); 	// Dessiner la chaîne&lt;br /&gt;
	EPD.DrawUTF(26, 0, &amp;quot;J&amp;#039;aime les écrans à encre électronique&amp;quot;); 	&lt;br /&gt;
                                                // Dessiner la chaîne&lt;br /&gt;
	EPD.fontscale = 1; 												                    // Rétablir le facteur d&amp;#039;échelle de la police à 1&lt;br /&gt;
	EPD.DrawXbm_P(60, 0, 12, 12, (uint8_t *)city_icon); 			// Dessiner l&amp;#039;image&lt;br /&gt;
&lt;br /&gt;
	Serial.printf(&amp;quot;Image tamponnée dessinée, prête pour un rafraîchissement complet\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Full((uint8_t *)EPD.EPDbuffer, 1); // Transmettre l&amp;#039;image tamponnée à la puce de contrôle de l&amp;#039;écran pour un rafraîchissement complet&lt;br /&gt;
	EPD.deepsleep(); // Mettre l&amp;#039;écran en veille&lt;br /&gt;
	Serial.println(&amp;quot;Rafraîchissement complet terminé&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	delay(5000);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_init_Part(); // Initialiser la partie Actualisation&lt;br /&gt;
	EPD.clearbuffer();&lt;br /&gt;
	EPD.fontscale = 2;&lt;br /&gt;
	EPD.SetFont(FONT12); EPD.DrawUTF(0, 0, &amp;quot;Actualisation locale activée&amp;quot;);&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale en cours\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Part(0, 23, 0, 199, (uint8_t *)EPD.EPDbuffer, 1); // Transfert de l&amp;#039;image du tampon vers la puce de contrôle d&amp;#039;écran pour l&amp;#039;actualisation locale sur le nouvel écran&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale terminée\n&amp;quot;);&lt;br /&gt;
	EPD.deepsleep();&lt;br /&gt;
&lt;br /&gt;
} void loop()&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	delay(1); // Empêcher le chien de garde de s&amp;#039;interrompre&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>178.197.195.126</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1902</id>
		<title>CrowPanel-ESP32-E-Paper-HMI-1.54</title>
		<link rel="alternate" type="text/html" href="https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1902"/>
		<updated>2025-11-26T19:16:55Z</updated>

		<summary type="html">&lt;p&gt;178.197.195.126: /* Code HelloWord */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== E-Paper-HMI-1.54 (Elecrow) ==&lt;br /&gt;
&lt;br /&gt;
=== Liens externes ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_HMI_1.54-inch_Display.html Wiki&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_1.54-inch_Arduino_Tutorial.html Arduino Setup&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/crowpanel-esp32-1-54-e-paper-hmi-display-with-152-152-resolution-black-white-color-driven-by-spi-interface.html Shop&lt;br /&gt;
&lt;br /&gt;
 BLE debugging assistant&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/1-54-inch-152-152-e-paper-display-black-white-e-ink-display-with-spi-communication.html&lt;br /&gt;
&lt;br /&gt;
=== Caractéristiques ===&lt;br /&gt;
&lt;br /&gt;
Driver Chip : &amp;lt;b&amp;gt;SSD1680&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Résolution 152 x 152&amp;lt;br&amp;gt;&lt;br /&gt;
Couleur noir et blanc&amp;lt;br&amp;gt;&lt;br /&gt;
Pilote ESP32-S3 comme contrôleur principal&amp;lt;br&amp;gt;&lt;br /&gt;
PSRAM : 8MB&amp;lt;br&amp;gt;&lt;br /&gt;
Flash :	8MB&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
[[File:E-Paper-HMI-1.54-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[File:E-Paper-HMI-1.54-2.png|300px]]&lt;br /&gt;
[[File:E-Paper-HMI-1.54-3.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/download/product/CrowPanel/E-paper/Image2Lcd_v2.9.zip Image2Lcd_v2.9&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152 GitHub&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152/archive/refs/heads/master.zip GitHub ZIP&lt;br /&gt;
&lt;br /&gt;
=== Arduine Mise en route (Setup) ===&lt;br /&gt;
&lt;br /&gt;
Click &amp;quot;Tools&amp;quot;-&amp;gt;&amp;quot;Board&amp;quot;-&amp;gt;&amp;quot;esp32&amp;quot;-&amp;gt;&amp;quot;ESP32S3 Dev Module&amp;quot;, &lt;br /&gt;
&lt;br /&gt;
and the &amp;quot;Partition Scheme&amp;quot; select &lt;br /&gt;
&amp;quot;Huge APP (3MB No OTA/1MB SPIFFS)&amp;quot;, &lt;br /&gt;
&amp;quot;PSRAM&amp;quot; select &amp;quot;OPI PSRAM&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Setup-Arduino-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Librairies ===&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;Arduino.h&amp;gt;   // Inclure la bibliothèque principale Arduino&lt;br /&gt;
 #include &amp;quot;EPD_GUI.h&amp;quot;   // Inclure la bibliothèque pour l&amp;#039;écran à encre électronique&lt;br /&gt;
 #include &amp;quot;Pic.h&amp;quot;       // Inclure la bibliothèque de fonctions personnalisées&lt;br /&gt;
 #include &amp;quot;FS.h&amp;quot;        // Bibliothèque du système de fichiers pour les opérations sur les fichiers&lt;br /&gt;
 #include &amp;quot;SPIFFS.h&amp;quot;    // Bibliothèque du système de fichiers SPIFFS pour la lecture et l&amp;#039;écriture de fichiers&lt;br /&gt;
 #include &amp;lt;WiFi.h&amp;gt;      // Bibliothèque WiFi pour la création et la gestion des connexions WiFi&lt;br /&gt;
 #include &amp;lt;Ticker.h&amp;gt;    // Bibliothèque de chronométrage&lt;br /&gt;
 #include &amp;lt;WebServer.h&amp;gt; // Bibliothèque de serveur Web pour la création d&amp;#039;un serveur HTTP&lt;br /&gt;
&lt;br /&gt;
=== Code Exemples ===&lt;br /&gt;
&lt;br /&gt;
Arduino Code for demos&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_WIFI_refresh.ino &amp;lt;b&amp;gt;Update via WiFi&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_ble_refresh.ino  &amp;lt;b&amp;gt;Update via Bluetooth&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi_http_openweather.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arduino Code for examples&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_PWR.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_BLE.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_key.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_Global_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_partial_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=smDFHRxDYdw&lt;br /&gt;
&lt;br /&gt;
=== Code wifi_http_openweather ===&lt;br /&gt;
&lt;br /&gt;
https://openweathermap.org/ Veuillez vous enregistrer afin de vous procurer votre OpenWeatherMap API key&lt;br /&gt;
&lt;br /&gt;
http://bulk.openweathermap.org/sample/ on trouve ici : city.list.json.gz, le countryCode de votre ville (variable city)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HTTPClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino_JSON.h&amp;gt;&lt;br /&gt;
#include &amp;quot;EPD_GUI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Pic.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Define an array for black and white image data, which serves as the buffer for the e-paper display.&lt;br /&gt;
// The size of the buffer is determined according to the resolution of the e-paper display.&lt;br /&gt;
uint8_t ImageBW[2888];&lt;br /&gt;
&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Variables related to timing and API calls.&lt;br /&gt;
// lastTime keeps track of the last time the API was called.&lt;br /&gt;
unsigned long lastTime = 0;&lt;br /&gt;
// timerDelay determines the time interval between API calls. For testing, it&amp;#039;s set to 10 seconds (10000 milliseconds).&lt;br /&gt;
// In a final application, this should be set according to the API call limits per hour/minute.&lt;br /&gt;
unsigned long timerDelay = 10000;&lt;br /&gt;
&lt;br /&gt;
// Variables related to JSON data.&lt;br /&gt;
// jsonBuffer stores the raw JSON data received from the API.&lt;br /&gt;
String jsonBuffer;&lt;br /&gt;
// httpResponseCode holds the response code from the HTTP request.&lt;br /&gt;
int httpResponseCode;&lt;br /&gt;
// myObject is a JSON variable that will hold the parsed JSON data.&lt;br /&gt;
JSONVar myObject;&lt;br /&gt;
&lt;br /&gt;
// Variables related to weather information.&lt;br /&gt;
// weather stores the main weather description.&lt;br /&gt;
String weather;&lt;br /&gt;
// temperature stores the temperature value.&lt;br /&gt;
String temperature;&lt;br /&gt;
// humidity stores the humidity value.&lt;br /&gt;
String humidity;&lt;br /&gt;
// sea_level stores the sea level value.&lt;br /&gt;
String sea_level;&lt;br /&gt;
// wind_speed stores the wind speed value.&lt;br /&gt;
String wind_speed;&lt;br /&gt;
// city_js stores the name of the city.&lt;br /&gt;
String city_js;&lt;br /&gt;
// weather_flag is a flag that determines which weather icon to display based on the weather description.&lt;br /&gt;
int weather_flag = 0;&lt;br /&gt;
&lt;br /&gt;
// Function to display weather forecast on the e-paper display.&lt;br /&gt;
void UI_weather_forecast()&lt;br /&gt;
{&lt;br /&gt;
  char buffer[40];&lt;br /&gt;
&lt;br /&gt;
  EPD_HW_RESET();&lt;br /&gt;
&lt;br /&gt;
  // Display a background picture on the e-paper.&lt;br /&gt;
  EPD_ShowPicture(0, 0, 152, 152, pic, BLACK);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Visit&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_visit, BLACK);&lt;br /&gt;
  //Wind&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_wind, BLACK);&lt;br /&gt;
  //Temp&lt;br /&gt;
  //  EPD_ShowPicture(92, 0, 56, 72, gImage_temp, BLACK);&lt;br /&gt;
  //Hum&lt;br /&gt;
&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 270, WHITE);&lt;br /&gt;
  // Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  // EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
&lt;br /&gt;
  // Display the update time (it seems to be mislabeled as city_js here, might need to be corrected depending on the actual intention).&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, city_js);&lt;br /&gt;
  EPD_ShowString(20, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Hum&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, humidity);&lt;br /&gt;
  EPD_ShowString(105, 140, buffer,  12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Temp&lt;br /&gt;
  //       memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //       snprintf(buffer, sizeof(buffer), &amp;quot;%s C&amp;quot;, temperature);&lt;br /&gt;
  //       EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Wind&lt;br /&gt;
  // memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  // snprintf(buffer, sizeof(buffer), &amp;quot;%s m/s&amp;quot;, wind_speed);&lt;br /&gt;
  // EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //visit&lt;br /&gt;
  //  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, sea_level);&lt;br /&gt;
  //  EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  // Update the e-paper display with the new content.&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200); // Initialize the serial communication.&lt;br /&gt;
&lt;br /&gt;
  // Connect to the WiFi network.&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
  Serial.println(&amp;quot;Connecting&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    delay(500);&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Connected to WiFi network with IP Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP()); // Print the IP address of the device after successful connection.&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Set pin 7 as an output pin to control the power of the e-paper display.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
  digitalWrite(7, HIGH);&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 0, WHITE);&lt;br /&gt;
  Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  js_analysis();&lt;br /&gt;
  UI_weather_forecast();&lt;br /&gt;
  delay(1000 * 60 * 60);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void js_analysis()&lt;br /&gt;
{&lt;br /&gt;
  // Check if the device is connected to the WiFi network.&lt;br /&gt;
  if (WiFi.status() == WL_CONNECTED) {&lt;br /&gt;
    // Construct the URL for the OpenWeatherMap API request.&lt;br /&gt;
    String serverPath = &amp;quot;http://api.openweathermap.org/data/2.5/weather?q=&amp;quot; + city + &amp;quot;,&amp;quot; + countryCode + &amp;quot;&amp;amp;APPID=&amp;quot; + openWeatherMapApiKey + &amp;quot;&amp;amp;units=metric&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // Keep trying until a successful response (status code 200) is received.&lt;br /&gt;
    while (httpResponseCode != 200) {&lt;br /&gt;
      // Make an HTTP GET request to the API and store the response in jsonBuffer.&lt;br /&gt;
      jsonBuffer = httpGETRequest(serverPath.c_str());&lt;br /&gt;
      Serial.println(jsonBuffer);&lt;br /&gt;
      myObject = JSON.parse(jsonBuffer);&lt;br /&gt;
&lt;br /&gt;
      // Check if the JSON parsing was successful.&lt;br /&gt;
      if (JSON.typeof(myObject) == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
        Serial.println(&amp;quot;Parsing input failed!&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      delay(2000);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Extract weather information from the parsed JSON data.&lt;br /&gt;
    weather = JSON.stringify(myObject[&amp;quot;weather&amp;quot;][0][&amp;quot;main&amp;quot;]);&lt;br /&gt;
    temperature = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;]);&lt;br /&gt;
    humidity = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;humidity&amp;quot;]);&lt;br /&gt;
    sea_level = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;sea_level&amp;quot;]);&lt;br /&gt;
    wind_speed = JSON.stringify(myObject[&amp;quot;wind&amp;quot;][&amp;quot;speed&amp;quot;]);&lt;br /&gt;
    city_js = JSON.stringify(myObject[&amp;quot;name&amp;quot;]);&lt;br /&gt;
&lt;br /&gt;
    // Print the extracted weather information for debugging purposes.&lt;br /&gt;
    Serial.print(&amp;quot;String weather: &amp;quot;);&lt;br /&gt;
    Serial.println(weather);&lt;br /&gt;
    Serial.print(&amp;quot;String Temperature: &amp;quot;);&lt;br /&gt;
    Serial.println(temperature);&lt;br /&gt;
    Serial.print(&amp;quot;String humidity: &amp;quot;);&lt;br /&gt;
    Serial.println(humidity);&lt;br /&gt;
    Serial.print(&amp;quot;String sea_level: &amp;quot;);&lt;br /&gt;
    Serial.println(sea_level);&lt;br /&gt;
    Serial.print(&amp;quot;String wind_speed: &amp;quot;);&lt;br /&gt;
    Serial.println(wind_speed);&lt;br /&gt;
    Serial.print(&amp;quot;String city_js: &amp;quot;);&lt;br /&gt;
    Serial.println(city_js);&lt;br /&gt;
&lt;br /&gt;
    // Determine the weather icon based on the weather description.&lt;br /&gt;
    if (weather.indexOf(&amp;quot;clouds&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clouds&amp;quot;) != -1 ) {&lt;br /&gt;
      weather_flag = 1;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;clear sky&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clear sky&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 3;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;rain&amp;quot;) != -1 || weather.indexOf(&amp;quot;Rain&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 5;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;thunderstorm&amp;quot;) != -1 || weather.indexOf(&amp;quot;Thunderstorm&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 2;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;snow&amp;quot;) != -1 || weather.indexOf(&amp;quot;Snow&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 4;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;mist&amp;quot;) != -1 || weather.indexOf(&amp;quot;Mist&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    // Print a message if the device is not connected to the WiFi network.&lt;br /&gt;
    Serial.println(&amp;quot;WiFi Disconnected&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Function to make an HTTP GET request and return the response.&lt;br /&gt;
String httpGETRequest(const char* serverName) {&lt;br /&gt;
  WiFiClient client;&lt;br /&gt;
  HTTPClient http;&lt;br /&gt;
&lt;br /&gt;
  // Initialize the HTTP client with the server name.&lt;br /&gt;
  http.begin(client, serverName);&lt;br /&gt;
&lt;br /&gt;
  // Send an HTTP GET request.&lt;br /&gt;
  httpResponseCode = http.GET();&lt;br /&gt;
&lt;br /&gt;
  // Initialize the response payload as an empty JSON object.&lt;br /&gt;
  String payload = &amp;quot;{}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  // Check if the response code is positive (indicating a successful request).&lt;br /&gt;
  if (httpResponseCode &amp;gt; 0) {&lt;br /&gt;
    Serial.print(&amp;quot;HTTP Response code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
    payload = http.getString();&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Serial.print(&amp;quot;Error code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Close the HTTP connection.&lt;br /&gt;
  http.end();&lt;br /&gt;
&lt;br /&gt;
  return payload;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Explications : Partie à modifier avec vos données, ssid, password, openWeatherMapApiKey, city, countryCode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code HelloWord ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
	* @file HelloWorld.ino&lt;br /&gt;
	* @author HalfSweet (Email:HalfSweet@HalfSweet.cn or QQ:2522182733)&lt;br /&gt;
	* @brief Ce fichier est un exemple de programme permettant d&amp;#039;afficher «Hello World» sur un écran à encre électronique. Il illustre uniquement la méthode la plus simple pour allumer l&amp;#039;écran. &lt;br /&gt;
        * Veuillez consulter la documentation pour connaître l&amp;#039;utilisation des différentes fonctions.&lt;br /&gt;
	* @version 0.1&lt;br /&gt;
	* @date 2022-01-30&lt;br /&gt;
	*&lt;br /&gt;
	* @copyright Copyright (c) 2022&lt;br /&gt;
	*&lt;br /&gt;
*/ &lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;EPaperDrive.h&amp;gt;&lt;br /&gt;
// Inclure le système de fichiers à utiliser, par exemple:&lt;br /&gt;
#include &amp;lt;LittleFS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUD_SPEED 74880 // Débit en bauds pour le débogage du port série, modifiable selon les besoins&lt;br /&gt;
&lt;br /&gt;
#define CS 15&lt;br /&gt;
#define RST 2&lt;br /&gt;
#define DC 0&lt;br /&gt;
#define BUSY 4&lt;br /&gt;
#define CLK 14&lt;br /&gt;
#define DIN 13&lt;br /&gt;
&lt;br /&gt;
EPaperDrive EPD(0, CS, RST, DC, BUSY, CLK, DIN); //Instanciation de la bibliothèque de pilotes, utilisant ici le protocole SPI logiciel&lt;br /&gt;
&lt;br /&gt;
const uint8_t city_icon[24] = {&lt;br /&gt;
	/* 0X01,0X01,0X0C,0X00,0X0C,0X00, */&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0X60,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0XC0,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
	void setup()&lt;br /&gt;
	{&lt;br /&gt;
	Serial.begin(BAUD_SPEED);&lt;br /&gt;
	LittleFS.begin(); 			    // Veuillez initialiser manuellement le système de fichiers avant de passer le pointeur.&lt;br /&gt;
&lt;br /&gt;
	EPD.SetFS(&amp;amp;LittleFS); 			     // Définit le système de fichiers pour le stockage des polices. La valeur passée est le pointeur d&amp;#039;opération pour ce système de fichiers. &lt;br /&gt;
                                                    //Vous pouvez la modifier.&lt;br /&gt;
	EPD.EPD_Set_Model(HINKE0266A15A0); 	    // Définit le type d&amp;#039;écran. Consultez la documentation pour les modèles spécifiques.&lt;br /&gt;
	EPD.EPD_init_Full(); 					// Initialisation du rafraîchissement complet, en utilisant la forme d&amp;#039;onde de rafraîchissement complet.&lt;br /&gt;
	EPD.clearbuffer(); 						// Efface le tampon (écran blanc).&lt;br /&gt;
	EPD.fontscale = 2; 						// Facteur d&amp;#039;échelle des polices (1 et 2 pris en charge, également applicable aux images. N&amp;#039;oubliez pas de le remettre à 1 après utilisation).&lt;br /&gt;
	EPD.SetFont(FONT12); 					// Sélectionne la police. Consultez la documentation pour connaître les polices prises en charge.&lt;br /&gt;
	EPD.DrawUTF(0, 0, &amp;quot;Hello&amp;quot;); &amp;quot;World&amp;quot;); 	// Dessiner la chaîne&lt;br /&gt;
	EPD.DrawUTF(26, 0, &amp;quot;J&amp;#039;aime les écrans à encre électronique&amp;quot;); 	// Dessiner la chaîne&lt;br /&gt;
	EPD.fontscale = 1; 												// Rétablir le facteur d&amp;#039;échelle de la police à 1&lt;br /&gt;
	EPD.DrawXbm_P(60, 0, 12, 12, (uint8_t *)city_icon); 			// Dessiner l&amp;#039;image&lt;br /&gt;
&lt;br /&gt;
	Serial.printf(&amp;quot;Image tamponnée dessinée, prête pour un rafraîchissement complet\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Full((uint8_t *)EPD.EPDbuffer, 1); // Transmettre l&amp;#039;image tamponnée à la puce de contrôle de l&amp;#039;écran pour un rafraîchissement complet&lt;br /&gt;
	EPD.deepsleep(); // Mettre l&amp;#039;écran en veille&lt;br /&gt;
	Serial.println(&amp;quot;Rafraîchissement complet terminé&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	delay(5000);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_init_Part(); // Initialiser la partie Actualisation&lt;br /&gt;
	EPD.clearbuffer();&lt;br /&gt;
	EPD.fontscale = 2;&lt;br /&gt;
	EPD.SetFont(FONT12); EPD.DrawUTF(0, 0, &amp;quot;Actualisation locale activée&amp;quot;);&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale en cours\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Part(0, 23, 0, 199, (uint8_t *)EPD.EPDbuffer, 1); // Transfert de l&amp;#039;image du tampon vers la puce de contrôle d&amp;#039;écran pour l&amp;#039;actualisation locale sur le nouvel écran&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale terminée\n&amp;quot;);&lt;br /&gt;
	EPD.deepsleep();&lt;br /&gt;
&lt;br /&gt;
} void loop()&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	delay(1); // Empêcher le chien de garde de s&amp;#039;interrompre&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>178.197.195.126</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1901</id>
		<title>CrowPanel-ESP32-E-Paper-HMI-1.54</title>
		<link rel="alternate" type="text/html" href="https://wiki.myows.top/index.php?title=CrowPanel-ESP32-E-Paper-HMI-1.54&amp;diff=1901"/>
		<updated>2025-11-26T19:15:16Z</updated>

		<summary type="html">&lt;p&gt;178.197.195.126: /* Code HelloWord */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== E-Paper-HMI-1.54 (Elecrow) ==&lt;br /&gt;
&lt;br /&gt;
=== Liens externes ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_HMI_1.54-inch_Display.html Wiki&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/wiki/CrowPanel_ESP32_E-Paper_1.54-inch_Arduino_Tutorial.html Arduino Setup&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/crowpanel-esp32-1-54-e-paper-hmi-display-with-152-152-resolution-black-white-color-driven-by-spi-interface.html Shop&lt;br /&gt;
&lt;br /&gt;
 BLE debugging assistant&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/1-54-inch-152-152-e-paper-display-black-white-e-ink-display-with-spi-communication.html&lt;br /&gt;
&lt;br /&gt;
=== Caractéristiques ===&lt;br /&gt;
&lt;br /&gt;
Driver Chip : &amp;lt;b&amp;gt;SSD1680&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Résolution 152 x 152&amp;lt;br&amp;gt;&lt;br /&gt;
Couleur noir et blanc&amp;lt;br&amp;gt;&lt;br /&gt;
Pilote ESP32-S3 comme contrôleur principal&amp;lt;br&amp;gt;&lt;br /&gt;
PSRAM : 8MB&amp;lt;br&amp;gt;&lt;br /&gt;
Flash :	8MB&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
[[File:E-Paper-HMI-1.54-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[File:E-Paper-HMI-1.54-2.png|300px]]&lt;br /&gt;
[[File:E-Paper-HMI-1.54-3.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
&lt;br /&gt;
https://www.elecrow.com/download/product/CrowPanel/E-paper/Image2Lcd_v2.9.zip Image2Lcd_v2.9&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152 GitHub&lt;br /&gt;
&lt;br /&gt;
https://github.com/Elecrow-RD/CrowPanel-ESP32-1.54-E-paper-HMI-Display-with-152-152/archive/refs/heads/master.zip GitHub ZIP&lt;br /&gt;
&lt;br /&gt;
=== Arduine Mise en route (Setup) ===&lt;br /&gt;
&lt;br /&gt;
Click &amp;quot;Tools&amp;quot;-&amp;gt;&amp;quot;Board&amp;quot;-&amp;gt;&amp;quot;esp32&amp;quot;-&amp;gt;&amp;quot;ESP32S3 Dev Module&amp;quot;, &lt;br /&gt;
&lt;br /&gt;
and the &amp;quot;Partition Scheme&amp;quot; select &lt;br /&gt;
&amp;quot;Huge APP (3MB No OTA/1MB SPIFFS)&amp;quot;, &lt;br /&gt;
&amp;quot;PSRAM&amp;quot; select &amp;quot;OPI PSRAM&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Setup-Arduino-1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
=== Librairies ===&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;Arduino.h&amp;gt;   // Inclure la bibliothèque principale Arduino&lt;br /&gt;
 #include &amp;quot;EPD_GUI.h&amp;quot;   // Inclure la bibliothèque pour l&amp;#039;écran à encre électronique&lt;br /&gt;
 #include &amp;quot;Pic.h&amp;quot;       // Inclure la bibliothèque de fonctions personnalisées&lt;br /&gt;
 #include &amp;quot;FS.h&amp;quot;        // Bibliothèque du système de fichiers pour les opérations sur les fichiers&lt;br /&gt;
 #include &amp;quot;SPIFFS.h&amp;quot;    // Bibliothèque du système de fichiers SPIFFS pour la lecture et l&amp;#039;écriture de fichiers&lt;br /&gt;
 #include &amp;lt;WiFi.h&amp;gt;      // Bibliothèque WiFi pour la création et la gestion des connexions WiFi&lt;br /&gt;
 #include &amp;lt;Ticker.h&amp;gt;    // Bibliothèque de chronométrage&lt;br /&gt;
 #include &amp;lt;WebServer.h&amp;gt; // Bibliothèque de serveur Web pour la création d&amp;#039;un serveur HTTP&lt;br /&gt;
&lt;br /&gt;
=== Code Exemples ===&lt;br /&gt;
&lt;br /&gt;
Arduino Code for demos&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_WIFI_refresh.ino &amp;lt;b&amp;gt;Update via WiFi&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_ble_refresh.ino  &amp;lt;b&amp;gt;Update via Bluetooth&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi_http_openweather.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arduino Code for examples&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_PWR.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_wifi.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_BLE.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_key.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_Global_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
1.54_partial_refresh.ino&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=smDFHRxDYdw&lt;br /&gt;
&lt;br /&gt;
=== Code wifi_http_openweather ===&lt;br /&gt;
&lt;br /&gt;
https://openweathermap.org/ Veuillez vous enregistrer afin de vous procurer votre OpenWeatherMap API key&lt;br /&gt;
&lt;br /&gt;
http://bulk.openweathermap.org/sample/ on trouve ici : city.list.json.gz, le countryCode de votre ville (variable city)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HTTPClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino_JSON.h&amp;gt;&lt;br /&gt;
#include &amp;quot;EPD_GUI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Pic.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Define an array for black and white image data, which serves as the buffer for the e-paper display.&lt;br /&gt;
// The size of the buffer is determined according to the resolution of the e-paper display.&lt;br /&gt;
uint8_t ImageBW[2888];&lt;br /&gt;
&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Variables related to timing and API calls.&lt;br /&gt;
// lastTime keeps track of the last time the API was called.&lt;br /&gt;
unsigned long lastTime = 0;&lt;br /&gt;
// timerDelay determines the time interval between API calls. For testing, it&amp;#039;s set to 10 seconds (10000 milliseconds).&lt;br /&gt;
// In a final application, this should be set according to the API call limits per hour/minute.&lt;br /&gt;
unsigned long timerDelay = 10000;&lt;br /&gt;
&lt;br /&gt;
// Variables related to JSON data.&lt;br /&gt;
// jsonBuffer stores the raw JSON data received from the API.&lt;br /&gt;
String jsonBuffer;&lt;br /&gt;
// httpResponseCode holds the response code from the HTTP request.&lt;br /&gt;
int httpResponseCode;&lt;br /&gt;
// myObject is a JSON variable that will hold the parsed JSON data.&lt;br /&gt;
JSONVar myObject;&lt;br /&gt;
&lt;br /&gt;
// Variables related to weather information.&lt;br /&gt;
// weather stores the main weather description.&lt;br /&gt;
String weather;&lt;br /&gt;
// temperature stores the temperature value.&lt;br /&gt;
String temperature;&lt;br /&gt;
// humidity stores the humidity value.&lt;br /&gt;
String humidity;&lt;br /&gt;
// sea_level stores the sea level value.&lt;br /&gt;
String sea_level;&lt;br /&gt;
// wind_speed stores the wind speed value.&lt;br /&gt;
String wind_speed;&lt;br /&gt;
// city_js stores the name of the city.&lt;br /&gt;
String city_js;&lt;br /&gt;
// weather_flag is a flag that determines which weather icon to display based on the weather description.&lt;br /&gt;
int weather_flag = 0;&lt;br /&gt;
&lt;br /&gt;
// Function to display weather forecast on the e-paper display.&lt;br /&gt;
void UI_weather_forecast()&lt;br /&gt;
{&lt;br /&gt;
  char buffer[40];&lt;br /&gt;
&lt;br /&gt;
  EPD_HW_RESET();&lt;br /&gt;
&lt;br /&gt;
  // Display a background picture on the e-paper.&lt;br /&gt;
  EPD_ShowPicture(0, 0, 152, 152, pic, BLACK);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Visit&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_visit, BLACK);&lt;br /&gt;
  //Wind&lt;br /&gt;
  //EPD_ShowPicture(76, 92, 56, 72, gImage_wind, BLACK);&lt;br /&gt;
  //Temp&lt;br /&gt;
  //  EPD_ShowPicture(92, 0, 56, 72, gImage_temp, BLACK);&lt;br /&gt;
  //Hum&lt;br /&gt;
&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 270, WHITE);&lt;br /&gt;
  // Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  // EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
&lt;br /&gt;
  // Display the update time (it seems to be mislabeled as city_js here, might need to be corrected depending on the actual intention).&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, city_js);&lt;br /&gt;
  EPD_ShowString(20, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //If you need to replace the display options,&lt;br /&gt;
  //open the following options: temp, wind, visit, hum&lt;br /&gt;
  //The following uses the hum option as an example&lt;br /&gt;
&lt;br /&gt;
  //Hum&lt;br /&gt;
  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, humidity);&lt;br /&gt;
  EPD_ShowString(105, 140, buffer,  12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Temp&lt;br /&gt;
  //       memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //       snprintf(buffer, sizeof(buffer), &amp;quot;%s C&amp;quot;, temperature);&lt;br /&gt;
  //       EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //Wind&lt;br /&gt;
  // memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  // snprintf(buffer, sizeof(buffer), &amp;quot;%s m/s&amp;quot;, wind_speed);&lt;br /&gt;
  // EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  //visit&lt;br /&gt;
  //  memset(buffer, 0, sizeof(buffer));&lt;br /&gt;
  //  snprintf(buffer, sizeof(buffer), &amp;quot;%s &amp;quot;, sea_level);&lt;br /&gt;
  //  EPD_ShowString(105, 140, buffer, 12, BLACK);&lt;br /&gt;
&lt;br /&gt;
  // Update the e-paper display with the new content.&lt;br /&gt;
  EPD_Display(ImageBW);&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_DeepSleep();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200); // Initialize the serial communication.&lt;br /&gt;
&lt;br /&gt;
  // Connect to the WiFi network.&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
  Serial.println(&amp;quot;Connecting&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    delay(500);&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Connected to WiFi network with IP Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP()); // Print the IP address of the device after successful connection.&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Set pin 7 as an output pin to control the power of the e-paper display.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
  digitalWrite(7, HIGH);&lt;br /&gt;
&lt;br /&gt;
  EPD_GPIOInit();&lt;br /&gt;
  Paint_NewImage(ImageBW, EPD_W, EPD_H, 0, WHITE);&lt;br /&gt;
  Paint_Clear(WHITE);&lt;br /&gt;
  EPD_FastMode1Init();&lt;br /&gt;
  EPD_Display_Clear();&lt;br /&gt;
  EPD_FastUpdate();&lt;br /&gt;
  EPD_Clear_R26H();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  js_analysis();&lt;br /&gt;
  UI_weather_forecast();&lt;br /&gt;
  delay(1000 * 60 * 60);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void js_analysis()&lt;br /&gt;
{&lt;br /&gt;
  // Check if the device is connected to the WiFi network.&lt;br /&gt;
  if (WiFi.status() == WL_CONNECTED) {&lt;br /&gt;
    // Construct the URL for the OpenWeatherMap API request.&lt;br /&gt;
    String serverPath = &amp;quot;http://api.openweathermap.org/data/2.5/weather?q=&amp;quot; + city + &amp;quot;,&amp;quot; + countryCode + &amp;quot;&amp;amp;APPID=&amp;quot; + openWeatherMapApiKey + &amp;quot;&amp;amp;units=metric&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // Keep trying until a successful response (status code 200) is received.&lt;br /&gt;
    while (httpResponseCode != 200) {&lt;br /&gt;
      // Make an HTTP GET request to the API and store the response in jsonBuffer.&lt;br /&gt;
      jsonBuffer = httpGETRequest(serverPath.c_str());&lt;br /&gt;
      Serial.println(jsonBuffer);&lt;br /&gt;
      myObject = JSON.parse(jsonBuffer);&lt;br /&gt;
&lt;br /&gt;
      // Check if the JSON parsing was successful.&lt;br /&gt;
      if (JSON.typeof(myObject) == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
        Serial.println(&amp;quot;Parsing input failed!&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      delay(2000);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Extract weather information from the parsed JSON data.&lt;br /&gt;
    weather = JSON.stringify(myObject[&amp;quot;weather&amp;quot;][0][&amp;quot;main&amp;quot;]);&lt;br /&gt;
    temperature = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;]);&lt;br /&gt;
    humidity = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;humidity&amp;quot;]);&lt;br /&gt;
    sea_level = JSON.stringify(myObject[&amp;quot;main&amp;quot;][&amp;quot;sea_level&amp;quot;]);&lt;br /&gt;
    wind_speed = JSON.stringify(myObject[&amp;quot;wind&amp;quot;][&amp;quot;speed&amp;quot;]);&lt;br /&gt;
    city_js = JSON.stringify(myObject[&amp;quot;name&amp;quot;]);&lt;br /&gt;
&lt;br /&gt;
    // Print the extracted weather information for debugging purposes.&lt;br /&gt;
    Serial.print(&amp;quot;String weather: &amp;quot;);&lt;br /&gt;
    Serial.println(weather);&lt;br /&gt;
    Serial.print(&amp;quot;String Temperature: &amp;quot;);&lt;br /&gt;
    Serial.println(temperature);&lt;br /&gt;
    Serial.print(&amp;quot;String humidity: &amp;quot;);&lt;br /&gt;
    Serial.println(humidity);&lt;br /&gt;
    Serial.print(&amp;quot;String sea_level: &amp;quot;);&lt;br /&gt;
    Serial.println(sea_level);&lt;br /&gt;
    Serial.print(&amp;quot;String wind_speed: &amp;quot;);&lt;br /&gt;
    Serial.println(wind_speed);&lt;br /&gt;
    Serial.print(&amp;quot;String city_js: &amp;quot;);&lt;br /&gt;
    Serial.println(city_js);&lt;br /&gt;
&lt;br /&gt;
    // Determine the weather icon based on the weather description.&lt;br /&gt;
    if (weather.indexOf(&amp;quot;clouds&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clouds&amp;quot;) != -1 ) {&lt;br /&gt;
      weather_flag = 1;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;clear sky&amp;quot;) != -1 || weather.indexOf(&amp;quot;Clear sky&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 3;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;rain&amp;quot;) != -1 || weather.indexOf(&amp;quot;Rain&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 5;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;thunderstorm&amp;quot;) != -1 || weather.indexOf(&amp;quot;Thunderstorm&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 2;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;snow&amp;quot;) != -1 || weather.indexOf(&amp;quot;Snow&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 4;&lt;br /&gt;
    } else if (weather.indexOf(&amp;quot;mist&amp;quot;) != -1 || weather.indexOf(&amp;quot;Mist&amp;quot;) != -1) {&lt;br /&gt;
      weather_flag = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    // Print a message if the device is not connected to the WiFi network.&lt;br /&gt;
    Serial.println(&amp;quot;WiFi Disconnected&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Function to make an HTTP GET request and return the response.&lt;br /&gt;
String httpGETRequest(const char* serverName) {&lt;br /&gt;
  WiFiClient client;&lt;br /&gt;
  HTTPClient http;&lt;br /&gt;
&lt;br /&gt;
  // Initialize the HTTP client with the server name.&lt;br /&gt;
  http.begin(client, serverName);&lt;br /&gt;
&lt;br /&gt;
  // Send an HTTP GET request.&lt;br /&gt;
  httpResponseCode = http.GET();&lt;br /&gt;
&lt;br /&gt;
  // Initialize the response payload as an empty JSON object.&lt;br /&gt;
  String payload = &amp;quot;{}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  // Check if the response code is positive (indicating a successful request).&lt;br /&gt;
  if (httpResponseCode &amp;gt; 0) {&lt;br /&gt;
    Serial.print(&amp;quot;HTTP Response code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
    payload = http.getString();&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    Serial.print(&amp;quot;Error code: &amp;quot;);&lt;br /&gt;
    Serial.println(httpResponseCode);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Close the HTTP connection.&lt;br /&gt;
  http.end();&lt;br /&gt;
&lt;br /&gt;
  return payload;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Explications : Partie à modifier avec vos données, ssid, password, openWeatherMapApiKey, city, countryCode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// WiFi network name // WiFi password&lt;br /&gt;
&lt;br /&gt;
const char* ssid = &amp;quot;yanfa_software&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;yanfa-123456&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// OpenWeatherMap API key. This key is used to access weather data from the OpenWeatherMap API.&lt;br /&gt;
String openWeatherMapApiKey = &amp;quot;3c03d1f4e2dd3e14474a9a3a2f2299ff&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// City and country code for which weather data will be fetched.&lt;br /&gt;
String city = &amp;quot;London&amp;quot;;&lt;br /&gt;
String countryCode = &amp;quot;2643743&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code HelloWord ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
	* @file HelloWorld.ino&lt;br /&gt;
	* @author HalfSweet (Email:HalfSweet@HalfSweet.cn or QQ:2522182733)&lt;br /&gt;
	* @brief Ce fichier est un exemple de programme permettant d&amp;#039;afficher «Hello World» sur un écran à encre électronique. Il illustre uniquement la méthode la plus simple pour allumer l&amp;#039;écran. &lt;br /&gt;
        * Veuillez consulter la documentation pour connaître l&amp;#039;utilisation des différentes fonctions.&lt;br /&gt;
	* @version 0.1&lt;br /&gt;
	* @date 2022-01-30&lt;br /&gt;
	*&lt;br /&gt;
	* @copyright Copyright (c) 2022&lt;br /&gt;
	*&lt;br /&gt;
*/ &lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;EPaperDrive.h&amp;gt;&lt;br /&gt;
// Inclure le système de fichiers à utiliser, par exemple:&lt;br /&gt;
#include &amp;lt;LittleFS.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUD_SPEED 74880 // Débit en bauds pour le débogage du port série, modifiable selon les besoins&lt;br /&gt;
&lt;br /&gt;
#define CS 15&lt;br /&gt;
#define RST 2&lt;br /&gt;
#define DC 0&lt;br /&gt;
#define BUSY 4&lt;br /&gt;
#define CLK 14&lt;br /&gt;
#define DIN 13&lt;br /&gt;
&lt;br /&gt;
EPaperDrive EPD(0, CS, RST, DC, BUSY, CLK, DIN); //Instanciation de la bibliothèque de pilotes, utilisant ici le protocole SPI logiciel&lt;br /&gt;
&lt;br /&gt;
const uint8_t city_icon[24] = {&lt;br /&gt;
	/* 0X01,0X01,0X0C,0X00,0X0C,0X00, */&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0X60,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0XA2,&lt;br /&gt;
	0X30,&lt;br /&gt;
	0X9C,&lt;br /&gt;
	0XC0,&lt;br /&gt;
	0X41,&lt;br /&gt;
	0X80,&lt;br /&gt;
	0X77,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X1C,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
	0X00,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
	void setup()&lt;br /&gt;
	{&lt;br /&gt;
	Serial.begin(BAUD_SPEED);&lt;br /&gt;
	LittleFS.begin(); 						// Veuillez initialiser manuellement le système de fichiers avant de passer le pointeur.&lt;br /&gt;
&lt;br /&gt;
	EPD.SetFS(&amp;amp;LittleFS); 					// Définit le système de fichiers pour le stockage des polices. La valeur passée est le pointeur d&amp;#039;opération pour ce système de fichiers. Vous pouvez la modifier.&lt;br /&gt;
	EPD.EPD_Set_Model(HINKE0266A15A0); 		// Définit le type d&amp;#039;écran. Consultez la documentation pour les modèles spécifiques.&lt;br /&gt;
	EPD.EPD_init_Full(); 					// Initialisation du rafraîchissement complet, en utilisant la forme d&amp;#039;onde de rafraîchissement complet.&lt;br /&gt;
	EPD.clearbuffer(); 						// Efface le tampon (écran blanc).&lt;br /&gt;
	EPD.fontscale = 2; 						// Facteur d&amp;#039;échelle des polices (1 et 2 pris en charge, également applicable aux images. N&amp;#039;oubliez pas de le remettre à 1 après utilisation).&lt;br /&gt;
	EPD.SetFont(FONT12); 					// Sélectionne la police. Consultez la documentation pour connaître les polices prises en charge.&lt;br /&gt;
	EPD.DrawUTF(0, 0, &amp;quot;Hello&amp;quot;); &amp;quot;World&amp;quot;); 	// Dessiner la chaîne&lt;br /&gt;
	EPD.DrawUTF(26, 0, &amp;quot;J&amp;#039;aime les écrans à encre électronique&amp;quot;); 	// Dessiner la chaîne&lt;br /&gt;
	EPD.fontscale = 1; 												// Rétablir le facteur d&amp;#039;échelle de la police à 1&lt;br /&gt;
	EPD.DrawXbm_P(60, 0, 12, 12, (uint8_t *)city_icon); 			// Dessiner l&amp;#039;image&lt;br /&gt;
&lt;br /&gt;
	Serial.printf(&amp;quot;Image tamponnée dessinée, prête pour un rafraîchissement complet\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Full((uint8_t *)EPD.EPDbuffer, 1); // Transmettre l&amp;#039;image tamponnée à la puce de contrôle de l&amp;#039;écran pour un rafraîchissement complet&lt;br /&gt;
	EPD.deepsleep(); // Mettre l&amp;#039;écran en veille&lt;br /&gt;
	Serial.println(&amp;quot;Rafraîchissement complet terminé&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	delay(5000);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_init_Part(); // Initialiser la partie Actualisation&lt;br /&gt;
	EPD.clearbuffer();&lt;br /&gt;
	EPD.fontscale = 2;&lt;br /&gt;
	EPD.SetFont(FONT12); EPD.DrawUTF(0, 0, &amp;quot;Actualisation locale activée&amp;quot;);&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale en cours\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	EPD.EPD_Dis_Part(0, 23, 0, 199, (uint8_t *)EPD.EPDbuffer, 1); // Transfert de l&amp;#039;image du tampon vers la puce de contrôle d&amp;#039;écran pour l&amp;#039;actualisation locale sur le nouvel écran&lt;br /&gt;
	Serial.printf(&amp;quot;Actualisation locale terminée\n&amp;quot;);&lt;br /&gt;
	EPD.deepsleep();&lt;br /&gt;
&lt;br /&gt;
} void loop()&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	delay(1); // Empêcher le chien de garde de s&amp;#039;interrompre&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>178.197.195.126</name></author>
		
	</entry>
</feed>