<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://knowledge.pinon-hebert.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jpinon</id>
	<title>knowledge - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://knowledge.pinon-hebert.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jpinon"/>
	<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/Sp%C3%A9cial:Contributions/Jpinon"/>
	<updated>2026-05-19T11:07:15Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1977</id>
		<title>ESP32C3 avec écran spotear</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1977"/>
		<updated>2026-05-13T20:05:30Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* La &amp;quot;default font&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Appelé en français &amp;quot;Mini ornement de Bureau&amp;quot; voici le module ESP32 C3 équipé de son écran. Personnellement c&#039;est mon premier C3 donc mes débuts en RISC-V. Bon tant que je fais du C avec l&#039;IDE Arduino ca devrait pas trop se voir.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget.png|vignette|220x220px]]&lt;br /&gt;
&lt;br /&gt;
== Premier contact ==&lt;br /&gt;
Apres avoir joué au petit mécano pour monter le bidule. On le branche sur une alim USB (micro USB le design ne date pas d&#039;hier).&lt;br /&gt;
&lt;br /&gt;
On le branche et il affiche un message (assez moche en vérité) indiquant de configurer son &amp;quot;mobile WLAN&amp;quot; avec les paramètres :&lt;br /&gt;
&lt;br /&gt;
SSID : spotpear (c&#039;est le fabricant)&lt;br /&gt;
&lt;br /&gt;
WIFI Key : 12345678&lt;br /&gt;
&lt;br /&gt;
On peut pas plus sûr comme mot de passe !&lt;br /&gt;
&lt;br /&gt;
Le message du dessous me parait me parait assez ésotérique. Ca sent la traduction du chinois fait pas une IA poussive.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget+wifi.png|gauche|vignette|215x215px]]&lt;br /&gt;
Je configure un routeur avec ces paramètres et je rebranche le bigonx.&lt;br /&gt;
&lt;br /&gt;
Une belle barre de progression s&#039;affiche et ensuite un superbe écran!&lt;br /&gt;
&lt;br /&gt;
Que c&#039;est beau!&lt;br /&gt;
&lt;br /&gt;
A première vue:&lt;br /&gt;
&lt;br /&gt;
* L&#039;écran est très correct. Lumineux et lisible.&lt;br /&gt;
* &amp;lt;u&amp;gt;Pour le mini firmware:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;heure locale est juste. Il sait se mètre à l&#039;heure et détecte correctement le fuseau horaire et l&#039;heure été/hiver&lt;br /&gt;
&lt;br /&gt;
* La date est bonne&lt;br /&gt;
* La localisation à Clichy est fausse (on est a Paris aujourd&#039;hui)&lt;br /&gt;
* La température semble correcte le service météo est juste en revanche le fait d&#039;afficher en °F alors qu&#039;on est a Clichy...Bof bof.&lt;br /&gt;
* La météo est correcte (il pleut, il pleut en ce mois de mars 2026)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le barre de progression du wifi étant verte et le symbole &amp;quot;Temp&amp;quot; en bleu je suppose que cet écran est RGB. (Chercher le rouge)&lt;br /&gt;
&lt;br /&gt;
== Recherche de documentation ==&lt;br /&gt;
Le bidule acheté 9€ sur Aliexpress est livré avec.... 8 entretoises 8 vis une façade trouée pour l&#039;écran et un bout de plastique noir pour le fond. Mais .... Aucune doc.&lt;br /&gt;
&lt;br /&gt;
Pas grave y&#039;a Google et Gemini.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai trouvé :&lt;br /&gt;
&lt;br /&gt;
https://www.elektroda.com/news/news4091334.html  où un certain p.kaczmarek2 détaille tout le processus d&#039;utilisation.&lt;br /&gt;
&lt;br /&gt;
Dedans j&#039;ai trouvé le schéma électronique.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SCHEMA ELEC SPOTEAR.png|sans_cadre|836x836px]]&lt;br /&gt;
&lt;br /&gt;
https://spotpear.com/wiki/ESP32-C3-desktop-trinket-Mini-TV-Portable-Pendant-LVGL-1.44inch-LCD-ST7735.html le site du fabricant.&lt;br /&gt;
&lt;br /&gt;
== Niveau Hardware ==&lt;br /&gt;
La carte est assez simple on y trouve :&lt;br /&gt;
&lt;br /&gt;
* Le joli écran de 1,44&amp;lt;nowiki&amp;gt;&#039;&#039; de 128x128 pixel  (on est loin du 300 ppp) utilisé en SPI (peut être possible en I2C). Pour les personnes normales utilisant le système métrique (le monde entier sauf les USA, le Libéria et la Birmanie je crois) 1.44&#039;&#039; ca fait 36,6 mm. La taille doit venir de ces unités exotiques où un pouce est divisé en 144 points. Je sais pas j&#039;ai pas l&#039;&amp;lt;/nowiki&amp;gt;habitude... Doit y avoir une logique.&lt;br /&gt;
* Une prise pour une batterie et un circuit de charge PL4054&lt;br /&gt;
* Un régulateur linéaire pour faire du 3.3 V CAT 6219 qui m&#039;a pas l&#039;aire d&#039;être tout jeune&lt;br /&gt;
* Un quartz 40 MHz&lt;br /&gt;
* Une petite mémoire flash de 128 Mbits (16b Mo) W25q128 &lt;br /&gt;
* 4 boutons poussoirs &lt;br /&gt;
** RESET (ou plutôt CHIP_EN) avec son petit circuit de reset automatique&lt;br /&gt;
** Un bouton BOOT cablé sur IO09&lt;br /&gt;
** Deux boutons (actifs bas) sur IO8 et I010&lt;br /&gt;
* Une led sur IO11&lt;br /&gt;
* Une LED qui, si je comprends le schéma électronique s&#039;allume quand le batterie se charge  &lt;br /&gt;
* Le port USB est relié au ESP32C3 qui doit savoir le gérer en natif (pas de FTDI ou autre)&lt;br /&gt;
* 5 GPIO accessibles sur 6 broches &lt;br /&gt;
** GPIO1&lt;br /&gt;
** GPIO6&lt;br /&gt;
** GPIO7&lt;br /&gt;
** GPIO20&lt;br /&gt;
** GPIO21&lt;br /&gt;
* Une broches de masse (coté GPIO)&lt;br /&gt;
* Une broche +5V et une +3.3V autour du port µUSB&lt;br /&gt;
&lt;br /&gt;
== Niveau developpement ==&lt;br /&gt;
Il faut installer un environnement correct. [[Poste de DEV ESP32 sur PI|C&#039;est détaillé ici]]. Avec un premier &amp;quot;hello world&amp;quot; qui fait clignoter une LED.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser l&#039;écran ===&lt;br /&gt;
J&#039;ai eu pas mal de problèmes pour utiliser l&#039;écran. Beaucoup de tutos (et aussi copilot) conseillent d&#039;utiliser la librairie &#039;&#039;&#039;TFT_eSPI&#039;&#039;&#039; mais je ne suis pas arrivé à l&#039;utiliser correctement.&lt;br /&gt;
&lt;br /&gt;
D&#039;autre part le branchement de l&#039;écran n&#039;est pas standard. &lt;br /&gt;
&lt;br /&gt;
==== Brochage ====&lt;br /&gt;
Dans le schéma de principe donné sur le site de p.kaczmarek2 on voit plusieurs choses.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ST7735 PINOUT.png|sans_cadre|429x429px]]&lt;br /&gt;
&lt;br /&gt;
Le pinout n&#039;est pas standard le &#039;backlight&amp;quot; n&#039;est pas réglable. Les LEDs de rétroéclairage sont alimentées en permanence à travers R11.&lt;br /&gt;
&lt;br /&gt;
En plus sur ce schéma les broches sont nommées SDA, SCL... alors que c&#039;est du SPI et pas ce I&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;C.&lt;br /&gt;
&lt;br /&gt;
Donc le fichier de définition est :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Mon fichier User_Setup.h complet est:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define USER_SETUP_ID 44&lt;br /&gt;
&lt;br /&gt;
#define ST7735_DRIVER&lt;br /&gt;
#define TFT_WIDTH 128&lt;br /&gt;
#define TFT_HEIGHT 128&lt;br /&gt;
&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN   11  // GPIO11 sur ESP32-C3&lt;br /&gt;
#define SWITCH_0  8   // GPIO08 sur ESP32-C3&lt;br /&gt;
#define SWITCH_1  10  // GPIO10 sur ESP32-C3&lt;br /&gt;
&lt;br /&gt;
#define TFT_RGB_ORDER TFT_BGR&lt;br /&gt;
#define TFT_INVERSION_ON&lt;br /&gt;
#define TFT_ROTATION 1&lt;br /&gt;
&lt;br /&gt;
#define SPI_FREQUENCY  27000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Librairie Adafruit ====&lt;br /&gt;
Donc la librairies &#039;&#039;&#039;TFT_eSPI&#039;&#039;&#039; ne marche pas avec cet écran (ou je ne suis pas arrivé à la faire marcher) j&#039;ai utilisé &#039;&#039;&#039;Adafruit_ST7735&#039;&#039;&#039; qui fonctionne très bien ([https://www.adafruit.com/ merci Lady Ada]).&lt;br /&gt;
&lt;br /&gt;
Associée à la librairies GFX du même Adafruit on a un joli environnement pour faire des dessins sur l&#039;écran.&lt;br /&gt;
&lt;br /&gt;
On déclare la librairie dans platformio.ini :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[env:adafruit_qtpy_esp32c3]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = adafruit_qtpy_esp32c3&lt;br /&gt;
framework = arduino&lt;br /&gt;
&lt;br /&gt;
lib_deps =&lt;br /&gt;
    adafruit/Adafruit ST7735 and ST7789 Library&lt;br /&gt;
    adafruit/Adafruit GFX Library&lt;br /&gt;
&lt;br /&gt;
build_flags =&lt;br /&gt;
    -DUSER_SETUP_LOADED=1&lt;br /&gt;
    -include src/User_Setup.h&lt;br /&gt;
&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
upload_speed = 921600&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque l&#039;inclusion du User_Setup.h montré ci dessus.&lt;br /&gt;
&lt;br /&gt;
Et dans le code source on ajoute:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_ST7735.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On déclare un objet Adafruit_ST7735 avec les broches données ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, MOSI_PIN, SCK_PIN, TFT_RST);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et on l&#039;initialise dans &amp;lt;code&amp;gt;setup()&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;tft.initR(INITR_144GREENTAB); &lt;br /&gt;
    tft.setRotation(3);&lt;br /&gt;
    tft.fillScreen(ST77XX_BLACK);   // Fill the screen with black color&lt;br /&gt;
    delay(100);&lt;br /&gt;
    tft.setRotation(2);&amp;lt;/syntaxhighlight&amp;gt;Ici y&#039;a deux remarques: &lt;br /&gt;
&lt;br /&gt;
* La constante INITR_144GREENTAB est à utiliser car le standard INITR_BLACKTAB est en mode RGB alors que notre écran est BGR (pourquoi ... pour faire genre je suppose).&lt;br /&gt;
* Ensuite, lors du premier démarrage le tft.fillScreen(ST77XX_BLACK);   &amp;quot;oublie&amp;quot; quelques lignes de pixels a droite et, pour éviter ce probléme je remplis deux fois en tournant virtuellement l&#039;écran. Il y a peut-etre une conf qui m&#039;échappe...&lt;br /&gt;
&lt;br /&gt;
===== La &amp;quot;default font&amp;quot; =====&lt;br /&gt;
Lorsque l&#039;on choisit la fonte par défaut (on qu&#039;on ne choisit rien) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
tft.setFont(); // Si une fonte avait été selectionnée avant. On reviens à la 7x5 par défaut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est une police de base 5x7 mais elle va plus loin que l&#039;ASCII standard. &lt;br /&gt;
&lt;br /&gt;
* On a des caractères valides avant 32 &lt;br /&gt;
* On a des caractères étendus après 127&lt;br /&gt;
&lt;br /&gt;
Le fichier qui le décrit s&#039;appelle &amp;lt;code&amp;gt;glcdfont.c&amp;lt;/code&amp;gt; et, dans un projet Visual Studio Code est situé : &amp;lt;code&amp;gt;.pio/libdeps/adafruit_qtpy_esp32c3/Adafruit GFX Library/glcdfont.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La structure est simple chaque caractère est codé 5 octset représentant les 5 colonnes de bits.&lt;br /&gt;
&lt;br /&gt;
Apres un programme en C++ pour comprendre et un programme en python pour représenter je suis arrivé à :&lt;br /&gt;
[[Fichier:AdafruitGFX 5x7 font.png|sans_cadre|645x645px]]&lt;br /&gt;
&lt;br /&gt;
Bon le 5x7 c&#039;est moche mais sur un écran 128x128 ca permet d&#039;afficher 16 lignes de 21 caractères (un peu moins que le 176 × 184 du vic 20)&lt;br /&gt;
&lt;br /&gt;
==== Exemple complet ====&lt;br /&gt;
Un programe démo complet est donné ici.&lt;br /&gt;
&lt;br /&gt;
C&#039;est un &amp;quot;LED Blink&amp;quot; amélioré.&lt;br /&gt;
&lt;br /&gt;
Il fait clignoter la LED sur GPIO11 au rythme de une fois par seconde (1000 ms) ajustable.&lt;br /&gt;
&lt;br /&gt;
L&#039;écran affichera:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Luxury blink.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On a en vert le période de &amp;quot;blink&amp;quot; et en blanc sur fond bleu le temps depuis le boot du device HH:MM:SS.&lt;br /&gt;
&lt;br /&gt;
Un petit bandeau bleu a gauche indique que les boutons &amp;quot;+&amp;quot; et &amp;quot;-&amp;quot; permettent d&#039;ajouter ou de retirer 10 ms à la période.&lt;br /&gt;
&lt;br /&gt;
RST est également affiché a côté du bouton reset.&lt;br /&gt;
&lt;br /&gt;
Le projet est constitué de 3 fichiers :&lt;br /&gt;
&lt;br /&gt;
===== platformio.ini =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;[env:adafruit_qtpy_esp32c3]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = adafruit_qtpy_esp32c3&lt;br /&gt;
framework = arduino&lt;br /&gt;
&lt;br /&gt;
lib_deps =&lt;br /&gt;
    adafruit/Adafruit ST7735 and ST7789 Library&lt;br /&gt;
    adafruit/Adafruit GFX Library&lt;br /&gt;
&lt;br /&gt;
build_flags =&lt;br /&gt;
    -DUSER_SETUP_LOADED=1&lt;br /&gt;
    -include src/User_Setup.h&lt;br /&gt;
&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
upload_speed = 921600&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== User_Setup.h =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define USER_SETUP_ID 44&lt;br /&gt;
&lt;br /&gt;
#define ST7735_DRIVER&lt;br /&gt;
#define TFT_WIDTH 128&lt;br /&gt;
#define TFT_HEIGHT 128&lt;br /&gt;
&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN   11  // GPIO11 sur ESP32-C3&lt;br /&gt;
#define SWITCH_0  8   // GPIO08 sur ESP32-C3&lt;br /&gt;
#define SWITCH_1  10  // GPIO10 sur ESP32-C3&lt;br /&gt;
&lt;br /&gt;
#define TFT_RGB_ORDER TFT_BGR&lt;br /&gt;
#define TFT_INVERSION_ON&lt;br /&gt;
#define TFT_ROTATION 1&lt;br /&gt;
&lt;br /&gt;
#define SPI_FREQUENCY  27000000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== main.cpp =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_ST7735.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Fonts/FreeSans9pt7b.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Fonts/FreeSans12pt7b.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, MOSI_PIN, SCK_PIN, TFT_RST);&lt;br /&gt;
&lt;br /&gt;
int periode = 1000;&lt;br /&gt;
&lt;br /&gt;
void display(){&lt;br /&gt;
  tft.fillScreen(tft.color565(128, 128, 128));   // Fill the screen with black color&lt;br /&gt;
  tft.setCursor(20, 15);            // Set cursor at the top-left corner&lt;br /&gt;
  tft.setTextColor(ST77XX_WHITE); // Set text color to white&lt;br /&gt;
  tft.setFont();&lt;br /&gt;
  tft.print(&amp;quot;Blink test...&amp;quot;);       // Print the message&lt;br /&gt;
  tft.fillRect(0,0,15,TFT_HEIGHT,tft.color565(0, 0, 128));&lt;br /&gt;
  tft.drawRect(0,0,15,TFT_HEIGHT,ST77XX_BLACK);&lt;br /&gt;
&lt;br /&gt;
  tft.setCursor(5, 10); tft.print(&amp;quot;+&amp;quot;);  &lt;br /&gt;
  tft.setCursor(5, 110); tft.print(&amp;quot;-&amp;quot;);  &lt;br /&gt;
  tft.setCursor(100, 110); tft.print(&amp;quot;RST&amp;quot;);  &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void update(){&lt;br /&gt;
  int16_t margin=5;&lt;br /&gt;
  int16_t x=25;&lt;br /&gt;
  int16_t y=50;&lt;br /&gt;
  int16_t x1, y1;&lt;br /&gt;
  uint16_t w, h;&lt;br /&gt;
  String displayStr=&amp;quot; &amp;quot;+String(millis())+&amp;quot; ms &amp;quot;;&lt;br /&gt;
  tft.setFont(&amp;amp;FreeSans9pt7b);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  tft.getTextBounds(displayStr, x, y, &amp;amp;x1, &amp;amp;y1, &amp;amp;w, &amp;amp;h);&lt;br /&gt;
  uint16_t real_w = TFT_WIDTH-x1-margin;&lt;br /&gt;
  tft.fillRect(x1-margin, y1-margin, real_w, h+margin*2, ST77XX_BLACK); // efface la zone&lt;br /&gt;
  tft.setCursor(x, y);            // Set cursor at the top-left corner&lt;br /&gt;
  tft.setTextColor(ST77XX_GREEN); // Set text color to green&lt;br /&gt;
  tft.print(String(periode)+&amp;quot; ms&amp;quot;);       // Print the message    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void update_time(){&lt;br /&gt;
  int16_t margin=5;&lt;br /&gt;
  int16_t x=25;&lt;br /&gt;
  int16_t y=90;&lt;br /&gt;
  int16_t x1, y1;&lt;br /&gt;
  uint16_t w, h;&lt;br /&gt;
  uint32_t ti=millis();&lt;br /&gt;
  uint16_t ss=ti/1000;&lt;br /&gt;
  uint16_t mm=ss/60;&lt;br /&gt;
  ss=ss-(mm*60);&lt;br /&gt;
  uint16_t hh=mm/60;&lt;br /&gt;
  mm=mm-(hh*60);&lt;br /&gt;
  String displayStr=(hh &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(hh)+&amp;quot;:&amp;quot;+\&lt;br /&gt;
                    (mm &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(mm)+&amp;quot;:&amp;quot;+\&lt;br /&gt;
                    (ss &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(ss);&lt;br /&gt;
  tft.setFont(&amp;amp;FreeSans12pt7b);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  tft.getTextBounds(displayStr, x, y, &amp;amp;x1, &amp;amp;y1, &amp;amp;w, &amp;amp;h);&lt;br /&gt;
  uint16_t real_w = TFT_WIDTH-x1-margin;&lt;br /&gt;
  tft.fillRect(x1-margin, y1-margin, real_w, h+margin*2, tft.color565(0, 0, 128)); // efface la zone&lt;br /&gt;
  tft.drawRect(x1-margin, y1-margin, real_w, h+margin*2,ST77XX_BLACK);&lt;br /&gt;
  tft.setTextColor(ST77XX_WHITE);       &lt;br /&gt;
  tft.setCursor(x, y);&lt;br /&gt;
  tft.print(displayStr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Démarrage ESP32-C3...&amp;quot;);&lt;br /&gt;
  Serial.println(periode);&lt;br /&gt;
  pinMode(LED_PIN, OUTPUT);&lt;br /&gt;
  pinMode(SWITCH_0, INPUT_PULLUP);&lt;br /&gt;
  pinMode(SWITCH_1, INPUT_PULLUP);&lt;br /&gt;
  Serial.println(&amp;quot;Init écran ST7735...&amp;quot;);&lt;br /&gt;
  tft.initR(INITR_144GREENTAB); &lt;br /&gt;
  tft.setRotation(3);&lt;br /&gt;
  tft.fillScreen(ST77XX_BLACK);   // Fill the screen with black color&lt;br /&gt;
  delay(100);&lt;br /&gt;
  tft.setRotation(2);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  display();&lt;br /&gt;
  update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (digitalRead(SWITCH_0)==LOW){&lt;br /&gt;
    periode-=10;&lt;br /&gt;
    if (periode&amp;lt;100)&lt;br /&gt;
      periode=100;&lt;br /&gt;
    Serial.println(periode);&lt;br /&gt;
    update();&lt;br /&gt;
    delay(10);&lt;br /&gt;
    while (digitalRead(SWITCH_0)==LOW)&lt;br /&gt;
      delay(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (digitalRead(SWITCH_1)==LOW){&lt;br /&gt;
    periode+=10;&lt;br /&gt;
    if (periode&amp;gt;2000)&lt;br /&gt;
      periode=2000;&lt;br /&gt;
    Serial.println(periode);&lt;br /&gt;
    update();&lt;br /&gt;
    delay(10);&lt;br /&gt;
    while (digitalRead(SWITCH_1)==LOW)&lt;br /&gt;
      delay(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if ((millis() % periode)&amp;lt; (periode/2))&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);&lt;br /&gt;
  else&lt;br /&gt;
    digitalWrite(LED_PIN, LOW);&lt;br /&gt;
  &lt;br /&gt;
  if ((millis() % 1000)==0)&lt;br /&gt;
    update_time();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1976</id>
		<title>ESP32C3 avec écran spotear</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1976"/>
		<updated>2026-05-13T19:27:49Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Librairie Adafruit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Appelé en français &amp;quot;Mini ornement de Bureau&amp;quot; voici le module ESP32 C3 équipé de son écran. Personnellement c&#039;est mon premier C3 donc mes débuts en RISC-V. Bon tant que je fais du C avec l&#039;IDE Arduino ca devrait pas trop se voir.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget.png|vignette|220x220px]]&lt;br /&gt;
&lt;br /&gt;
== Premier contact ==&lt;br /&gt;
Apres avoir joué au petit mécano pour monter le bidule. On le branche sur une alim USB (micro USB le design ne date pas d&#039;hier).&lt;br /&gt;
&lt;br /&gt;
On le branche et il affiche un message (assez moche en vérité) indiquant de configurer son &amp;quot;mobile WLAN&amp;quot; avec les paramètres :&lt;br /&gt;
&lt;br /&gt;
SSID : spotpear (c&#039;est le fabricant)&lt;br /&gt;
&lt;br /&gt;
WIFI Key : 12345678&lt;br /&gt;
&lt;br /&gt;
On peut pas plus sûr comme mot de passe !&lt;br /&gt;
&lt;br /&gt;
Le message du dessous me parait me parait assez ésotérique. Ca sent la traduction du chinois fait pas une IA poussive.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget+wifi.png|gauche|vignette|215x215px]]&lt;br /&gt;
Je configure un routeur avec ces paramètres et je rebranche le bigonx.&lt;br /&gt;
&lt;br /&gt;
Une belle barre de progression s&#039;affiche et ensuite un superbe écran!&lt;br /&gt;
&lt;br /&gt;
Que c&#039;est beau!&lt;br /&gt;
&lt;br /&gt;
A première vue:&lt;br /&gt;
&lt;br /&gt;
* L&#039;écran est très correct. Lumineux et lisible.&lt;br /&gt;
* &amp;lt;u&amp;gt;Pour le mini firmware:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;heure locale est juste. Il sait se mètre à l&#039;heure et détecte correctement le fuseau horaire et l&#039;heure été/hiver&lt;br /&gt;
&lt;br /&gt;
* La date est bonne&lt;br /&gt;
* La localisation à Clichy est fausse (on est a Paris aujourd&#039;hui)&lt;br /&gt;
* La température semble correcte le service météo est juste en revanche le fait d&#039;afficher en °F alors qu&#039;on est a Clichy...Bof bof.&lt;br /&gt;
* La météo est correcte (il pleut, il pleut en ce mois de mars 2026)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le barre de progression du wifi étant verte et le symbole &amp;quot;Temp&amp;quot; en bleu je suppose que cet écran est RGB. (Chercher le rouge)&lt;br /&gt;
&lt;br /&gt;
== Recherche de documentation ==&lt;br /&gt;
Le bidule acheté 9€ sur Aliexpress est livré avec.... 8 entretoises 8 vis une façade trouée pour l&#039;écran et un bout de plastique noir pour le fond. Mais .... Aucune doc.&lt;br /&gt;
&lt;br /&gt;
Pas grave y&#039;a Google et Gemini.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai trouvé :&lt;br /&gt;
&lt;br /&gt;
https://www.elektroda.com/news/news4091334.html  où un certain p.kaczmarek2 détaille tout le processus d&#039;utilisation.&lt;br /&gt;
&lt;br /&gt;
Dedans j&#039;ai trouvé le schéma électronique.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SCHEMA ELEC SPOTEAR.png|sans_cadre|836x836px]]&lt;br /&gt;
&lt;br /&gt;
https://spotpear.com/wiki/ESP32-C3-desktop-trinket-Mini-TV-Portable-Pendant-LVGL-1.44inch-LCD-ST7735.html le site du fabricant.&lt;br /&gt;
&lt;br /&gt;
== Niveau Hardware ==&lt;br /&gt;
La carte est assez simple on y trouve :&lt;br /&gt;
&lt;br /&gt;
* Le joli écran de 1,44&amp;lt;nowiki&amp;gt;&#039;&#039; de 128x128 pixel  (on est loin du 300 ppp) utilisé en SPI (peut être possible en I2C). Pour les personnes normales utilisant le système métrique (le monde entier sauf les USA, le Libéria et la Birmanie je crois) 1.44&#039;&#039; ca fait 36,6 mm. La taille doit venir de ces unités exotiques où un pouce est divisé en 144 points. Je sais pas j&#039;ai pas l&#039;&amp;lt;/nowiki&amp;gt;habitude... Doit y avoir une logique.&lt;br /&gt;
* Une prise pour une batterie et un circuit de charge PL4054&lt;br /&gt;
* Un régulateur linéaire pour faire du 3.3 V CAT 6219 qui m&#039;a pas l&#039;aire d&#039;être tout jeune&lt;br /&gt;
* Un quartz 40 MHz&lt;br /&gt;
* Une petite mémoire flash de 128 Mbits (16b Mo) W25q128 &lt;br /&gt;
* 4 boutons poussoirs &lt;br /&gt;
** RESET (ou plutôt CHIP_EN) avec son petit circuit de reset automatique&lt;br /&gt;
** Un bouton BOOT cablé sur IO09&lt;br /&gt;
** Deux boutons (actifs bas) sur IO8 et I010&lt;br /&gt;
* Une led sur IO11&lt;br /&gt;
* Une LED qui, si je comprends le schéma électronique s&#039;allume quand le batterie se charge  &lt;br /&gt;
* Le port USB est relié au ESP32C3 qui doit savoir le gérer en natif (pas de FTDI ou autre)&lt;br /&gt;
* 5 GPIO accessibles sur 6 broches &lt;br /&gt;
** GPIO1&lt;br /&gt;
** GPIO6&lt;br /&gt;
** GPIO7&lt;br /&gt;
** GPIO20&lt;br /&gt;
** GPIO21&lt;br /&gt;
* Une broches de masse (coté GPIO)&lt;br /&gt;
* Une broche +5V et une +3.3V autour du port µUSB&lt;br /&gt;
&lt;br /&gt;
== Niveau developpement ==&lt;br /&gt;
Il faut installer un environnement correct. [[Poste de DEV ESP32 sur PI|C&#039;est détaillé ici]]. Avec un premier &amp;quot;hello world&amp;quot; qui fait clignoter une LED.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser l&#039;écran ===&lt;br /&gt;
J&#039;ai eu pas mal de problèmes pour utiliser l&#039;écran. Beaucoup de tutos (et aussi copilot) conseillent d&#039;utiliser la librairie &#039;&#039;&#039;TFT_eSPI&#039;&#039;&#039; mais je ne suis pas arrivé à l&#039;utiliser correctement.&lt;br /&gt;
&lt;br /&gt;
D&#039;autre part le branchement de l&#039;écran n&#039;est pas standard. &lt;br /&gt;
&lt;br /&gt;
==== Brochage ====&lt;br /&gt;
Dans le schéma de principe donné sur le site de p.kaczmarek2 on voit plusieurs choses.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ST7735 PINOUT.png|sans_cadre|429x429px]]&lt;br /&gt;
&lt;br /&gt;
Le pinout n&#039;est pas standard le &#039;backlight&amp;quot; n&#039;est pas réglable. Les LEDs de rétroéclairage sont alimentées en permanence à travers R11.&lt;br /&gt;
&lt;br /&gt;
En plus sur ce schéma les broches sont nommées SDA, SCL... alors que c&#039;est du SPI et pas ce I&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;C.&lt;br /&gt;
&lt;br /&gt;
Donc le fichier de définition est :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Mon fichier User_Setup.h complet est:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define USER_SETUP_ID 44&lt;br /&gt;
&lt;br /&gt;
#define ST7735_DRIVER&lt;br /&gt;
#define TFT_WIDTH 128&lt;br /&gt;
#define TFT_HEIGHT 128&lt;br /&gt;
&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN   11  // GPIO11 sur ESP32-C3&lt;br /&gt;
#define SWITCH_0  8   // GPIO08 sur ESP32-C3&lt;br /&gt;
#define SWITCH_1  10  // GPIO10 sur ESP32-C3&lt;br /&gt;
&lt;br /&gt;
#define TFT_RGB_ORDER TFT_BGR&lt;br /&gt;
#define TFT_INVERSION_ON&lt;br /&gt;
#define TFT_ROTATION 1&lt;br /&gt;
&lt;br /&gt;
#define SPI_FREQUENCY  27000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Librairie Adafruit ====&lt;br /&gt;
Donc la librairies &#039;&#039;&#039;TFT_eSPI&#039;&#039;&#039; ne marche pas avec cet écran (ou je ne suis pas arrivé à la faire marcher) j&#039;ai utilisé &#039;&#039;&#039;Adafruit_ST7735&#039;&#039;&#039; qui fonctionne très bien ([https://www.adafruit.com/ merci Lady Ada]).&lt;br /&gt;
&lt;br /&gt;
Associée à la librairies GFX du même Adafruit on a un joli environnement pour faire des dessins sur l&#039;écran.&lt;br /&gt;
&lt;br /&gt;
On déclare la librairie dans platformio.ini :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[env:adafruit_qtpy_esp32c3]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = adafruit_qtpy_esp32c3&lt;br /&gt;
framework = arduino&lt;br /&gt;
&lt;br /&gt;
lib_deps =&lt;br /&gt;
    adafruit/Adafruit ST7735 and ST7789 Library&lt;br /&gt;
    adafruit/Adafruit GFX Library&lt;br /&gt;
&lt;br /&gt;
build_flags =&lt;br /&gt;
    -DUSER_SETUP_LOADED=1&lt;br /&gt;
    -include src/User_Setup.h&lt;br /&gt;
&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
upload_speed = 921600&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque l&#039;inclusion du User_Setup.h montré ci dessus.&lt;br /&gt;
&lt;br /&gt;
Et dans le code source on ajoute:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_ST7735.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On déclare un objet Adafruit_ST7735 avec les broches données ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, MOSI_PIN, SCK_PIN, TFT_RST);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et on l&#039;initialise dans &amp;lt;code&amp;gt;setup()&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;tft.initR(INITR_144GREENTAB); &lt;br /&gt;
    tft.setRotation(3);&lt;br /&gt;
    tft.fillScreen(ST77XX_BLACK);   // Fill the screen with black color&lt;br /&gt;
    delay(100);&lt;br /&gt;
    tft.setRotation(2);&amp;lt;/syntaxhighlight&amp;gt;Ici y&#039;a deux remarques: &lt;br /&gt;
&lt;br /&gt;
* La constante INITR_144GREENTAB est à utiliser car le standard INITR_BLACKTAB est en mode RGB alors que notre écran est BGR (pourquoi ... pour faire genre je suppose).&lt;br /&gt;
* Ensuite, lors du premier démarrage le tft.fillScreen(ST77XX_BLACK);   &amp;quot;oublie&amp;quot; quelques lignes de pixels a droite et, pour éviter ce probléme je remplis deux fois en tournant virtuellement l&#039;écran. Il y a peut-etre une conf qui m&#039;échappe...&lt;br /&gt;
&lt;br /&gt;
===== La &amp;quot;default font&amp;quot; =====&lt;br /&gt;
Lorsque l&#039;on choisit la fonte par défaut (on qu&#039;on ne choisit rien) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
tft.setFont(); // Si une fonte avait été selectionnée avant. On reviens à la 7x5 par défaut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est une police de base 5x7 mais elle va plus loin que l&#039;ASCII standard. &lt;br /&gt;
&lt;br /&gt;
* On a des caractères valides avant 32 &lt;br /&gt;
* On a des caractères étendus après 127&lt;br /&gt;
&lt;br /&gt;
Le fichier qui le décrit s&#039;appelle &amp;lt;code&amp;gt;glcdfont.c&amp;lt;/code&amp;gt; et, dans un projet Visual Studio Code est situé : &amp;lt;code&amp;gt;.pio/libdeps/adafruit_qtpy_esp32c3/Adafruit GFX Library/glcdfont.c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La structure est simple chaque caractère est codé 5 octset représentant les 5 colonnes de bits.&lt;br /&gt;
&lt;br /&gt;
Apres un programme en C++ pour comprendre et un programme en python pour représenter je suis arrivé à :&lt;br /&gt;
[[Fichier:AdafruitGFX 5x7 font.png|sans_cadre|645x645px]]&lt;br /&gt;
Bon le 5x7 c&#039;est moche mais sur un écran 128x128 ca permet d&#039;afficher 16 lignes de 21 caractères (un peu moins que le 176 × 184 du vic 20)&lt;br /&gt;
&lt;br /&gt;
==== Exemple complet ====&lt;br /&gt;
Un programe démo complet est donné ici.&lt;br /&gt;
&lt;br /&gt;
C&#039;est un &amp;quot;LED Blink&amp;quot; amélioré.&lt;br /&gt;
&lt;br /&gt;
Il fait clignoter la LED sur GPIO11 au rythme de une fois par seconde (1000 ms) ajustable.&lt;br /&gt;
&lt;br /&gt;
L&#039;écran affichera:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Luxury blink.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On a en vert le période de &amp;quot;blink&amp;quot; et en blanc sur fond bleu le temps depuis le boot du device HH:MM:SS.&lt;br /&gt;
&lt;br /&gt;
Un petit bandeau bleu a gauche indique que les boutons &amp;quot;+&amp;quot; et &amp;quot;-&amp;quot; permettent d&#039;ajouter ou de retirer 10 ms à la période.&lt;br /&gt;
&lt;br /&gt;
RST est également affiché a côté du bouton reset.&lt;br /&gt;
&lt;br /&gt;
Le projet est constitué de 3 fichiers :&lt;br /&gt;
&lt;br /&gt;
===== platformio.ini =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;[env:adafruit_qtpy_esp32c3]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = adafruit_qtpy_esp32c3&lt;br /&gt;
framework = arduino&lt;br /&gt;
&lt;br /&gt;
lib_deps =&lt;br /&gt;
    adafruit/Adafruit ST7735 and ST7789 Library&lt;br /&gt;
    adafruit/Adafruit GFX Library&lt;br /&gt;
&lt;br /&gt;
build_flags =&lt;br /&gt;
    -DUSER_SETUP_LOADED=1&lt;br /&gt;
    -include src/User_Setup.h&lt;br /&gt;
&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
upload_speed = 921600&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== User_Setup.h =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define USER_SETUP_ID 44&lt;br /&gt;
&lt;br /&gt;
#define ST7735_DRIVER&lt;br /&gt;
#define TFT_WIDTH 128&lt;br /&gt;
#define TFT_HEIGHT 128&lt;br /&gt;
&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN   11  // GPIO11 sur ESP32-C3&lt;br /&gt;
#define SWITCH_0  8   // GPIO08 sur ESP32-C3&lt;br /&gt;
#define SWITCH_1  10  // GPIO10 sur ESP32-C3&lt;br /&gt;
&lt;br /&gt;
#define TFT_RGB_ORDER TFT_BGR&lt;br /&gt;
#define TFT_INVERSION_ON&lt;br /&gt;
#define TFT_ROTATION 1&lt;br /&gt;
&lt;br /&gt;
#define SPI_FREQUENCY  27000000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== main.cpp =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_ST7735.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Fonts/FreeSans9pt7b.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Fonts/FreeSans12pt7b.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, MOSI_PIN, SCK_PIN, TFT_RST);&lt;br /&gt;
&lt;br /&gt;
int periode = 1000;&lt;br /&gt;
&lt;br /&gt;
void display(){&lt;br /&gt;
  tft.fillScreen(tft.color565(128, 128, 128));   // Fill the screen with black color&lt;br /&gt;
  tft.setCursor(20, 15);            // Set cursor at the top-left corner&lt;br /&gt;
  tft.setTextColor(ST77XX_WHITE); // Set text color to white&lt;br /&gt;
  tft.setFont();&lt;br /&gt;
  tft.print(&amp;quot;Blink test...&amp;quot;);       // Print the message&lt;br /&gt;
  tft.fillRect(0,0,15,TFT_HEIGHT,tft.color565(0, 0, 128));&lt;br /&gt;
  tft.drawRect(0,0,15,TFT_HEIGHT,ST77XX_BLACK);&lt;br /&gt;
&lt;br /&gt;
  tft.setCursor(5, 10); tft.print(&amp;quot;+&amp;quot;);  &lt;br /&gt;
  tft.setCursor(5, 110); tft.print(&amp;quot;-&amp;quot;);  &lt;br /&gt;
  tft.setCursor(100, 110); tft.print(&amp;quot;RST&amp;quot;);  &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void update(){&lt;br /&gt;
  int16_t margin=5;&lt;br /&gt;
  int16_t x=25;&lt;br /&gt;
  int16_t y=50;&lt;br /&gt;
  int16_t x1, y1;&lt;br /&gt;
  uint16_t w, h;&lt;br /&gt;
  String displayStr=&amp;quot; &amp;quot;+String(millis())+&amp;quot; ms &amp;quot;;&lt;br /&gt;
  tft.setFont(&amp;amp;FreeSans9pt7b);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  tft.getTextBounds(displayStr, x, y, &amp;amp;x1, &amp;amp;y1, &amp;amp;w, &amp;amp;h);&lt;br /&gt;
  uint16_t real_w = TFT_WIDTH-x1-margin;&lt;br /&gt;
  tft.fillRect(x1-margin, y1-margin, real_w, h+margin*2, ST77XX_BLACK); // efface la zone&lt;br /&gt;
  tft.setCursor(x, y);            // Set cursor at the top-left corner&lt;br /&gt;
  tft.setTextColor(ST77XX_GREEN); // Set text color to green&lt;br /&gt;
  tft.print(String(periode)+&amp;quot; ms&amp;quot;);       // Print the message    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void update_time(){&lt;br /&gt;
  int16_t margin=5;&lt;br /&gt;
  int16_t x=25;&lt;br /&gt;
  int16_t y=90;&lt;br /&gt;
  int16_t x1, y1;&lt;br /&gt;
  uint16_t w, h;&lt;br /&gt;
  uint32_t ti=millis();&lt;br /&gt;
  uint16_t ss=ti/1000;&lt;br /&gt;
  uint16_t mm=ss/60;&lt;br /&gt;
  ss=ss-(mm*60);&lt;br /&gt;
  uint16_t hh=mm/60;&lt;br /&gt;
  mm=mm-(hh*60);&lt;br /&gt;
  String displayStr=(hh &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(hh)+&amp;quot;:&amp;quot;+\&lt;br /&gt;
                    (mm &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(mm)+&amp;quot;:&amp;quot;+\&lt;br /&gt;
                    (ss &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(ss);&lt;br /&gt;
  tft.setFont(&amp;amp;FreeSans12pt7b);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  tft.getTextBounds(displayStr, x, y, &amp;amp;x1, &amp;amp;y1, &amp;amp;w, &amp;amp;h);&lt;br /&gt;
  uint16_t real_w = TFT_WIDTH-x1-margin;&lt;br /&gt;
  tft.fillRect(x1-margin, y1-margin, real_w, h+margin*2, tft.color565(0, 0, 128)); // efface la zone&lt;br /&gt;
  tft.drawRect(x1-margin, y1-margin, real_w, h+margin*2,ST77XX_BLACK);&lt;br /&gt;
  tft.setTextColor(ST77XX_WHITE);       &lt;br /&gt;
  tft.setCursor(x, y);&lt;br /&gt;
  tft.print(displayStr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Démarrage ESP32-C3...&amp;quot;);&lt;br /&gt;
  Serial.println(periode);&lt;br /&gt;
  pinMode(LED_PIN, OUTPUT);&lt;br /&gt;
  pinMode(SWITCH_0, INPUT_PULLUP);&lt;br /&gt;
  pinMode(SWITCH_1, INPUT_PULLUP);&lt;br /&gt;
  Serial.println(&amp;quot;Init écran ST7735...&amp;quot;);&lt;br /&gt;
  tft.initR(INITR_144GREENTAB); &lt;br /&gt;
  tft.setRotation(3);&lt;br /&gt;
  tft.fillScreen(ST77XX_BLACK);   // Fill the screen with black color&lt;br /&gt;
  delay(100);&lt;br /&gt;
  tft.setRotation(2);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  display();&lt;br /&gt;
  update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (digitalRead(SWITCH_0)==LOW){&lt;br /&gt;
    periode-=10;&lt;br /&gt;
    if (periode&amp;lt;100)&lt;br /&gt;
      periode=100;&lt;br /&gt;
    Serial.println(periode);&lt;br /&gt;
    update();&lt;br /&gt;
    delay(10);&lt;br /&gt;
    while (digitalRead(SWITCH_0)==LOW)&lt;br /&gt;
      delay(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (digitalRead(SWITCH_1)==LOW){&lt;br /&gt;
    periode+=10;&lt;br /&gt;
    if (periode&amp;gt;2000)&lt;br /&gt;
      periode=2000;&lt;br /&gt;
    Serial.println(periode);&lt;br /&gt;
    update();&lt;br /&gt;
    delay(10);&lt;br /&gt;
    while (digitalRead(SWITCH_1)==LOW)&lt;br /&gt;
      delay(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if ((millis() % periode)&amp;lt; (periode/2))&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);&lt;br /&gt;
  else&lt;br /&gt;
    digitalWrite(LED_PIN, LOW);&lt;br /&gt;
  &lt;br /&gt;
  if ((millis() % 1000)==0)&lt;br /&gt;
    update_time();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:AdafruitGFX_5x7_font.png&amp;diff=1975</id>
		<title>Fichier:AdafruitGFX 5x7 font.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:AdafruitGFX_5x7_font.png&amp;diff=1975"/>
		<updated>2026-05-13T19:21:25Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La poulice Adafruit par défaut (5x7)&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Alice_et_bob_private_public.png&amp;diff=1974</id>
		<title>Fichier:Alice et bob private public.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Alice_et_bob_private_public.png&amp;diff=1974"/>
		<updated>2026-05-11T21:23:48Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Alice et bob private public.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alice et bob private public&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:M%C3%A9canisme_cl%C3%A9s_asym%C3%A9triques.png&amp;diff=1973</id>
		<title>Fichier:Mécanisme clés asymétriques.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:M%C3%A9canisme_cl%C3%A9s_asym%C3%A9triques.png&amp;diff=1973"/>
		<updated>2026-05-11T21:13:36Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Mécanisme clés asymétriques.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;mécanisme clés asymétriques&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Alice-bob-mallory.png&amp;diff=1972</id>
		<title>Fichier:Alice-bob-mallory.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Alice-bob-mallory.png&amp;diff=1972"/>
		<updated>2026-05-11T21:08:53Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Alice-bob-mallory.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;illustration crypto&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1971</id>
		<title>ESP32C3 avec écran spotear</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1971"/>
		<updated>2026-05-08T20:56:22Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Recherche de documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Appelé en français &amp;quot;Mini ornement de Bureau&amp;quot; voici le module ESP32 C3 équipé de son écran. Personnellement c&#039;est mon premier C3 donc mes débuts en RISC-V. Bon tant que je fais du C avec l&#039;IDE Arduino ca devrait pas trop se voir.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget.png|vignette|220x220px]]&lt;br /&gt;
&lt;br /&gt;
== Premier contact ==&lt;br /&gt;
Apres avoir joué au petit mécano pour monter le bidule. On le branche sur une alim USB (micro USB le design ne date pas d&#039;hier).&lt;br /&gt;
&lt;br /&gt;
On le branche et il affiche un message (assez moche en vérité) indiquant de configurer son &amp;quot;mobile WLAN&amp;quot; avec les paramètres :&lt;br /&gt;
&lt;br /&gt;
SSID : spotpear (c&#039;est le fabricant)&lt;br /&gt;
&lt;br /&gt;
WIFI Key : 12345678&lt;br /&gt;
&lt;br /&gt;
On peut pas plus sûr comme mot de passe !&lt;br /&gt;
&lt;br /&gt;
Le message du dessous me parait me parait assez ésotérique. Ca sent la traduction du chinois fait pas une IA poussive.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget+wifi.png|gauche|vignette|215x215px]]&lt;br /&gt;
Je configure un routeur avec ces paramètres et je rebranche le bigonx.&lt;br /&gt;
&lt;br /&gt;
Une belle barre de progression s&#039;affiche et ensuite un superbe écran!&lt;br /&gt;
&lt;br /&gt;
Que c&#039;est beau!&lt;br /&gt;
&lt;br /&gt;
A première vue:&lt;br /&gt;
&lt;br /&gt;
* L&#039;écran est très correct. Lumineux et lisible.&lt;br /&gt;
* &amp;lt;u&amp;gt;Pour le mini firmware:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;heure locale est juste. Il sait se mètre à l&#039;heure et détecte correctement le fuseau horaire et l&#039;heure été/hiver&lt;br /&gt;
&lt;br /&gt;
* La date est bonne&lt;br /&gt;
* La localisation à Clichy est fausse (on est a Paris aujourd&#039;hui)&lt;br /&gt;
* La température semble correcte le service météo est juste en revanche le fait d&#039;afficher en °F alors qu&#039;on est a Clichy...Bof bof.&lt;br /&gt;
* La météo est correcte (il pleut, il pleut en ce mois de mars 2026)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le barre de progression du wifi étant verte et le symbole &amp;quot;Temp&amp;quot; en bleu je suppose que cet écran est RGB. (Chercher le rouge)&lt;br /&gt;
&lt;br /&gt;
== Recherche de documentation ==&lt;br /&gt;
Le bidule acheté 9€ sur Aliexpress est livré avec.... 8 entretoises 8 vis une façade trouée pour l&#039;écran et un bout de plastique noir pour le fond. Mais .... Aucune doc.&lt;br /&gt;
&lt;br /&gt;
Pas grave y&#039;a Google et Gemini.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai trouvé :&lt;br /&gt;
&lt;br /&gt;
https://www.elektroda.com/news/news4091334.html  où un certain p.kaczmarek2 détaille tout le processus d&#039;utilisation.&lt;br /&gt;
&lt;br /&gt;
Dedans j&#039;ai trouvé le schéma électronique.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SCHEMA ELEC SPOTEAR.png|sans_cadre|836x836px]]&lt;br /&gt;
&lt;br /&gt;
https://spotpear.com/wiki/ESP32-C3-desktop-trinket-Mini-TV-Portable-Pendant-LVGL-1.44inch-LCD-ST7735.html le site du fabricant.&lt;br /&gt;
&lt;br /&gt;
== Niveau Hardware ==&lt;br /&gt;
La carte est assez simple on y trouve :&lt;br /&gt;
&lt;br /&gt;
* Le joli écran de 1,44&amp;lt;nowiki&amp;gt;&#039;&#039; de 128x128 pixel  (on est loin du 300 ppp) utilisé en SPI (peut être possible en I2C). Pour les personnes normales utilisant le système métrique (le monde entier sauf les USA, le Libéria et la Birmanie je crois) 1.44&#039;&#039; ca fait 36,6 mm. La taille doit venir de ces unités exotiques où un pouce est divisé en 144 points. Je sais pas j&#039;ai pas l&#039;&amp;lt;/nowiki&amp;gt;habitude... Doit y avoir une logique.&lt;br /&gt;
* Une prise pour une batterie et un circuit de charge PL4054&lt;br /&gt;
* Un régulateur linéaire pour faire du 3.3 V CAT 6219 qui m&#039;a pas l&#039;aire d&#039;être tout jeune&lt;br /&gt;
* Un quartz 40 MHz&lt;br /&gt;
* Une petite mémoire flash de 128 Mbits (16b Mo) W25q128 &lt;br /&gt;
* 4 boutons poussoirs &lt;br /&gt;
** RESET (ou plutôt CHIP_EN) avec son petit circuit de reset automatique&lt;br /&gt;
** Un bouton BOOT cablé sur IO09&lt;br /&gt;
** Deux boutons (actifs bas) sur IO8 et I010&lt;br /&gt;
* Une led sur IO11&lt;br /&gt;
* Une LED qui, si je comprends le schéma électronique s&#039;allume quand le batterie se charge  &lt;br /&gt;
* Le port USB est relié au ESP32C3 qui doit savoir le gérer en natif (pas de FTDI ou autre)&lt;br /&gt;
* 5 GPIO accessibles sur 6 broches &lt;br /&gt;
** GPIO1&lt;br /&gt;
** GPIO6&lt;br /&gt;
** GPIO7&lt;br /&gt;
** GPIO20&lt;br /&gt;
** GPIO21&lt;br /&gt;
* Une broches de masse (coté GPIO)&lt;br /&gt;
* Une broche +5V et une +3.3V autour du port µUSB&lt;br /&gt;
&lt;br /&gt;
== Niveau developpement ==&lt;br /&gt;
Il faut installer un environnement correct. [[Poste de DEV ESP32 sur PI|C&#039;est détaillé ici]]. Avec un premier &amp;quot;hello world&amp;quot; qui fait clignoter une LED.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser l&#039;écran ===&lt;br /&gt;
J&#039;ai eu pas mal de problèmes pour utiliser l&#039;écran. Beaucoup de tutos (et aussi copilot) conseillent d&#039;utiliser la librairie &#039;&#039;&#039;TFT_eSPI&#039;&#039;&#039; mais je ne suis pas arrivé à l&#039;utiliser correctement.&lt;br /&gt;
&lt;br /&gt;
D&#039;autre part le branchement de l&#039;écran n&#039;est pas standard. &lt;br /&gt;
&lt;br /&gt;
==== Brochage ====&lt;br /&gt;
Dans le schéma de principe donné sur le site de p.kaczmarek2 on voit plusieurs choses.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ST7735 PINOUT.png|sans_cadre|429x429px]]&lt;br /&gt;
&lt;br /&gt;
Le pinout n&#039;est pas standard le &#039;backlight&amp;quot; n&#039;est pas réglable. Les LEDs de rétroéclairage sont alimentées en permanence à travers R11.&lt;br /&gt;
&lt;br /&gt;
En plus sur ce schéma les broches sont nommées SDA, SCL... alors que c&#039;est du SPI et pas ce I&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;C.&lt;br /&gt;
&lt;br /&gt;
Donc le fichier de définition est :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Mon fichier User_Setup.h complet est:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define USER_SETUP_ID 44&lt;br /&gt;
&lt;br /&gt;
#define ST7735_DRIVER&lt;br /&gt;
#define TFT_WIDTH 128&lt;br /&gt;
#define TFT_HEIGHT 128&lt;br /&gt;
&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN   11  // GPIO11 sur ESP32-C3&lt;br /&gt;
#define SWITCH_0  8   // GPIO08 sur ESP32-C3&lt;br /&gt;
#define SWITCH_1  10  // GPIO10 sur ESP32-C3&lt;br /&gt;
&lt;br /&gt;
#define TFT_RGB_ORDER TFT_BGR&lt;br /&gt;
#define TFT_INVERSION_ON&lt;br /&gt;
#define TFT_ROTATION 1&lt;br /&gt;
&lt;br /&gt;
#define SPI_FREQUENCY  27000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Librairie Adafruit ====&lt;br /&gt;
Donc la librairies &#039;&#039;&#039;TFT_eSPI&#039;&#039;&#039; ne marche pas avec cet écran (ou je ne suis pas arrivé à la faire marcher) j&#039;ai utilisé &#039;&#039;&#039;Adafruit_ST7735&#039;&#039;&#039; qui fonctionne très bien ([https://www.adafruit.com/ merci Lady Ada]).&lt;br /&gt;
&lt;br /&gt;
Associée à la librairies GFX du même Adafruit on a un joli environnement pour faire des dessins sur l&#039;écran.&lt;br /&gt;
&lt;br /&gt;
On déclare la librairie dans platformio.ini :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[env:adafruit_qtpy_esp32c3]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = adafruit_qtpy_esp32c3&lt;br /&gt;
framework = arduino&lt;br /&gt;
&lt;br /&gt;
lib_deps =&lt;br /&gt;
    adafruit/Adafruit ST7735 and ST7789 Library&lt;br /&gt;
    adafruit/Adafruit GFX Library&lt;br /&gt;
&lt;br /&gt;
build_flags =&lt;br /&gt;
    -DUSER_SETUP_LOADED=1&lt;br /&gt;
    -include src/User_Setup.h&lt;br /&gt;
&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
upload_speed = 921600&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque l&#039;inclusion du User_Setup.h montré ci dessus.&lt;br /&gt;
&lt;br /&gt;
Et dans le code source on ajoute:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_ST7735.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On déclare un objet Adafruit_ST7735 avec les broches données ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, MOSI_PIN, SCK_PIN, TFT_RST);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et on l&#039;initialise dans &amp;lt;code&amp;gt;setup()&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;tft.initR(INITR_144GREENTAB); &lt;br /&gt;
    tft.setRotation(3);&lt;br /&gt;
    tft.fillScreen(ST77XX_BLACK);   // Fill the screen with black color&lt;br /&gt;
    delay(100);&lt;br /&gt;
    tft.setRotation(2);&amp;lt;/syntaxhighlight&amp;gt;Ici y&#039;a deux remarques: &lt;br /&gt;
&lt;br /&gt;
* La constante INITR_144GREENTAB est à utiliser car le standard INITR_BLACKTAB est en mode RGB alors que notre écran est BGR (pourquoi ... pour faire genre je suppose).&lt;br /&gt;
* Ensuite, lors du premier démarrage le tft.fillScreen(ST77XX_BLACK);   &amp;quot;oublie&amp;quot; quelques lignes de pixels a droite et, pour éviter ce probléme je remplis deux fois en tournant virtuellement l&#039;écran. Il y a peut-etre une conf qui m&#039;échappe...&lt;br /&gt;
&lt;br /&gt;
==== Exemple complet ====&lt;br /&gt;
Un programe démo complet est donné ici.&lt;br /&gt;
&lt;br /&gt;
C&#039;est un &amp;quot;LED Blink&amp;quot; amélioré.&lt;br /&gt;
&lt;br /&gt;
Il fait clignoter la LED sur GPIO11 au rythme de une fois par seconde (1000 ms) ajustable.&lt;br /&gt;
&lt;br /&gt;
L&#039;écran affichera:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Luxury blink.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On a en vert le période de &amp;quot;blink&amp;quot; et en blanc sur fond bleu le temps depuis le boot du device HH:MM:SS.&lt;br /&gt;
&lt;br /&gt;
Un petit bandeau bleu a gauche indique que les boutons &amp;quot;+&amp;quot; et &amp;quot;-&amp;quot; permettent d&#039;ajouter ou de retirer 10 ms à la période.&lt;br /&gt;
&lt;br /&gt;
RST est également affiché a côté du bouton reset.&lt;br /&gt;
&lt;br /&gt;
Le projet est constitué de 3 fichiers :&lt;br /&gt;
&lt;br /&gt;
===== platformio.ini =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;[env:adafruit_qtpy_esp32c3]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = adafruit_qtpy_esp32c3&lt;br /&gt;
framework = arduino&lt;br /&gt;
&lt;br /&gt;
lib_deps =&lt;br /&gt;
    adafruit/Adafruit ST7735 and ST7789 Library&lt;br /&gt;
    adafruit/Adafruit GFX Library&lt;br /&gt;
&lt;br /&gt;
build_flags =&lt;br /&gt;
    -DUSER_SETUP_LOADED=1&lt;br /&gt;
    -include src/User_Setup.h&lt;br /&gt;
&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
upload_speed = 921600&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== User_Setup.h =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define USER_SETUP_ID 44&lt;br /&gt;
&lt;br /&gt;
#define ST7735_DRIVER&lt;br /&gt;
#define TFT_WIDTH 128&lt;br /&gt;
#define TFT_HEIGHT 128&lt;br /&gt;
&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN   11  // GPIO11 sur ESP32-C3&lt;br /&gt;
#define SWITCH_0  8   // GPIO08 sur ESP32-C3&lt;br /&gt;
#define SWITCH_1  10  // GPIO10 sur ESP32-C3&lt;br /&gt;
&lt;br /&gt;
#define TFT_RGB_ORDER TFT_BGR&lt;br /&gt;
#define TFT_INVERSION_ON&lt;br /&gt;
#define TFT_ROTATION 1&lt;br /&gt;
&lt;br /&gt;
#define SPI_FREQUENCY  27000000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== main.cpp =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_ST7735.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Fonts/FreeSans9pt7b.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Fonts/FreeSans12pt7b.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, MOSI_PIN, SCK_PIN, TFT_RST);&lt;br /&gt;
&lt;br /&gt;
int periode = 1000;&lt;br /&gt;
&lt;br /&gt;
void display(){&lt;br /&gt;
  tft.fillScreen(tft.color565(128, 128, 128));   // Fill the screen with black color&lt;br /&gt;
  tft.setCursor(20, 15);            // Set cursor at the top-left corner&lt;br /&gt;
  tft.setTextColor(ST77XX_WHITE); // Set text color to white&lt;br /&gt;
  tft.setFont();&lt;br /&gt;
  tft.print(&amp;quot;Blink test...&amp;quot;);       // Print the message&lt;br /&gt;
  tft.fillRect(0,0,15,TFT_HEIGHT,tft.color565(0, 0, 128));&lt;br /&gt;
  tft.drawRect(0,0,15,TFT_HEIGHT,ST77XX_BLACK);&lt;br /&gt;
&lt;br /&gt;
  tft.setCursor(5, 10); tft.print(&amp;quot;+&amp;quot;);  &lt;br /&gt;
  tft.setCursor(5, 110); tft.print(&amp;quot;-&amp;quot;);  &lt;br /&gt;
  tft.setCursor(100, 110); tft.print(&amp;quot;RST&amp;quot;);  &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void update(){&lt;br /&gt;
  int16_t margin=5;&lt;br /&gt;
  int16_t x=25;&lt;br /&gt;
  int16_t y=50;&lt;br /&gt;
  int16_t x1, y1;&lt;br /&gt;
  uint16_t w, h;&lt;br /&gt;
  String displayStr=&amp;quot; &amp;quot;+String(millis())+&amp;quot; ms &amp;quot;;&lt;br /&gt;
  tft.setFont(&amp;amp;FreeSans9pt7b);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  tft.getTextBounds(displayStr, x, y, &amp;amp;x1, &amp;amp;y1, &amp;amp;w, &amp;amp;h);&lt;br /&gt;
  uint16_t real_w = TFT_WIDTH-x1-margin;&lt;br /&gt;
  tft.fillRect(x1-margin, y1-margin, real_w, h+margin*2, ST77XX_BLACK); // efface la zone&lt;br /&gt;
  tft.setCursor(x, y);            // Set cursor at the top-left corner&lt;br /&gt;
  tft.setTextColor(ST77XX_GREEN); // Set text color to green&lt;br /&gt;
  tft.print(String(periode)+&amp;quot; ms&amp;quot;);       // Print the message    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void update_time(){&lt;br /&gt;
  int16_t margin=5;&lt;br /&gt;
  int16_t x=25;&lt;br /&gt;
  int16_t y=90;&lt;br /&gt;
  int16_t x1, y1;&lt;br /&gt;
  uint16_t w, h;&lt;br /&gt;
  uint32_t ti=millis();&lt;br /&gt;
  uint16_t ss=ti/1000;&lt;br /&gt;
  uint16_t mm=ss/60;&lt;br /&gt;
  ss=ss-(mm*60);&lt;br /&gt;
  uint16_t hh=mm/60;&lt;br /&gt;
  mm=mm-(hh*60);&lt;br /&gt;
  String displayStr=(hh &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(hh)+&amp;quot;:&amp;quot;+\&lt;br /&gt;
                    (mm &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(mm)+&amp;quot;:&amp;quot;+\&lt;br /&gt;
                    (ss &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(ss);&lt;br /&gt;
  tft.setFont(&amp;amp;FreeSans12pt7b);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  tft.getTextBounds(displayStr, x, y, &amp;amp;x1, &amp;amp;y1, &amp;amp;w, &amp;amp;h);&lt;br /&gt;
  uint16_t real_w = TFT_WIDTH-x1-margin;&lt;br /&gt;
  tft.fillRect(x1-margin, y1-margin, real_w, h+margin*2, tft.color565(0, 0, 128)); // efface la zone&lt;br /&gt;
  tft.drawRect(x1-margin, y1-margin, real_w, h+margin*2,ST77XX_BLACK);&lt;br /&gt;
  tft.setTextColor(ST77XX_WHITE);       &lt;br /&gt;
  tft.setCursor(x, y);&lt;br /&gt;
  tft.print(displayStr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Démarrage ESP32-C3...&amp;quot;);&lt;br /&gt;
  Serial.println(periode);&lt;br /&gt;
  pinMode(LED_PIN, OUTPUT);&lt;br /&gt;
  pinMode(SWITCH_0, INPUT_PULLUP);&lt;br /&gt;
  pinMode(SWITCH_1, INPUT_PULLUP);&lt;br /&gt;
  Serial.println(&amp;quot;Init écran ST7735...&amp;quot;);&lt;br /&gt;
  tft.initR(INITR_144GREENTAB); &lt;br /&gt;
  tft.setRotation(3);&lt;br /&gt;
  tft.fillScreen(ST77XX_BLACK);   // Fill the screen with black color&lt;br /&gt;
  delay(100);&lt;br /&gt;
  tft.setRotation(2);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  display();&lt;br /&gt;
  update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (digitalRead(SWITCH_0)==LOW){&lt;br /&gt;
    periode-=10;&lt;br /&gt;
    if (periode&amp;lt;100)&lt;br /&gt;
      periode=100;&lt;br /&gt;
    Serial.println(periode);&lt;br /&gt;
    update();&lt;br /&gt;
    delay(10);&lt;br /&gt;
    while (digitalRead(SWITCH_0)==LOW)&lt;br /&gt;
      delay(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (digitalRead(SWITCH_1)==LOW){&lt;br /&gt;
    periode+=10;&lt;br /&gt;
    if (periode&amp;gt;2000)&lt;br /&gt;
      periode=2000;&lt;br /&gt;
    Serial.println(periode);&lt;br /&gt;
    update();&lt;br /&gt;
    delay(10);&lt;br /&gt;
    while (digitalRead(SWITCH_1)==LOW)&lt;br /&gt;
      delay(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if ((millis() % periode)&amp;lt; (periode/2))&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);&lt;br /&gt;
  else&lt;br /&gt;
    digitalWrite(LED_PIN, LOW);&lt;br /&gt;
  &lt;br /&gt;
  if ((millis() % 1000)==0)&lt;br /&gt;
    update_time();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:SCHEMA_ELEC_SPOTEAR.png&amp;diff=1970</id>
		<title>Fichier:SCHEMA ELEC SPOTEAR.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:SCHEMA_ELEC_SPOTEAR.png&amp;diff=1970"/>
		<updated>2026-05-08T20:55:31Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schéme électronique&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1969</id>
		<title>ESP32C3 avec écran spotear</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1969"/>
		<updated>2026-05-08T15:39:44Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Exemple complet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Appelé en français &amp;quot;Mini ornement de Bureau&amp;quot; voici le module ESP32 C3 équipé de son écran. Personnellement c&#039;est mon premier C3 donc mes débuts en RISC-V. Bon tant que je fais du C avec l&#039;IDE Arduino ca devrait pas trop se voir.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget.png|vignette|220x220px]]&lt;br /&gt;
&lt;br /&gt;
== Premier contact ==&lt;br /&gt;
Apres avoir joué au petit mécano pour monter le bidule. On le branche sur une alim USB (micro USB le design ne date pas d&#039;hier).&lt;br /&gt;
&lt;br /&gt;
On le branche et il affiche un message (assez moche en vérité) indiquant de configurer son &amp;quot;mobile WLAN&amp;quot; avec les paramètres :&lt;br /&gt;
&lt;br /&gt;
SSID : spotpear (c&#039;est le fabricant)&lt;br /&gt;
&lt;br /&gt;
WIFI Key : 12345678&lt;br /&gt;
&lt;br /&gt;
On peut pas plus sûr comme mot de passe !&lt;br /&gt;
&lt;br /&gt;
Le message du dessous me parait me parait assez ésotérique. Ca sent la traduction du chinois fait pas une IA poussive.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget+wifi.png|gauche|vignette|215x215px]]&lt;br /&gt;
Je configure un routeur avec ces paramètres et je rebranche le bigonx.&lt;br /&gt;
&lt;br /&gt;
Une belle barre de progression s&#039;affiche et ensuite un superbe écran!&lt;br /&gt;
&lt;br /&gt;
Que c&#039;est beau!&lt;br /&gt;
&lt;br /&gt;
A première vue:&lt;br /&gt;
&lt;br /&gt;
* L&#039;écran est très correct. Lumineux et lisible.&lt;br /&gt;
* &amp;lt;u&amp;gt;Pour le mini firmware:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;heure locale est juste. Il sait se mètre à l&#039;heure et détecte correctement le fuseau horaire et l&#039;heure été/hiver&lt;br /&gt;
&lt;br /&gt;
* La date est bonne&lt;br /&gt;
* La localisation à Clichy est fausse (on est a Paris aujourd&#039;hui)&lt;br /&gt;
* La température semble correcte le service météo est juste en revanche le fait d&#039;afficher en °F alors qu&#039;on est a Clichy...Bof bof.&lt;br /&gt;
* La météo est correcte (il pleut, il pleut en ce mois de mars 2026)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le barre de progression du wifi étant verte et le symbole &amp;quot;Temp&amp;quot; en bleu je suppose que cet écran est RGB. (Chercher le rouge)&lt;br /&gt;
&lt;br /&gt;
== Recherche de documentation ==&lt;br /&gt;
Le bidule acheté 9€ sur Aliexpress est livré avec.... 8 entretoises 8 vis une façade trouée pour l&#039;écran et un bout de plastique noir pour le fond. Mais .... Aucune doc.&lt;br /&gt;
&lt;br /&gt;
Pas grave y&#039;a Google et Gemini.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai trouvé :&lt;br /&gt;
&lt;br /&gt;
https://www.elektroda.com/news/news4091334.html  où un certain p.kaczmarek2 détaille tout le processus d&#039;utilisation.&lt;br /&gt;
&lt;br /&gt;
https://spotpear.com/wiki/ESP32-C3-desktop-trinket-Mini-TV-Portable-Pendant-LVGL-1.44inch-LCD-ST7735.html le site du fabricant.&lt;br /&gt;
&lt;br /&gt;
== Niveau Hardware ==&lt;br /&gt;
La carte est assez simple on y trouve :&lt;br /&gt;
&lt;br /&gt;
* Le joli écran de 1,44&amp;lt;nowiki&amp;gt;&#039;&#039; de 128x128 pixel  (on est loin du 300 ppp) utilisé en SPI (peut être possible en I2C). Pour les personnes normales utilisant le système métrique (le monde entier sauf les USA, le Libéria et la Birmanie je crois) 1.44&#039;&#039; ca fait 36,6 mm. La taille doit venir de ces unités exotiques où un pouce est divisé en 144 points. Je sais pas j&#039;ai pas l&#039;&amp;lt;/nowiki&amp;gt;habitude... Doit y avoir une logique.&lt;br /&gt;
* Une prise pour une batterie et un circuit de charge PL4054&lt;br /&gt;
* Un régulateur linéaire pour faire du 3.3 V CAT 6219 qui m&#039;a pas l&#039;aire d&#039;être tout jeune&lt;br /&gt;
* Un quartz 40 MHz&lt;br /&gt;
* Une petite mémoire flash de 128 Mbits (16b Mo) W25q128 &lt;br /&gt;
* 4 boutons poussoirs &lt;br /&gt;
** RESET (ou plutôt CHIP_EN) avec son petit circuit de reset automatique&lt;br /&gt;
** Un bouton BOOT cablé sur IO09&lt;br /&gt;
** Deux boutons (actifs bas) sur IO8 et I010&lt;br /&gt;
* Une led sur IO11&lt;br /&gt;
* Une LED qui, si je comprends le schéma électronique s&#039;allume quand le batterie se charge  &lt;br /&gt;
* Le port USB est relié au ESP32C3 qui doit savoir le gérer en natif (pas de FTDI ou autre)&lt;br /&gt;
* 5 GPIO accessibles sur 6 broches &lt;br /&gt;
** GPIO1&lt;br /&gt;
** GPIO6&lt;br /&gt;
** GPIO7&lt;br /&gt;
** GPIO20&lt;br /&gt;
** GPIO21&lt;br /&gt;
* Une broches de masse (coté GPIO)&lt;br /&gt;
* Une broche +5V et une +3.3V autour du port µUSB&lt;br /&gt;
&lt;br /&gt;
== Niveau developpement ==&lt;br /&gt;
Il faut installer un environnement correct. [[Poste de DEV ESP32 sur PI|C&#039;est détaillé ici]]. Avec un premier &amp;quot;hello world&amp;quot; qui fait clignoter une LED.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser l&#039;écran ===&lt;br /&gt;
J&#039;ai eu pas mal de problèmes pour utiliser l&#039;écran. Beaucoup de tutos (et aussi copilot) conseillent d&#039;utiliser la librairie &#039;&#039;&#039;TFT_eSPI&#039;&#039;&#039; mais je ne suis pas arrivé à l&#039;utiliser correctement.&lt;br /&gt;
&lt;br /&gt;
D&#039;autre part le branchement de l&#039;écran n&#039;est pas standard. &lt;br /&gt;
&lt;br /&gt;
==== Brochage ====&lt;br /&gt;
Dans le schéma de principe donné sur le site de p.kaczmarek2 on voit plusieurs choses.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ST7735 PINOUT.png|sans_cadre|429x429px]]&lt;br /&gt;
&lt;br /&gt;
Le pinout n&#039;est pas standard le &#039;backlight&amp;quot; n&#039;est pas réglable. Les LEDs de rétroéclairage sont alimentées en permanence à travers R11.&lt;br /&gt;
&lt;br /&gt;
En plus sur ce schéma les broches sont nommées SDA, SCL... alors que c&#039;est du SPI et pas ce I&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;C.&lt;br /&gt;
&lt;br /&gt;
Donc le fichier de définition est :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Mon fichier User_Setup.h complet est:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define USER_SETUP_ID 44&lt;br /&gt;
&lt;br /&gt;
#define ST7735_DRIVER&lt;br /&gt;
#define TFT_WIDTH 128&lt;br /&gt;
#define TFT_HEIGHT 128&lt;br /&gt;
&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN   11  // GPIO11 sur ESP32-C3&lt;br /&gt;
#define SWITCH_0  8   // GPIO08 sur ESP32-C3&lt;br /&gt;
#define SWITCH_1  10  // GPIO10 sur ESP32-C3&lt;br /&gt;
&lt;br /&gt;
#define TFT_RGB_ORDER TFT_BGR&lt;br /&gt;
#define TFT_INVERSION_ON&lt;br /&gt;
#define TFT_ROTATION 1&lt;br /&gt;
&lt;br /&gt;
#define SPI_FREQUENCY  27000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Librairie Adafruit ====&lt;br /&gt;
Donc la librairies &#039;&#039;&#039;TFT_eSPI&#039;&#039;&#039; ne marche pas avec cet écran (ou je ne suis pas arrivé à la faire marcher) j&#039;ai utilisé &#039;&#039;&#039;Adafruit_ST7735&#039;&#039;&#039; qui fonctionne très bien ([https://www.adafruit.com/ merci Lady Ada]).&lt;br /&gt;
&lt;br /&gt;
Associée à la librairies GFX du même Adafruit on a un joli environnement pour faire des dessins sur l&#039;écran.&lt;br /&gt;
&lt;br /&gt;
On déclare la librairie dans platformio.ini :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[env:adafruit_qtpy_esp32c3]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = adafruit_qtpy_esp32c3&lt;br /&gt;
framework = arduino&lt;br /&gt;
&lt;br /&gt;
lib_deps =&lt;br /&gt;
    adafruit/Adafruit ST7735 and ST7789 Library&lt;br /&gt;
    adafruit/Adafruit GFX Library&lt;br /&gt;
&lt;br /&gt;
build_flags =&lt;br /&gt;
    -DUSER_SETUP_LOADED=1&lt;br /&gt;
    -include src/User_Setup.h&lt;br /&gt;
&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
upload_speed = 921600&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque l&#039;inclusion du User_Setup.h montré ci dessus.&lt;br /&gt;
&lt;br /&gt;
Et dans le code source on ajoute:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_ST7735.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On déclare un objet Adafruit_ST7735 avec les broches données ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, MOSI_PIN, SCK_PIN, TFT_RST);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et on l&#039;initialise dans &amp;lt;code&amp;gt;setup()&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;tft.initR(INITR_144GREENTAB); &lt;br /&gt;
    tft.setRotation(3);&lt;br /&gt;
    tft.fillScreen(ST77XX_BLACK);   // Fill the screen with black color&lt;br /&gt;
    delay(100);&lt;br /&gt;
    tft.setRotation(2);&amp;lt;/syntaxhighlight&amp;gt;Ici y&#039;a deux remarques: &lt;br /&gt;
&lt;br /&gt;
* La constante INITR_144GREENTAB est à utiliser car le standard INITR_BLACKTAB est en mode RGB alors que notre écran est BGR (pourquoi ... pour faire genre je suppose).&lt;br /&gt;
* Ensuite, lors du premier démarrage le tft.fillScreen(ST77XX_BLACK);   &amp;quot;oublie&amp;quot; quelques lignes de pixels a droite et, pour éviter ce probléme je remplis deux fois en tournant virtuellement l&#039;écran. Il y a peut-etre une conf qui m&#039;échappe...&lt;br /&gt;
&lt;br /&gt;
==== Exemple complet ====&lt;br /&gt;
Un programe démo complet est donné ici.&lt;br /&gt;
&lt;br /&gt;
C&#039;est un &amp;quot;LED Blink&amp;quot; amélioré.&lt;br /&gt;
&lt;br /&gt;
Il fait clignoter la LED sur GPIO11 au rythme de une fois par seconde (1000 ms) ajustable.&lt;br /&gt;
&lt;br /&gt;
L&#039;écran affichera:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Luxury blink.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On a en vert le période de &amp;quot;blink&amp;quot; et en blanc sur fond bleu le temps depuis le boot du device HH:MM:SS.&lt;br /&gt;
&lt;br /&gt;
Un petit bandeau bleu a gauche indique que les boutons &amp;quot;+&amp;quot; et &amp;quot;-&amp;quot; permettent d&#039;ajouter ou de retirer 10 ms à la période.&lt;br /&gt;
&lt;br /&gt;
RST est également affiché a côté du bouton reset.&lt;br /&gt;
&lt;br /&gt;
Le projet est constitué de 3 fichiers :&lt;br /&gt;
&lt;br /&gt;
===== platformio.ini =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;[env:adafruit_qtpy_esp32c3]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = adafruit_qtpy_esp32c3&lt;br /&gt;
framework = arduino&lt;br /&gt;
&lt;br /&gt;
lib_deps =&lt;br /&gt;
    adafruit/Adafruit ST7735 and ST7789 Library&lt;br /&gt;
    adafruit/Adafruit GFX Library&lt;br /&gt;
&lt;br /&gt;
build_flags =&lt;br /&gt;
    -DUSER_SETUP_LOADED=1&lt;br /&gt;
    -include src/User_Setup.h&lt;br /&gt;
&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
upload_speed = 921600&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== User_Setup.h =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define USER_SETUP_ID 44&lt;br /&gt;
&lt;br /&gt;
#define ST7735_DRIVER&lt;br /&gt;
#define TFT_WIDTH 128&lt;br /&gt;
#define TFT_HEIGHT 128&lt;br /&gt;
&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN   11  // GPIO11 sur ESP32-C3&lt;br /&gt;
#define SWITCH_0  8   // GPIO08 sur ESP32-C3&lt;br /&gt;
#define SWITCH_1  10  // GPIO10 sur ESP32-C3&lt;br /&gt;
&lt;br /&gt;
#define TFT_RGB_ORDER TFT_BGR&lt;br /&gt;
#define TFT_INVERSION_ON&lt;br /&gt;
#define TFT_ROTATION 1&lt;br /&gt;
&lt;br /&gt;
#define SPI_FREQUENCY  27000000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== main.cpp =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_ST7735.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Fonts/FreeSans9pt7b.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Fonts/FreeSans12pt7b.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, MOSI_PIN, SCK_PIN, TFT_RST);&lt;br /&gt;
&lt;br /&gt;
int periode = 1000;&lt;br /&gt;
&lt;br /&gt;
void display(){&lt;br /&gt;
  tft.fillScreen(tft.color565(128, 128, 128));   // Fill the screen with black color&lt;br /&gt;
  tft.setCursor(20, 15);            // Set cursor at the top-left corner&lt;br /&gt;
  tft.setTextColor(ST77XX_WHITE); // Set text color to white&lt;br /&gt;
  tft.setFont();&lt;br /&gt;
  tft.print(&amp;quot;Blink test...&amp;quot;);       // Print the message&lt;br /&gt;
  tft.fillRect(0,0,15,TFT_HEIGHT,tft.color565(0, 0, 128));&lt;br /&gt;
  tft.drawRect(0,0,15,TFT_HEIGHT,ST77XX_BLACK);&lt;br /&gt;
&lt;br /&gt;
  tft.setCursor(5, 10); tft.print(&amp;quot;+&amp;quot;);  &lt;br /&gt;
  tft.setCursor(5, 110); tft.print(&amp;quot;-&amp;quot;);  &lt;br /&gt;
  tft.setCursor(100, 110); tft.print(&amp;quot;RST&amp;quot;);  &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void update(){&lt;br /&gt;
  int16_t margin=5;&lt;br /&gt;
  int16_t x=25;&lt;br /&gt;
  int16_t y=50;&lt;br /&gt;
  int16_t x1, y1;&lt;br /&gt;
  uint16_t w, h;&lt;br /&gt;
  String displayStr=&amp;quot; &amp;quot;+String(millis())+&amp;quot; ms &amp;quot;;&lt;br /&gt;
  tft.setFont(&amp;amp;FreeSans9pt7b);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  tft.getTextBounds(displayStr, x, y, &amp;amp;x1, &amp;amp;y1, &amp;amp;w, &amp;amp;h);&lt;br /&gt;
  uint16_t real_w = TFT_WIDTH-x1-margin;&lt;br /&gt;
  tft.fillRect(x1-margin, y1-margin, real_w, h+margin*2, ST77XX_BLACK); // efface la zone&lt;br /&gt;
  tft.setCursor(x, y);            // Set cursor at the top-left corner&lt;br /&gt;
  tft.setTextColor(ST77XX_GREEN); // Set text color to green&lt;br /&gt;
  tft.print(String(periode)+&amp;quot; ms&amp;quot;);       // Print the message    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void update_time(){&lt;br /&gt;
  int16_t margin=5;&lt;br /&gt;
  int16_t x=25;&lt;br /&gt;
  int16_t y=90;&lt;br /&gt;
  int16_t x1, y1;&lt;br /&gt;
  uint16_t w, h;&lt;br /&gt;
  uint32_t ti=millis();&lt;br /&gt;
  uint16_t ss=ti/1000;&lt;br /&gt;
  uint16_t mm=ss/60;&lt;br /&gt;
  ss=ss-(mm*60);&lt;br /&gt;
  uint16_t hh=mm/60;&lt;br /&gt;
  mm=mm-(hh*60);&lt;br /&gt;
  String displayStr=(hh &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(hh)+&amp;quot;:&amp;quot;+\&lt;br /&gt;
                    (mm &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(mm)+&amp;quot;:&amp;quot;+\&lt;br /&gt;
                    (ss &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(ss);&lt;br /&gt;
  tft.setFont(&amp;amp;FreeSans12pt7b);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  tft.getTextBounds(displayStr, x, y, &amp;amp;x1, &amp;amp;y1, &amp;amp;w, &amp;amp;h);&lt;br /&gt;
  uint16_t real_w = TFT_WIDTH-x1-margin;&lt;br /&gt;
  tft.fillRect(x1-margin, y1-margin, real_w, h+margin*2, tft.color565(0, 0, 128)); // efface la zone&lt;br /&gt;
  tft.drawRect(x1-margin, y1-margin, real_w, h+margin*2,ST77XX_BLACK);&lt;br /&gt;
  tft.setTextColor(ST77XX_WHITE);       &lt;br /&gt;
  tft.setCursor(x, y);&lt;br /&gt;
  tft.print(displayStr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Démarrage ESP32-C3...&amp;quot;);&lt;br /&gt;
  Serial.println(periode);&lt;br /&gt;
  pinMode(LED_PIN, OUTPUT);&lt;br /&gt;
  pinMode(SWITCH_0, INPUT_PULLUP);&lt;br /&gt;
  pinMode(SWITCH_1, INPUT_PULLUP);&lt;br /&gt;
  Serial.println(&amp;quot;Init écran ST7735...&amp;quot;);&lt;br /&gt;
  tft.initR(INITR_144GREENTAB); &lt;br /&gt;
  tft.setRotation(3);&lt;br /&gt;
  tft.fillScreen(ST77XX_BLACK);   // Fill the screen with black color&lt;br /&gt;
  delay(100);&lt;br /&gt;
  tft.setRotation(2);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  display();&lt;br /&gt;
  update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (digitalRead(SWITCH_0)==LOW){&lt;br /&gt;
    periode-=10;&lt;br /&gt;
    if (periode&amp;lt;100)&lt;br /&gt;
      periode=100;&lt;br /&gt;
    Serial.println(periode);&lt;br /&gt;
    update();&lt;br /&gt;
    delay(10);&lt;br /&gt;
    while (digitalRead(SWITCH_0)==LOW)&lt;br /&gt;
      delay(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (digitalRead(SWITCH_1)==LOW){&lt;br /&gt;
    periode+=10;&lt;br /&gt;
    if (periode&amp;gt;2000)&lt;br /&gt;
      periode=2000;&lt;br /&gt;
    Serial.println(periode);&lt;br /&gt;
    update();&lt;br /&gt;
    delay(10);&lt;br /&gt;
    while (digitalRead(SWITCH_1)==LOW)&lt;br /&gt;
      delay(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if ((millis() % periode)&amp;lt; (periode/2))&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);&lt;br /&gt;
  else&lt;br /&gt;
    digitalWrite(LED_PIN, LOW);&lt;br /&gt;
  &lt;br /&gt;
  if ((millis() % 1000)==0)&lt;br /&gt;
    update_time();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Luxury_blink.png&amp;diff=1968</id>
		<title>Fichier:Luxury blink.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Luxury_blink.png&amp;diff=1968"/>
		<updated>2026-05-08T15:39:18Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;le Hello World de luxe&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1967</id>
		<title>ESP32C3 avec écran spotear</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1967"/>
		<updated>2026-05-08T15:14:51Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Utiliser l&amp;#039;écran */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Appelé en français &amp;quot;Mini ornement de Bureau&amp;quot; voici le module ESP32 C3 équipé de son écran. Personnellement c&#039;est mon premier C3 donc mes débuts en RISC-V. Bon tant que je fais du C avec l&#039;IDE Arduino ca devrait pas trop se voir.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget.png|vignette|220x220px]]&lt;br /&gt;
&lt;br /&gt;
== Premier contact ==&lt;br /&gt;
Apres avoir joué au petit mécano pour monter le bidule. On le branche sur une alim USB (micro USB le design ne date pas d&#039;hier).&lt;br /&gt;
&lt;br /&gt;
On le branche et il affiche un message (assez moche en vérité) indiquant de configurer son &amp;quot;mobile WLAN&amp;quot; avec les paramètres :&lt;br /&gt;
&lt;br /&gt;
SSID : spotpear (c&#039;est le fabricant)&lt;br /&gt;
&lt;br /&gt;
WIFI Key : 12345678&lt;br /&gt;
&lt;br /&gt;
On peut pas plus sûr comme mot de passe !&lt;br /&gt;
&lt;br /&gt;
Le message du dessous me parait me parait assez ésotérique. Ca sent la traduction du chinois fait pas une IA poussive.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget+wifi.png|gauche|vignette|215x215px]]&lt;br /&gt;
Je configure un routeur avec ces paramètres et je rebranche le bigonx.&lt;br /&gt;
&lt;br /&gt;
Une belle barre de progression s&#039;affiche et ensuite un superbe écran!&lt;br /&gt;
&lt;br /&gt;
Que c&#039;est beau!&lt;br /&gt;
&lt;br /&gt;
A première vue:&lt;br /&gt;
&lt;br /&gt;
* L&#039;écran est très correct. Lumineux et lisible.&lt;br /&gt;
* &amp;lt;u&amp;gt;Pour le mini firmware:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;heure locale est juste. Il sait se mètre à l&#039;heure et détecte correctement le fuseau horaire et l&#039;heure été/hiver&lt;br /&gt;
&lt;br /&gt;
* La date est bonne&lt;br /&gt;
* La localisation à Clichy est fausse (on est a Paris aujourd&#039;hui)&lt;br /&gt;
* La température semble correcte le service météo est juste en revanche le fait d&#039;afficher en °F alors qu&#039;on est a Clichy...Bof bof.&lt;br /&gt;
* La météo est correcte (il pleut, il pleut en ce mois de mars 2026)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le barre de progression du wifi étant verte et le symbole &amp;quot;Temp&amp;quot; en bleu je suppose que cet écran est RGB. (Chercher le rouge)&lt;br /&gt;
&lt;br /&gt;
== Recherche de documentation ==&lt;br /&gt;
Le bidule acheté 9€ sur Aliexpress est livré avec.... 8 entretoises 8 vis une façade trouée pour l&#039;écran et un bout de plastique noir pour le fond. Mais .... Aucune doc.&lt;br /&gt;
&lt;br /&gt;
Pas grave y&#039;a Google et Gemini.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai trouvé :&lt;br /&gt;
&lt;br /&gt;
https://www.elektroda.com/news/news4091334.html  où un certain p.kaczmarek2 détaille tout le processus d&#039;utilisation.&lt;br /&gt;
&lt;br /&gt;
https://spotpear.com/wiki/ESP32-C3-desktop-trinket-Mini-TV-Portable-Pendant-LVGL-1.44inch-LCD-ST7735.html le site du fabricant.&lt;br /&gt;
&lt;br /&gt;
== Niveau Hardware ==&lt;br /&gt;
La carte est assez simple on y trouve :&lt;br /&gt;
&lt;br /&gt;
* Le joli écran de 1,44&amp;lt;nowiki&amp;gt;&#039;&#039; de 128x128 pixel  (on est loin du 300 ppp) utilisé en SPI (peut être possible en I2C). Pour les personnes normales utilisant le système métrique (le monde entier sauf les USA, le Libéria et la Birmanie je crois) 1.44&#039;&#039; ca fait 36,6 mm. La taille doit venir de ces unités exotiques où un pouce est divisé en 144 points. Je sais pas j&#039;ai pas l&#039;&amp;lt;/nowiki&amp;gt;habitude... Doit y avoir une logique.&lt;br /&gt;
* Une prise pour une batterie et un circuit de charge PL4054&lt;br /&gt;
* Un régulateur linéaire pour faire du 3.3 V CAT 6219 qui m&#039;a pas l&#039;aire d&#039;être tout jeune&lt;br /&gt;
* Un quartz 40 MHz&lt;br /&gt;
* Une petite mémoire flash de 128 Mbits (16b Mo) W25q128 &lt;br /&gt;
* 4 boutons poussoirs &lt;br /&gt;
** RESET (ou plutôt CHIP_EN) avec son petit circuit de reset automatique&lt;br /&gt;
** Un bouton BOOT cablé sur IO09&lt;br /&gt;
** Deux boutons (actifs bas) sur IO8 et I010&lt;br /&gt;
* Une led sur IO11&lt;br /&gt;
* Une LED qui, si je comprends le schéma électronique s&#039;allume quand le batterie se charge  &lt;br /&gt;
* Le port USB est relié au ESP32C3 qui doit savoir le gérer en natif (pas de FTDI ou autre)&lt;br /&gt;
* 5 GPIO accessibles sur 6 broches &lt;br /&gt;
** GPIO1&lt;br /&gt;
** GPIO6&lt;br /&gt;
** GPIO7&lt;br /&gt;
** GPIO20&lt;br /&gt;
** GPIO21&lt;br /&gt;
* Une broches de masse (coté GPIO)&lt;br /&gt;
* Une broche +5V et une +3.3V autour du port µUSB&lt;br /&gt;
&lt;br /&gt;
== Niveau developpement ==&lt;br /&gt;
Il faut installer un environnement correct. [[Poste de DEV ESP32 sur PI|C&#039;est détaillé ici]]. Avec un premier &amp;quot;hello world&amp;quot; qui fait clignoter une LED.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser l&#039;écran ===&lt;br /&gt;
J&#039;ai eu pas mal de problèmes pour utiliser l&#039;écran. Beaucoup de tutos (et aussi copilot) conseillent d&#039;utiliser la librairie &#039;&#039;&#039;TFT_eSPI&#039;&#039;&#039; mais je ne suis pas arrivé à l&#039;utiliser correctement.&lt;br /&gt;
&lt;br /&gt;
D&#039;autre part le branchement de l&#039;écran n&#039;est pas standard. &lt;br /&gt;
&lt;br /&gt;
==== Brochage ====&lt;br /&gt;
Dans le schéma de principe donné sur le site de p.kaczmarek2 on voit plusieurs choses.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ST7735 PINOUT.png|sans_cadre|429x429px]]&lt;br /&gt;
&lt;br /&gt;
Le pinout n&#039;est pas standard le &#039;backlight&amp;quot; n&#039;est pas réglable. Les LEDs de rétroéclairage sont alimentées en permanence à travers R11.&lt;br /&gt;
&lt;br /&gt;
En plus sur ce schéma les broches sont nommées SDA, SCL... alors que c&#039;est du SPI et pas ce I&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;C.&lt;br /&gt;
&lt;br /&gt;
Donc le fichier de définition est :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Mon fichier User_Setup.h complet est:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define USER_SETUP_ID 44&lt;br /&gt;
&lt;br /&gt;
#define ST7735_DRIVER&lt;br /&gt;
#define TFT_WIDTH 128&lt;br /&gt;
#define TFT_HEIGHT 128&lt;br /&gt;
&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN   11  // GPIO11 sur ESP32-C3&lt;br /&gt;
#define SWITCH_0  8   // GPIO08 sur ESP32-C3&lt;br /&gt;
#define SWITCH_1  10  // GPIO10 sur ESP32-C3&lt;br /&gt;
&lt;br /&gt;
#define TFT_RGB_ORDER TFT_BGR&lt;br /&gt;
#define TFT_INVERSION_ON&lt;br /&gt;
#define TFT_ROTATION 1&lt;br /&gt;
&lt;br /&gt;
#define SPI_FREQUENCY  27000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Librairie Adafruit ====&lt;br /&gt;
Donc la librairies &#039;&#039;&#039;TFT_eSPI&#039;&#039;&#039; ne marche pas avec cet écran (ou je ne suis pas arrivé à la faire marcher) j&#039;ai utilisé &#039;&#039;&#039;Adafruit_ST7735&#039;&#039;&#039; qui fonctionne très bien ([https://www.adafruit.com/ merci Lady Ada]).&lt;br /&gt;
&lt;br /&gt;
Associée à la librairies GFX du même Adafruit on a un joli environnement pour faire des dessins sur l&#039;écran.&lt;br /&gt;
&lt;br /&gt;
On déclare la librairie dans platformio.ini :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[env:adafruit_qtpy_esp32c3]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = adafruit_qtpy_esp32c3&lt;br /&gt;
framework = arduino&lt;br /&gt;
&lt;br /&gt;
lib_deps =&lt;br /&gt;
    adafruit/Adafruit ST7735 and ST7789 Library&lt;br /&gt;
    adafruit/Adafruit GFX Library&lt;br /&gt;
&lt;br /&gt;
build_flags =&lt;br /&gt;
    -DUSER_SETUP_LOADED=1&lt;br /&gt;
    -include src/User_Setup.h&lt;br /&gt;
&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
upload_speed = 921600&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque l&#039;inclusion du User_Setup.h montré ci dessus.&lt;br /&gt;
&lt;br /&gt;
Et dans le code source on ajoute:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_ST7735.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On déclare un objet Adafruit_ST7735 avec les broches données ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, MOSI_PIN, SCK_PIN, TFT_RST);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et on l&#039;initialise dans &amp;lt;code&amp;gt;setup()&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;tft.initR(INITR_144GREENTAB); &lt;br /&gt;
    tft.setRotation(3);&lt;br /&gt;
    tft.fillScreen(ST77XX_BLACK);   // Fill the screen with black color&lt;br /&gt;
    delay(100);&lt;br /&gt;
    tft.setRotation(2);&amp;lt;/syntaxhighlight&amp;gt;Ici y&#039;a deux remarques: &lt;br /&gt;
&lt;br /&gt;
* La constante INITR_144GREENTAB est à utiliser car le standard INITR_BLACKTAB est en mode RGB alors que notre écran est BGR (pourquoi ... pour faire genre je suppose).&lt;br /&gt;
* Ensuite, lors du premier démarrage le tft.fillScreen(ST77XX_BLACK);   &amp;quot;oublie&amp;quot; quelques lignes de pixels a droite et, pour éviter ce probléme je remplis deux fois en tournant virtuellement l&#039;écran. Il y a peut-etre une conf qui m&#039;échappe...&lt;br /&gt;
&lt;br /&gt;
==== Exemple complet ====&lt;br /&gt;
Un programe démo complet est donné ici.&lt;br /&gt;
&lt;br /&gt;
C&#039;est un &amp;quot;LED Blink&amp;quot; amélioré.&lt;br /&gt;
&lt;br /&gt;
Il fait clignoter la LED sur GPIO11 au rythme de une fois par seconde (1000 ms) ajustable.&lt;br /&gt;
&lt;br /&gt;
L&#039;écran affichera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;ICI IMAGE&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a en vert le période de &amp;quot;blink&amp;quot; et en blanc sur fond bleu le temps depuis le boot du device HH:MM:SS.&lt;br /&gt;
&lt;br /&gt;
Un petit bandeau bleu a gauche indique que les boutons &amp;quot;+&amp;quot; et &amp;quot;-&amp;quot; permettent d&#039;ajouter ou de retirer 10 ms à la période.&lt;br /&gt;
&lt;br /&gt;
RST est également affiché a côté du bouton reset.&lt;br /&gt;
&lt;br /&gt;
Le projet est constitué de 3 fichiers :&lt;br /&gt;
&lt;br /&gt;
===== platformio.ini =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;[env:adafruit_qtpy_esp32c3]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = adafruit_qtpy_esp32c3&lt;br /&gt;
framework = arduino&lt;br /&gt;
&lt;br /&gt;
lib_deps =&lt;br /&gt;
    adafruit/Adafruit ST7735 and ST7789 Library&lt;br /&gt;
    adafruit/Adafruit GFX Library&lt;br /&gt;
&lt;br /&gt;
build_flags =&lt;br /&gt;
    -DUSER_SETUP_LOADED=1&lt;br /&gt;
    -include src/User_Setup.h&lt;br /&gt;
&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
upload_speed = 921600&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== User_Setup.h =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define USER_SETUP_ID 44&lt;br /&gt;
&lt;br /&gt;
#define ST7735_DRIVER&lt;br /&gt;
#define TFT_WIDTH 128&lt;br /&gt;
#define TFT_HEIGHT 128&lt;br /&gt;
&lt;br /&gt;
// Pinout du module Mini-TV ESP32-C3&lt;br /&gt;
#define SD_CS 5&lt;br /&gt;
#define TFT_CS 2&lt;br /&gt;
#define TFT_DC 0&lt;br /&gt;
#define TFT_RST 5&lt;br /&gt;
#define MOSI_PIN 4&lt;br /&gt;
#define SCK_PIN 3&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN   11  // GPIO11 sur ESP32-C3&lt;br /&gt;
#define SWITCH_0  8   // GPIO08 sur ESP32-C3&lt;br /&gt;
#define SWITCH_1  10  // GPIO10 sur ESP32-C3&lt;br /&gt;
&lt;br /&gt;
#define TFT_RGB_ORDER TFT_BGR&lt;br /&gt;
#define TFT_INVERSION_ON&lt;br /&gt;
#define TFT_ROTATION 1&lt;br /&gt;
&lt;br /&gt;
#define SPI_FREQUENCY  27000000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== main.cpp =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_ST7735.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Fonts/FreeSans9pt7b.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Fonts/FreeSans12pt7b.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, MOSI_PIN, SCK_PIN, TFT_RST);&lt;br /&gt;
&lt;br /&gt;
int periode = 1000;&lt;br /&gt;
&lt;br /&gt;
void display(){&lt;br /&gt;
  tft.fillScreen(tft.color565(128, 128, 128));   // Fill the screen with black color&lt;br /&gt;
  tft.setCursor(20, 15);            // Set cursor at the top-left corner&lt;br /&gt;
  tft.setTextColor(ST77XX_WHITE); // Set text color to white&lt;br /&gt;
  tft.setFont();&lt;br /&gt;
  tft.print(&amp;quot;Blink test...&amp;quot;);       // Print the message&lt;br /&gt;
  tft.fillRect(0,0,15,TFT_HEIGHT,tft.color565(0, 0, 128));&lt;br /&gt;
  tft.drawRect(0,0,15,TFT_HEIGHT,ST77XX_BLACK);&lt;br /&gt;
&lt;br /&gt;
  tft.setCursor(5, 10); tft.print(&amp;quot;+&amp;quot;);  &lt;br /&gt;
  tft.setCursor(5, 110); tft.print(&amp;quot;-&amp;quot;);  &lt;br /&gt;
  tft.setCursor(100, 110); tft.print(&amp;quot;RST&amp;quot;);  &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void update(){&lt;br /&gt;
  int16_t margin=5;&lt;br /&gt;
  int16_t x=25;&lt;br /&gt;
  int16_t y=50;&lt;br /&gt;
  int16_t x1, y1;&lt;br /&gt;
  uint16_t w, h;&lt;br /&gt;
  String displayStr=&amp;quot; &amp;quot;+String(millis())+&amp;quot; ms &amp;quot;;&lt;br /&gt;
  tft.setFont(&amp;amp;FreeSans9pt7b);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  tft.getTextBounds(displayStr, x, y, &amp;amp;x1, &amp;amp;y1, &amp;amp;w, &amp;amp;h);&lt;br /&gt;
  uint16_t real_w = TFT_WIDTH-x1-margin;&lt;br /&gt;
  tft.fillRect(x1-margin, y1-margin, real_w, h+margin*2, ST77XX_BLACK); // efface la zone&lt;br /&gt;
  tft.setCursor(x, y);            // Set cursor at the top-left corner&lt;br /&gt;
  tft.setTextColor(ST77XX_GREEN); // Set text color to green&lt;br /&gt;
  tft.print(String(periode)+&amp;quot; ms&amp;quot;);       // Print the message    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void update_time(){&lt;br /&gt;
  int16_t margin=5;&lt;br /&gt;
  int16_t x=25;&lt;br /&gt;
  int16_t y=90;&lt;br /&gt;
  int16_t x1, y1;&lt;br /&gt;
  uint16_t w, h;&lt;br /&gt;
  uint32_t ti=millis();&lt;br /&gt;
  uint16_t ss=ti/1000;&lt;br /&gt;
  uint16_t mm=ss/60;&lt;br /&gt;
  ss=ss-(mm*60);&lt;br /&gt;
  uint16_t hh=mm/60;&lt;br /&gt;
  mm=mm-(hh*60);&lt;br /&gt;
  String displayStr=(hh &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(hh)+&amp;quot;:&amp;quot;+\&lt;br /&gt;
                    (mm &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(mm)+&amp;quot;:&amp;quot;+\&lt;br /&gt;
                    (ss &amp;lt; 10 ? String(&amp;quot;0&amp;quot;) : String(&amp;quot;&amp;quot;))+String(ss);&lt;br /&gt;
  tft.setFont(&amp;amp;FreeSans12pt7b);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  tft.getTextBounds(displayStr, x, y, &amp;amp;x1, &amp;amp;y1, &amp;amp;w, &amp;amp;h);&lt;br /&gt;
  uint16_t real_w = TFT_WIDTH-x1-margin;&lt;br /&gt;
  tft.fillRect(x1-margin, y1-margin, real_w, h+margin*2, tft.color565(0, 0, 128)); // efface la zone&lt;br /&gt;
  tft.drawRect(x1-margin, y1-margin, real_w, h+margin*2,ST77XX_BLACK);&lt;br /&gt;
  tft.setTextColor(ST77XX_WHITE);       &lt;br /&gt;
  tft.setCursor(x, y);&lt;br /&gt;
  tft.print(displayStr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Démarrage ESP32-C3...&amp;quot;);&lt;br /&gt;
  Serial.println(periode);&lt;br /&gt;
  pinMode(LED_PIN, OUTPUT);&lt;br /&gt;
  pinMode(SWITCH_0, INPUT_PULLUP);&lt;br /&gt;
  pinMode(SWITCH_1, INPUT_PULLUP);&lt;br /&gt;
  Serial.println(&amp;quot;Init écran ST7735...&amp;quot;);&lt;br /&gt;
  tft.initR(INITR_144GREENTAB); &lt;br /&gt;
  tft.setRotation(3);&lt;br /&gt;
  tft.fillScreen(ST77XX_BLACK);   // Fill the screen with black color&lt;br /&gt;
  delay(100);&lt;br /&gt;
  tft.setRotation(2);&lt;br /&gt;
  tft.setTextSize(1);  &lt;br /&gt;
  display();&lt;br /&gt;
  update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (digitalRead(SWITCH_0)==LOW){&lt;br /&gt;
    periode-=10;&lt;br /&gt;
    if (periode&amp;lt;100)&lt;br /&gt;
      periode=100;&lt;br /&gt;
    Serial.println(periode);&lt;br /&gt;
    update();&lt;br /&gt;
    delay(10);&lt;br /&gt;
    while (digitalRead(SWITCH_0)==LOW)&lt;br /&gt;
      delay(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (digitalRead(SWITCH_1)==LOW){&lt;br /&gt;
    periode+=10;&lt;br /&gt;
    if (periode&amp;gt;2000)&lt;br /&gt;
      periode=2000;&lt;br /&gt;
    Serial.println(periode);&lt;br /&gt;
    update();&lt;br /&gt;
    delay(10);&lt;br /&gt;
    while (digitalRead(SWITCH_1)==LOW)&lt;br /&gt;
      delay(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if ((millis() % periode)&amp;lt; (periode/2))&lt;br /&gt;
    digitalWrite(LED_PIN, HIGH);&lt;br /&gt;
  else&lt;br /&gt;
    digitalWrite(LED_PIN, LOW);&lt;br /&gt;
  &lt;br /&gt;
  if ((millis() % 1000)==0)&lt;br /&gt;
    update_time();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ST7735_PINOUT.png&amp;diff=1966</id>
		<title>Fichier:ST7735 PINOUT.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ST7735_PINOUT.png&amp;diff=1966"/>
		<updated>2026-05-08T13:07:05Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Branchement ST7735&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Infrastructure_bas%C3%A9e_PI&amp;diff=1965</id>
		<title>Infrastructure basée PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Infrastructure_bas%C3%A9e_PI&amp;diff=1965"/>
		<updated>2026-05-05T12:08:53Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Image.png|vignette]]&lt;br /&gt;
L&#039;architecture PILAN ressemble à quelque chose comme ça:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Archi pilan.png|sans_cadre|769x769px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=1964</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=1964"/>
		<updated>2026-05-02T21:29:12Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : utiliser la camera du raspberry PI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bienvenu sur ma nouvelle &amp;quot;Knowledge base&amp;quot; [[Spécial:Version|Version]] autohébergée.&lt;br /&gt;
&lt;br /&gt;
Une page temporaire pour la mise à jour de ce wiki-ci: [[MAJ WIKI]] (a faire)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Développement &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Logo C++.png|sans_cadre|61x61px]] C/C++ : &#039;&#039;&#039;LE&#039;&#039;&#039; Langage de programation.&lt;br /&gt;
|Les [[sockets C]]&lt;br /&gt;
Gérer l&#039;écran &amp;quot;à la vi&amp;quot; avec [[Curses en C|curses]]&lt;br /&gt;
&lt;br /&gt;
Gérer le [[Temps à la milliseconde en C|temps à la milliseconde]].&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Perl logo.png|sans_cadre|48x48px]]Perl : Le meilleur langage de script. &lt;br /&gt;
|Quelques [[Quelques modules Perl|modules Perl]] utiles.&lt;br /&gt;
Petits [[hacks en perl]]. &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Python Logo.png|alt=Python|sans_cadre|74x74px]]Python : Pas mon préféré mais il est tellement utilisé!&lt;br /&gt;
|Syntaxe [[Les bases de Python|de base]],&lt;br /&gt;
Gestion des [[Exceptions en Python|exceptions]].&lt;br /&gt;
&lt;br /&gt;
Python et ses [[Environnements virtuels Python|environnements virtuels]].&lt;br /&gt;
&lt;br /&gt;
Les [[Modules et outils de développement Python|modules et les outils de développement]]. &lt;br /&gt;
&lt;br /&gt;
[[Gestion des documents PDF en Python|Gestion des documents PDF]]. &lt;br /&gt;
&lt;br /&gt;
[[Petits exemples de code Python|Petits exemples de code]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outils&lt;br /&gt;
|[[Fichier:Git logo.png|sans_cadre|67x67px]]Git&lt;br /&gt;
|[[GIT Utilisation simple|Utilisation simple]] &lt;br /&gt;
[[GIT-HUB]]&lt;br /&gt;
|-&lt;br /&gt;
|Shell&lt;br /&gt;
|sh/bash&lt;br /&gt;
|Syntaxe du [[If en bash|if]].&lt;br /&gt;
Syntaxe de [[For in bash|for]].&lt;br /&gt;
&lt;br /&gt;
Traiter des [[CSV bash|fichiers csv]]&lt;br /&gt;
Traitement de phrases [[Encodage d&#039;objets complexes#Usage en shell (commande jq)|JSON avec jq]]&lt;br /&gt;
&lt;br /&gt;
[[Bash random|Générer de hasard]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;8&amp;quot; |Système&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Global&lt;br /&gt;
|[[Encodage]] de caractères&lt;br /&gt;
|Le [[code morse]], le [[code baudot]], les codes [[ASCII]], les séquences [[ANSI]] le code [[Code Gray|Gray]] et un OVNI, le code [[Extended Binary Coded Decimal Interchange Code|EBCEDIC]]&lt;br /&gt;
les code [[UNICODE]].&lt;br /&gt;
|-&lt;br /&gt;
|Encodage d&#039;objets&lt;br /&gt;
|Les [[entiers]]&lt;br /&gt;
le [[temps]]&lt;br /&gt;
&lt;br /&gt;
Les [[nombres flottants]]&lt;br /&gt;
&lt;br /&gt;
[[Encodage d&#039;objets complexes|Les objets complexes]]&lt;br /&gt;
&lt;br /&gt;
Encodage de binaire en [[base64]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Linux [[Fichier:Linux-logo.png|sans_cadre|93x93px]]&lt;br /&gt;
|Général&lt;br /&gt;
|[[Généralités Linux|Généralités]] quel que soient les distributions de linux (ou UNIX).&lt;br /&gt;
Lancer un [[deamon avec systemd]].&lt;br /&gt;
&lt;br /&gt;
Configurer une client [[Connexion SSH|ssh]].&lt;br /&gt;
&lt;br /&gt;
Installer [[web-ssh]]&lt;br /&gt;
|-&lt;br /&gt;
|Debian (Ubuntu...)&lt;br /&gt;
|[[Gestion des services Debian/Ubuntu|Gestion des services]]&lt;br /&gt;
&lt;br /&gt;
[[Nettoyage APT]]&lt;br /&gt;
&lt;br /&gt;
Informations sur une [[Info distribution DEBIAN|distribution]]&lt;br /&gt;
|-&lt;br /&gt;
|WSL &lt;br /&gt;
|[[Relancer WSL]]&lt;br /&gt;
&lt;br /&gt;
[[Monter un disque externe dans wsl]]&lt;br /&gt;
&lt;br /&gt;
[[Utiliser un port USB dans WSL]]&lt;br /&gt;
|-&lt;br /&gt;
|Windows [[Fichier:Microsoft Windows Logo.png|sans_cadre|96x96px]]&lt;br /&gt;
|..., 10, 11&lt;br /&gt;
|[[Wireshark]] &amp;lt;sub&amp;gt;(images manquantes)&amp;lt;/sub&amp;gt;&lt;br /&gt;
CYGWIN&lt;br /&gt;
&lt;br /&gt;
[[MINGW32]]&lt;br /&gt;
&lt;br /&gt;
[[Scoop]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Open WRT]]&lt;br /&gt;
[[Fichier:Open WRT LOGO.png|sans_cadre|135x135px]]&lt;br /&gt;
|Global&lt;br /&gt;
[[GL Inet]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gl-inet-router.png|sans_cadre|147x147px]]&lt;br /&gt;
|[[GL Inet Reset|Reset]] sortie d&#039;usine.&lt;br /&gt;
Réglage du serveur [[Open WRT DHCP|DHCP]]&lt;br /&gt;
&lt;br /&gt;
Ajouter un [[OpenWRTpackages|package]].&lt;br /&gt;
&lt;br /&gt;
[[Open WRT Commandes de base pour le réseau|Commandes de base pour le réseau]].&lt;br /&gt;
&lt;br /&gt;
[[tcpdump]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le ssh depuis le côté WAN.]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le WEB depuis le coté WAN]]&lt;br /&gt;
&lt;br /&gt;
Gérer des ampoules [[Wiz et OpenWRT|Phillips Wiz]].&lt;br /&gt;
&lt;br /&gt;
Installer un outil de [[Test de la bande passante Open WRT|test de la bande passante]] de la patte &amp;quot;wan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Auto hébergement&lt;br /&gt;
[[Fichier:AnarchySymbol.png|sans_cadre|107x107px]]&lt;br /&gt;
|[[Fichier:Raspberry.png|sans_cadre|40x40px]]  [[Raspberry PI]]&lt;br /&gt;
|L&#039;auto hébergement est assez facile à réaliser chez sois. Une solution est d&#039;utiliser un ou plusieurs raspberry PI.&lt;br /&gt;
[[Auto Hebergement|La base]] explique l&#039;installation de base d&#039;un PI comme module de base.&lt;br /&gt;
&lt;br /&gt;
REPRISE de l&#039;architecture. Je vais tenter une refonte de cette section. Elle devrait remplacer celle ci dessus&lt;br /&gt;
&lt;br /&gt;
# [[Infrastructure basée PI|Architecture]]&lt;br /&gt;
# &amp;lt;code&amp;gt;front-router&amp;lt;/code&amp;gt;[[Le routeur en tête réseau PI|Le routeur en tête]] &lt;br /&gt;
# [[Node-red dans le LAN|Un serveur Node-red]] &lt;br /&gt;
#&amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;[[PI GitLab|Un serveur Git]]&lt;br /&gt;
#&amp;lt;code&amp;gt;database&amp;lt;/code&amp;gt;[[PI MariaDB|Un serveur de base de données]]&lt;br /&gt;
#&amp;lt;code&amp;gt;mediawiki&amp;lt;/code&amp;gt; [[PI MediaWiki|Un serveur mediawiki]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |APIs&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Géolocalisation et cartographie&lt;br /&gt;
|IP API&lt;br /&gt;
|[[Abstract API]] Donne une localisation a partir d&#039;une IP&lt;br /&gt;
[[IPinfo]] Une autre bibliotheque de localisation d&#039;IP&lt;br /&gt;
|-&lt;br /&gt;
|Ephemérides&lt;br /&gt;
|[[Sunset and sunrise times API]] va nous dire quand le soleil se lève quand il se couche, la lune…&lt;br /&gt;
|-&lt;br /&gt;
|Trafic Aérien&lt;br /&gt;
|[[FlightRadar24]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;6&amp;quot; |Logiciels&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Middleware&lt;br /&gt;
|Bases de données relationelles&lt;br /&gt;
|Le langage [[SQL]] &lt;br /&gt;
Les &amp;quot;minimales&amp;quot;: [[MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Les encore plus minimales: [[SQLite]] &lt;br /&gt;
&lt;br /&gt;
Les maximales: [[Oracle]], [[PostgeSQL]]&lt;br /&gt;
|-&lt;br /&gt;
|Bases de données NoSQL&lt;br /&gt;
|[[mongodb]]&lt;br /&gt;
|-&lt;br /&gt;
|Messages&lt;br /&gt;
|[[MQTT]]&lt;br /&gt;
|-&lt;br /&gt;
|Serveur applicatifs/web&lt;br /&gt;
|[[Apache]]&lt;br /&gt;
&lt;br /&gt;
[[Weblogic]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Bureautique&lt;br /&gt;
|Excel&lt;br /&gt;
|[[Gestion des dates sous Excel|Gestion des dates]]&amp;lt;nowiki/&amp;gt; &lt;br /&gt;
[[EXCEL Gestion des chaines de caractères|Gest]][[EXCEL Gestion des chaines de caractères|io]][[EXCEL Gestion des chaines de caractères|n d]][[EXCEL Gestion des chaines de caractères|es cha]][[EXCEL Gestion des chaines de caractères|în]][[EXCEL Gestion des chaines de caractères|es de c]][[EXCEL Gestion des chaines de caractères|ar]][[EXCEL Gestion des chaines de caractères|actère]][[EXCEL Gestion des chaines de caractères|s]]&lt;br /&gt;
&lt;br /&gt;
[[Identifier si la clé d&#039;une ligne est présente dans un autre tableau]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outlook&lt;br /&gt;
|[[Outlook - Gestion des archives|Gestion des archives]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;4&amp;quot; |Sécurite&lt;br /&gt;
|Chiffrement / déchiffrage&lt;br /&gt;
|OpenSSL&lt;br /&gt;
|[[Les bases de Open SSL|La base]]&lt;br /&gt;
[[OpenSSL et AES]] (symetrique)&lt;br /&gt;
&lt;br /&gt;
[[OpenSSL_et_RSA]] (asymetrique)&lt;br /&gt;
&lt;br /&gt;
Avec [[SMIME et Certificats x509|x509 et SMIME]] on marie les deux&lt;br /&gt;
&lt;br /&gt;
Comment [[OpenSSL extraire un certificat|extraire un certificat]] d&#039;un serveur en production.&lt;br /&gt;
&lt;br /&gt;
PGP et [[GPG]] (chiffrer de documents)&lt;br /&gt;
&lt;br /&gt;
Générer un [[mode de passe sécurisé]]&lt;br /&gt;
&lt;br /&gt;
Les autres commandes [[openssl]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Certificats&lt;br /&gt;
|Generalités&lt;br /&gt;
|[[Les certificats X.509|Un certificat c&#039;est quoi?]]&lt;br /&gt;
|-&lt;br /&gt;
|PKI&lt;br /&gt;
|[[PKI familiale|Faire une PKI &amp;quot;familiale&amp;quot;]]&lt;br /&gt;
|-&lt;br /&gt;
|https&lt;br /&gt;
|[[Certificats Serveur https|Certificats Serveur]]&lt;br /&gt;
[[Certificats Client https|Certificats Client]]&lt;br /&gt;
&lt;br /&gt;
[[Let&#039;s encrypt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot; |Embarqué&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Microcontroleurs&lt;br /&gt;
|[[Fichier:Arduino Logo.png|sans_cadre|40x40px]][[Arduino]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[ESP8266]]&lt;br /&gt;
|Le module [[SON/OFF Smart Switch|Smart Switch]] de SONOFF&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Espessif logo.png|gauche|sans_cadre|40x40px]][[ESP32]]&lt;br /&gt;
|Environnement de dev [[ESP-IDF]], Utiliser [[mkspiffs]].&lt;br /&gt;
La carte &amp;quot;breakout&amp;quot; [[ESP32_DEVKITV1]]&lt;br /&gt;
La carte &amp;quot;AZ delivery&amp;quot; [[ESP32_DEVKITV2]]&lt;br /&gt;
&lt;br /&gt;
Faire des [[ESP32 Requetês HTTPs|requetês HTTPs]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Firmware Update|Firmware Update]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Matrice de led|Exemple d&#039;utilisation de matrice de LED]] (circuit MAX 72xx)&lt;br /&gt;
&lt;br /&gt;
Programmation module [[ESP32C3 avec écran spotear]].&lt;br /&gt;
|-&lt;br /&gt;
!Fusion&lt;br /&gt;
|Dev ESP 32 sur Raspberry PI&lt;br /&gt;
|Ici un article qui touche aux deux sujets. [[Poste de DEV ESP32 sur PI|Comment programmes les  microcontrôleurs ESP32 à partir d&#039;un raspberry PI]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |SBC (single board computers)&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Fichier:Logo PI.png|sans_cadre|36x36px]][[Raspberry PI]]&lt;br /&gt;
|[[Les modèles de Raspberry PI]]&lt;br /&gt;
La configuration réseau [[DHCP ou IP fixe]] &lt;br /&gt;
&lt;br /&gt;
Ecran [[Écran Adafruit 2.8 pouces TFT|Adafruit 2.8&#039;]]&#039;et [[Cohabitation écran Adafruit PiTFT 2.8&amp;quot; et HDMI|Cohabitation des écrans]]. &lt;br /&gt;
&lt;br /&gt;
Utiliser le [[frame-buffer]]&lt;br /&gt;
&lt;br /&gt;
[[Demarrer PI4 en USB|Gérer un PI4 dont le lecteur de carte SD est HS]].&lt;br /&gt;
&lt;br /&gt;
Utiliser la [[camera PI]]&lt;br /&gt;
|-&lt;br /&gt;
|Installer :&lt;br /&gt;
[[RPi-NodeRed|NodeRed]], [[Mosquitto]], [[MariaDB sur Raspberry PI|MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Le service graphique de gestion des mises à jour [[PackageKit]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Bpi.png|sans_cadre|48x48px]]Banana PI&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Objets connectés&lt;br /&gt;
|[[Fichier:PHILLIPS HUE LOGO.png|sans_cadre|87x87px]]&lt;br /&gt;
|Description [[PHILLIPS HUE|API]] de base&lt;br /&gt;
Le site de Phillips : https://developers.meethue.com/develop/hue-api-v2/getting-started/&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:X-sense logo.png|sans_cadre|52x52px]]x-sense&lt;br /&gt;
|[[X-sense|Description générale]]&lt;br /&gt;
Utilisation avec le module [[python-xsense]]&lt;br /&gt;
|-&lt;br /&gt;
|Phillips Wiz&lt;br /&gt;
|Les limites de ces [[Securite PHILLIPS WIZ|ampoules au niveau sécurité]].&lt;br /&gt;
Utilisation avec un [[Wiz et OpenWRT|routeur OpenWrt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;9&amp;quot; |Electronique&lt;br /&gt;
|Composants&lt;br /&gt;
|Composants actifs&lt;br /&gt;
|[[Le transistor bipolaire]]&lt;br /&gt;
|-&lt;br /&gt;
|Circuits&lt;br /&gt;
|Filtres&lt;br /&gt;
|Filtre de rejection : https://poujouly.net/2015/10/25/filtre-notch-50hz/ (oui un lien externe pour le moment)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Le labo&lt;br /&gt;
|Le protocoles&lt;br /&gt;
|[[UART/RS323]]&lt;br /&gt;
&lt;br /&gt;
[[SCPI uart]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Les outils de mesures connectables&lt;br /&gt;
|[[Multimètre]] modèle : &lt;br /&gt;
&lt;br /&gt;
* [[Multicomp PRO MP730027]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Générateur de fonctions arbitraire]] modèles : &lt;br /&gt;
&lt;br /&gt;
* [[GwINSTEK AFG-2012]]&lt;br /&gt;
* [[Multicomp MP75511]]&lt;br /&gt;
* [[FeelTech FY6600]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Osciloscope]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Alimantation]]&lt;br /&gt;
&lt;br /&gt;
[[Alimentation USB C]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Conception&lt;br /&gt;
|[[Fichier:Autodesk Eagle logo.png|sans_cadre|123x123px]]&lt;br /&gt;
|Logiciel de conception de circuits et de modélisation de circuit imprimés.&lt;br /&gt;
[[EAGLE - Plans de masse|Plans de masse]]&lt;br /&gt;
&lt;br /&gt;
[[Les unités dans EAGLE]]&lt;br /&gt;
|-&lt;br /&gt;
|LTspice&lt;br /&gt;
|Logiciel de simulation électronique&lt;br /&gt;
[[LTspice fichier de simulation|Utiliser un signal numérisé en entré d&#039;une simulation]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;7&amp;quot; |CAO FAO&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Mécanique&lt;br /&gt;
|Visserie&lt;br /&gt;
|[[Fichier:Logo-iso.png|sans_cadre|105x105px]][[Dimensions visserie ISO]]&lt;br /&gt;
|-&lt;br /&gt;
|Usinage&lt;br /&gt;
|Dimensions des [[fraises en unités Imériales/US]]&lt;br /&gt;
|-&lt;br /&gt;
|Fabrication additive&lt;br /&gt;
|Imprimantes 3D FDM&lt;br /&gt;
|[[Fichier:Ultimaker logo.png|sans_cadre|37x37px]] [[Ultimaker 2]]&lt;br /&gt;
|-&lt;br /&gt;
|CNC&lt;br /&gt;
|Fraiseuses&lt;br /&gt;
|La base… la [[CNC 3018|3018]].&lt;br /&gt;
Faire des perçages avec un [[CNC Percages gcode|programme python]].&lt;br /&gt;
&lt;br /&gt;
Graver des [[PCB avec CNC|PCB]]&lt;br /&gt;
&lt;br /&gt;
[[Changer la broche CNC3018|Changer la broche]]&lt;br /&gt;
|-&lt;br /&gt;
|Découpeuse (Vinyle ou autre)&lt;br /&gt;
|Silhouette&lt;br /&gt;
|[[SILHOUETTE Paramètres de base|Paramètres de base]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciels de CAO&lt;br /&gt;
|[[Fichier:Freecad logo.png|alt=FREE CAD|sans_cadre|47x47px]]FreeCad&lt;br /&gt;
|[[FreeCad]]&lt;br /&gt;
|-&lt;br /&gt;
|Outillage&lt;br /&gt;
|Metrologie&lt;br /&gt;
|[[Comparateur Numérique]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Projets complets&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Création/Configuration de serveur&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Exemple chez GANDI&lt;br /&gt;
|[[Serveur mediawiki basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur nodered basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur Owncloud]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur DNS GANDI|Serveur DNS]]&lt;br /&gt;
|-&lt;br /&gt;
|Objets connectés&lt;br /&gt;
|ESP32&lt;br /&gt;
|[[ESP32 Horloge à LED|Une Horloge à LED]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Photos&lt;br /&gt;
|Matériel&lt;br /&gt;
|D90&lt;br /&gt;
[[Fichier:D90.png|sans_cadre|58x58px]]&lt;br /&gt;
|[[Connectique D90|Connectique]]&lt;br /&gt;
|-&lt;br /&gt;
|Théorie&lt;br /&gt;
|&lt;br /&gt;
|Les [[bases en optique pour la photo]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciel&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Vocabulaire_en_cryptographie&amp;diff=1963</id>
		<title>Vocabulaire en cryptographie</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Vocabulaire_en_cryptographie&amp;diff=1963"/>
		<updated>2026-04-29T09:52:27Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Types cryptographiques du Linux Kernel Crypto API =&lt;br /&gt;
&lt;br /&gt;
Cette page resume les principaux types d&#039;algorithmes utilises dans l&#039;API Crypto du noyau Linux.  &lt;br /&gt;
Chaque type correspond a une famille fonctionnelle d&#039;operations cryptographiques ou de compression.&lt;br /&gt;
&lt;br /&gt;
== akcipher ==&lt;br /&gt;
&#039;&#039;Asymmetric Key Cipher&#039;&#039;  &lt;br /&gt;
Algorithmes de chiffrement asymetrique utilisant une cle publique et une cle privee.  &lt;br /&gt;
Utilisations : signature, verification, chiffrement, dechiffrement.  &lt;br /&gt;
Exemples : RSA, ECDSA.&lt;br /&gt;
&lt;br /&gt;
== cipher ==&lt;br /&gt;
&#039;&#039;Symmetric Cipher&#039;&#039;  &lt;br /&gt;
Algorithmes de chiffrement symetrique utilisant une cle unique pour chiffrer et dechiffrer.  &lt;br /&gt;
Exemples : AES, DES, ChaCha20.&lt;br /&gt;
&lt;br /&gt;
== compression ==&lt;br /&gt;
&#039;&#039;Compression Algorithms&#039;&#039;  &lt;br /&gt;
Algorithmes de compression et decompression integres au noyau.  &lt;br /&gt;
Exemples : DEFLATE, LZ4, Zstd.&lt;br /&gt;
&lt;br /&gt;
== kpp ==&lt;br /&gt;
&#039;&#039;Key Pair Protocol&#039;&#039;  &lt;br /&gt;
Algorithmes d&#039;echange de cles permettant a deux parties de derivier un secret partage.  &lt;br /&gt;
Exemples : Diffie-Hellman, ECDH.&lt;br /&gt;
&lt;br /&gt;
== lskcipher ==&lt;br /&gt;
&#039;&#039;Synchronous Symmetric Key Cipher&#039;&#039;  &lt;br /&gt;
Version synchrone des algorithmes de chiffrement symetrique.  &lt;br /&gt;
Utilisee pour chiffrer des buffers en mode bloc ou flux.&lt;br /&gt;
&lt;br /&gt;
== scomp ==&lt;br /&gt;
&#039;&#039;Synchronous Compression&#039;&#039;  &lt;br /&gt;
Version synchrone des algorithmes de compression.  &lt;br /&gt;
Fonctionne de maniere immediate, sans pipeline asynchrone.&lt;br /&gt;
&lt;br /&gt;
== shash ==&lt;br /&gt;
&#039;&#039;Synchronous Hash&#039;&#039;  &lt;br /&gt;
Algorithmes de hachage synchrones.  &lt;br /&gt;
Utilises pour l&#039;integrite, les MAC, les signatures, etc.  &lt;br /&gt;
Exemples : SHA-1, SHA-256, [[MD5]].&lt;br /&gt;
&lt;br /&gt;
= Resume =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Terme !! Domaine !! Description&lt;br /&gt;
|-&lt;br /&gt;
| akcipher || Asymetrique || Chiffrement et signatures a cle publique&lt;br /&gt;
|-&lt;br /&gt;
| cipher || Symetrique || Chiffrement bloc ou flux&lt;br /&gt;
|-&lt;br /&gt;
| compression || Compression || Compression et decompression&lt;br /&gt;
|-&lt;br /&gt;
| kpp || Echange de cles || DH, ECDH&lt;br /&gt;
|-&lt;br /&gt;
| lskcipher || Symetrique synchrone || Chiffrement synchrone&lt;br /&gt;
|-&lt;br /&gt;
| scomp || Compression synchrone || Compression immediate&lt;br /&gt;
|-&lt;br /&gt;
| shash || Hachage synchrone || SHA, MD5&lt;br /&gt;
|}&lt;br /&gt;
Icones avec &amp;lt;a href=&amp;quot;https://www.flaticon.com/fr/icones-gratuites/cles&amp;quot; title=&amp;quot;clés icônes&amp;quot;&amp;gt;Clés icônes créées par Maan Icons - Flaticon&amp;lt;/a&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=1962</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=1962"/>
		<updated>2026-04-26T12:05:28Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bienvenu sur ma nouvelle &amp;quot;Knowledge base&amp;quot; [[Spécial:Version|Version]] autohébergée.&lt;br /&gt;
&lt;br /&gt;
Une page temporaire pour la mise à jour de ce wiki-ci: [[MAJ WIKI]] (a faire)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Développement &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Logo C++.png|sans_cadre|61x61px]] C/C++ : &#039;&#039;&#039;LE&#039;&#039;&#039; Langage de programation.&lt;br /&gt;
|Les [[sockets C]]&lt;br /&gt;
Gérer l&#039;écran &amp;quot;à la vi&amp;quot; avec [[Curses en C|curses]]&lt;br /&gt;
&lt;br /&gt;
Gérer le [[Temps à la milliseconde en C|temps à la milliseconde]].&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Perl logo.png|sans_cadre|48x48px]]Perl : Le meilleur langage de script. &lt;br /&gt;
|Quelques [[Quelques modules Perl|modules Perl]] utiles.&lt;br /&gt;
Petits [[hacks en perl]]. &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Python Logo.png|alt=Python|sans_cadre|74x74px]]Python : Pas mon préféré mais il est tellement utilisé!&lt;br /&gt;
|Syntaxe [[Les bases de Python|de base]],&lt;br /&gt;
Gestion des [[Exceptions en Python|exceptions]].&lt;br /&gt;
&lt;br /&gt;
Python et ses [[Environnements virtuels Python|environnements virtuels]].&lt;br /&gt;
&lt;br /&gt;
Les [[Modules et outils de développement Python|modules et les outils de développement]]. &lt;br /&gt;
&lt;br /&gt;
[[Gestion des documents PDF en Python|Gestion des documents PDF]]. &lt;br /&gt;
&lt;br /&gt;
[[Petits exemples de code Python|Petits exemples de code]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outils&lt;br /&gt;
|[[Fichier:Git logo.png|sans_cadre|67x67px]]Git&lt;br /&gt;
|[[GIT Utilisation simple|Utilisation simple]] &lt;br /&gt;
[[GIT-HUB]]&lt;br /&gt;
|-&lt;br /&gt;
|Shell&lt;br /&gt;
|sh/bash&lt;br /&gt;
|Syntaxe du [[If en bash|if]].&lt;br /&gt;
Syntaxe de [[For in bash|for]].&lt;br /&gt;
&lt;br /&gt;
Traiter des [[CSV bash|fichiers csv]]&lt;br /&gt;
Traitement de phrases [[Encodage d&#039;objets complexes#Usage en shell (commande jq)|JSON avec jq]]&lt;br /&gt;
&lt;br /&gt;
[[Bash random|Générer de hasard]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;8&amp;quot; |Système&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Global&lt;br /&gt;
|[[Encodage]] de caractères&lt;br /&gt;
|Le [[code morse]], le [[code baudot]], les codes [[ASCII]], les séquences [[ANSI]] le code [[Code Gray|Gray]] et un OVNI, le code [[Extended Binary Coded Decimal Interchange Code|EBCEDIC]]&lt;br /&gt;
les code [[UNICODE]].&lt;br /&gt;
|-&lt;br /&gt;
|Encodage d&#039;objets&lt;br /&gt;
|Les [[entiers]]&lt;br /&gt;
le [[temps]]&lt;br /&gt;
&lt;br /&gt;
Les [[nombres flottants]]&lt;br /&gt;
&lt;br /&gt;
[[Encodage d&#039;objets complexes|Les objets complexes]]&lt;br /&gt;
&lt;br /&gt;
Encodage de binaire en [[base64]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Linux [[Fichier:Linux-logo.png|sans_cadre|93x93px]]&lt;br /&gt;
|Général&lt;br /&gt;
|[[Généralités Linux|Généralités]] quel que soient les distributions de linux (ou UNIX).&lt;br /&gt;
Lancer un [[deamon avec systemd]].&lt;br /&gt;
&lt;br /&gt;
Configurer une client [[Connexion SSH|ssh]].&lt;br /&gt;
&lt;br /&gt;
Installer [[web-ssh]]&lt;br /&gt;
|-&lt;br /&gt;
|Debian (Ubuntu...)&lt;br /&gt;
|[[Gestion des services Debian/Ubuntu|Gestion des services]]&lt;br /&gt;
&lt;br /&gt;
[[Nettoyage APT]]&lt;br /&gt;
&lt;br /&gt;
Informations sur une [[Info distribution DEBIAN|distribution]]&lt;br /&gt;
|-&lt;br /&gt;
|WSL &lt;br /&gt;
|[[Relancer WSL]]&lt;br /&gt;
&lt;br /&gt;
[[Monter un disque externe dans wsl]]&lt;br /&gt;
&lt;br /&gt;
[[Utiliser un port USB dans WSL]]&lt;br /&gt;
|-&lt;br /&gt;
|Windows [[Fichier:Microsoft Windows Logo.png|sans_cadre|96x96px]]&lt;br /&gt;
|..., 10, 11&lt;br /&gt;
|[[Wireshark]] &amp;lt;sub&amp;gt;(images manquantes)&amp;lt;/sub&amp;gt;&lt;br /&gt;
CYGWIN&lt;br /&gt;
&lt;br /&gt;
[[MINGW32]]&lt;br /&gt;
&lt;br /&gt;
[[Scoop]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Open WRT]]&lt;br /&gt;
[[Fichier:Open WRT LOGO.png|sans_cadre|135x135px]]&lt;br /&gt;
|Global&lt;br /&gt;
[[GL Inet]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gl-inet-router.png|sans_cadre|147x147px]]&lt;br /&gt;
|[[GL Inet Reset|Reset]] sortie d&#039;usine.&lt;br /&gt;
Réglage du serveur [[Open WRT DHCP|DHCP]]&lt;br /&gt;
&lt;br /&gt;
Ajouter un [[OpenWRTpackages|package]].&lt;br /&gt;
&lt;br /&gt;
[[Open WRT Commandes de base pour le réseau|Commandes de base pour le réseau]].&lt;br /&gt;
&lt;br /&gt;
[[tcpdump]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le ssh depuis le côté WAN.]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le WEB depuis le coté WAN]]&lt;br /&gt;
&lt;br /&gt;
Gérer des ampoules [[Wiz et OpenWRT|Phillips Wiz]].&lt;br /&gt;
&lt;br /&gt;
Installer un outil de [[Test de la bande passante Open WRT|test de la bande passante]] de la patte &amp;quot;wan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Auto hébergement&lt;br /&gt;
[[Fichier:AnarchySymbol.png|sans_cadre|107x107px]]&lt;br /&gt;
|[[Fichier:Raspberry.png|sans_cadre|40x40px]]  [[Raspberry PI]]&lt;br /&gt;
|L&#039;auto hébergement est assez facile à réaliser chez sois. Une solution est d&#039;utiliser un ou plusieurs raspberry PI.&lt;br /&gt;
[[Auto Hebergement|La base]] explique l&#039;installation de base d&#039;un PI comme module de base.&lt;br /&gt;
&lt;br /&gt;
REPRISE de l&#039;architecture. Je vais tenter une refonte de cette section. Elle devrait remplacer celle ci dessus&lt;br /&gt;
&lt;br /&gt;
# [[Infrastructure basée PI|Architecture]]&lt;br /&gt;
# &amp;lt;code&amp;gt;front-router&amp;lt;/code&amp;gt;[[Le routeur en tête réseau PI|Le routeur en tête]] &lt;br /&gt;
# [[Node-red dans le LAN|Un serveur Node-red]] &lt;br /&gt;
#&amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;[[PI GitLab|Un serveur Git]]&lt;br /&gt;
#&amp;lt;code&amp;gt;database&amp;lt;/code&amp;gt;[[PI MariaDB|Un serveur de base de données]]&lt;br /&gt;
#&amp;lt;code&amp;gt;mediawiki&amp;lt;/code&amp;gt; [[PI MediaWiki|Un serveur mediawiki]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |APIs&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Géolocalisation et cartographie&lt;br /&gt;
|IP API&lt;br /&gt;
|[[Abstract API]] Donne une localisation a partir d&#039;une IP&lt;br /&gt;
[[IPinfo]] Une autre bibliotheque de localisation d&#039;IP&lt;br /&gt;
|-&lt;br /&gt;
|Ephemérides&lt;br /&gt;
|[[Sunset and sunrise times API]] va nous dire quand le soleil se lève quand il se couche, la lune…&lt;br /&gt;
|-&lt;br /&gt;
|Trafic Aérien&lt;br /&gt;
|[[FlightRadar24]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;6&amp;quot; |Logiciels&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Middleware&lt;br /&gt;
|Bases de données relationelles&lt;br /&gt;
|Le langage [[SQL]] &lt;br /&gt;
Les &amp;quot;minimales&amp;quot;: [[MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Les encore plus minimales: [[SQLite]] &lt;br /&gt;
&lt;br /&gt;
Les maximales: [[Oracle]], [[PostgeSQL]]&lt;br /&gt;
|-&lt;br /&gt;
|Bases de données NoSQL&lt;br /&gt;
|[[mongodb]]&lt;br /&gt;
|-&lt;br /&gt;
|Messages&lt;br /&gt;
|[[MQTT]]&lt;br /&gt;
|-&lt;br /&gt;
|Serveur applicatifs/web&lt;br /&gt;
|[[Apache]]&lt;br /&gt;
&lt;br /&gt;
[[Weblogic]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Bureautique&lt;br /&gt;
|Excel&lt;br /&gt;
|[[Gestion des dates sous Excel|Gestion des dates]]&amp;lt;nowiki/&amp;gt; &lt;br /&gt;
[[EXCEL Gestion des chaines de caractères|Gest]][[EXCEL Gestion des chaines de caractères|io]][[EXCEL Gestion des chaines de caractères|n d]][[EXCEL Gestion des chaines de caractères|es cha]][[EXCEL Gestion des chaines de caractères|în]][[EXCEL Gestion des chaines de caractères|es de c]][[EXCEL Gestion des chaines de caractères|ar]][[EXCEL Gestion des chaines de caractères|actère]][[EXCEL Gestion des chaines de caractères|s]]&lt;br /&gt;
&lt;br /&gt;
[[Identifier si la clé d&#039;une ligne est présente dans un autre tableau]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outlook&lt;br /&gt;
|[[Outlook - Gestion des archives|Gestion des archives]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;4&amp;quot; |Sécurite&lt;br /&gt;
|Chiffrement / déchiffrage&lt;br /&gt;
|OpenSSL&lt;br /&gt;
|[[Les bases de Open SSL|La base]]&lt;br /&gt;
[[OpenSSL et AES]] (symetrique)&lt;br /&gt;
&lt;br /&gt;
[[OpenSSL_et_RSA]] (asymetrique)&lt;br /&gt;
&lt;br /&gt;
Avec [[SMIME et Certificats x509|x509 et SMIME]] on marie les deux&lt;br /&gt;
&lt;br /&gt;
Comment [[OpenSSL extraire un certificat|extraire un certificat]] d&#039;un serveur en production.&lt;br /&gt;
&lt;br /&gt;
PGP et [[GPG]] (chiffrer de documents)&lt;br /&gt;
&lt;br /&gt;
Générer un [[mode de passe sécurisé]]&lt;br /&gt;
&lt;br /&gt;
Les autres commandes [[openssl]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Certificats&lt;br /&gt;
|Generalités&lt;br /&gt;
|[[Les certificats X.509|Un certificat c&#039;est quoi?]]&lt;br /&gt;
|-&lt;br /&gt;
|PKI&lt;br /&gt;
|[[PKI familiale|Faire une PKI &amp;quot;familiale&amp;quot;]]&lt;br /&gt;
|-&lt;br /&gt;
|https&lt;br /&gt;
|[[Certificats Serveur https|Certificats Serveur]]&lt;br /&gt;
[[Certificats Client https|Certificats Client]]&lt;br /&gt;
&lt;br /&gt;
[[Let&#039;s encrypt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot; |Embarqué&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Microcontroleurs&lt;br /&gt;
|[[Fichier:Arduino Logo.png|sans_cadre|40x40px]][[Arduino]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[ESP8266]]&lt;br /&gt;
|Le module [[SON/OFF Smart Switch|Smart Switch]] de SONOFF&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Espessif logo.png|gauche|sans_cadre|40x40px]][[ESP32]]&lt;br /&gt;
|Environnement de dev [[ESP-IDF]], Utiliser [[mkspiffs]].&lt;br /&gt;
La carte &amp;quot;breakout&amp;quot; [[ESP32_DEVKITV1]]&lt;br /&gt;
La carte &amp;quot;AZ delivery&amp;quot; [[ESP32_DEVKITV2]]&lt;br /&gt;
&lt;br /&gt;
Faire des [[ESP32 Requetês HTTPs|requetês HTTPs]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Firmware Update|Firmware Update]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Matrice de led|Exemple d&#039;utilisation de matrice de LED]] (circuit MAX 72xx)&lt;br /&gt;
&lt;br /&gt;
Programmation module [[ESP32C3 avec écran spotear]].&lt;br /&gt;
|-&lt;br /&gt;
!Fusion&lt;br /&gt;
|Dev ESP 32 sur Raspberry PI&lt;br /&gt;
|Ici un article qui touche aux deux sujets. [[Poste de DEV ESP32 sur PI|Comment programmes les  microcontrôleurs ESP32 à partir d&#039;un raspberry PI]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |SBC (single board computers)&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Fichier:Logo PI.png|sans_cadre|36x36px]][[Raspberry PI]]&lt;br /&gt;
|[[Les modèles de Raspberry PI]]&lt;br /&gt;
La configuration réseau [[DHCP ou IP fixe]] &lt;br /&gt;
&lt;br /&gt;
Ecran [[Écran Adafruit 2.8 pouces TFT|Adafruit 2.8&#039;]]&#039;et [[Cohabitation écran Adafruit PiTFT 2.8&amp;quot; et HDMI|Cohabitation des écrans]]. &lt;br /&gt;
&lt;br /&gt;
Utiliser le [[frame-buffer]]&lt;br /&gt;
&lt;br /&gt;
[[Demarrer PI4 en USB|Gérer un PI4 dont le lecteur de carte SD est HS]].&lt;br /&gt;
|-&lt;br /&gt;
|Installer :&lt;br /&gt;
[[RPi-NodeRed|NodeRed]], [[Mosquitto]], [[MariaDB sur Raspberry PI|MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Le service graphique de gestion des mises à jour [[PackageKit]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Bpi.png|sans_cadre|48x48px]]Banana PI&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Objets connectés&lt;br /&gt;
|[[Fichier:PHILLIPS HUE LOGO.png|sans_cadre|87x87px]]&lt;br /&gt;
|Description [[PHILLIPS HUE|API]] de base&lt;br /&gt;
Le site de Phillips : https://developers.meethue.com/develop/hue-api-v2/getting-started/&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:X-sense logo.png|sans_cadre|52x52px]]x-sense&lt;br /&gt;
|[[X-sense|Description générale]]&lt;br /&gt;
Utilisation avec le module [[python-xsense]]&lt;br /&gt;
|-&lt;br /&gt;
|Phillips Wiz&lt;br /&gt;
|Les limites de ces [[Securite PHILLIPS WIZ|ampoules au niveau sécurité]].&lt;br /&gt;
Utilisation avec un [[Wiz et OpenWRT|routeur OpenWrt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;9&amp;quot; |Electronique&lt;br /&gt;
|Composants&lt;br /&gt;
|Composants actifs&lt;br /&gt;
|[[Le transistor bipolaire]]&lt;br /&gt;
|-&lt;br /&gt;
|Circuits&lt;br /&gt;
|Filtres&lt;br /&gt;
|Filtre de rejection : https://poujouly.net/2015/10/25/filtre-notch-50hz/ (oui un lien externe pour le moment)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Le labo&lt;br /&gt;
|Le protocoles&lt;br /&gt;
|[[UART/RS323]]&lt;br /&gt;
&lt;br /&gt;
[[SCPI uart]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Les outils de mesures connectables&lt;br /&gt;
|[[Multimètre]] modèle : &lt;br /&gt;
&lt;br /&gt;
* [[Multicomp PRO MP730027]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Générateur de fonctions arbitraire]] modèles : &lt;br /&gt;
&lt;br /&gt;
* [[GwINSTEK AFG-2012]]&lt;br /&gt;
* [[Multicomp MP75511]]&lt;br /&gt;
* [[FeelTech FY6600]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Osciloscope]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Alimantation]]&lt;br /&gt;
&lt;br /&gt;
[[Alimentation USB C]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Conception&lt;br /&gt;
|[[Fichier:Autodesk Eagle logo.png|sans_cadre|123x123px]]&lt;br /&gt;
|Logiciel de conception de circuits et de modélisation de circuit imprimés.&lt;br /&gt;
[[EAGLE - Plans de masse|Plans de masse]]&lt;br /&gt;
&lt;br /&gt;
[[Les unités dans EAGLE]]&lt;br /&gt;
|-&lt;br /&gt;
|LTspice&lt;br /&gt;
|Logiciel de simulation électronique&lt;br /&gt;
[[LTspice fichier de simulation|Utiliser un signal numérisé en entré d&#039;une simulation]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;7&amp;quot; |CAO FAO&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Mécanique&lt;br /&gt;
|Visserie&lt;br /&gt;
|[[Fichier:Logo-iso.png|sans_cadre|105x105px]][[Dimensions visserie ISO]]&lt;br /&gt;
|-&lt;br /&gt;
|Usinage&lt;br /&gt;
|Dimensions des [[fraises en unités Imériales/US]]&lt;br /&gt;
|-&lt;br /&gt;
|Fabrication additive&lt;br /&gt;
|Imprimantes 3D FDM&lt;br /&gt;
|[[Fichier:Ultimaker logo.png|sans_cadre|37x37px]] [[Ultimaker 2]]&lt;br /&gt;
|-&lt;br /&gt;
|CNC&lt;br /&gt;
|Fraiseuses&lt;br /&gt;
|La base… la [[CNC 3018|3018]].&lt;br /&gt;
Faire des perçages avec un [[CNC Percages gcode|programme python]].&lt;br /&gt;
&lt;br /&gt;
Graver des [[PCB avec CNC|PCB]]&lt;br /&gt;
&lt;br /&gt;
[[Changer la broche CNC3018|Changer la broche]]&lt;br /&gt;
|-&lt;br /&gt;
|Découpeuse (Vinyle ou autre)&lt;br /&gt;
|Silhouette&lt;br /&gt;
|[[SILHOUETTE Paramètres de base|Paramètres de base]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciels de CAO&lt;br /&gt;
|[[Fichier:Freecad logo.png|alt=FREE CAD|sans_cadre|47x47px]]FreeCad&lt;br /&gt;
|[[FreeCad]]&lt;br /&gt;
|-&lt;br /&gt;
|Outillage&lt;br /&gt;
|Metrologie&lt;br /&gt;
|[[Comparateur Numérique]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Projets complets&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Création/Configuration de serveur&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Exemple chez GANDI&lt;br /&gt;
|[[Serveur mediawiki basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur nodered basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur Owncloud]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur DNS GANDI|Serveur DNS]]&lt;br /&gt;
|-&lt;br /&gt;
|Objets connectés&lt;br /&gt;
|ESP32&lt;br /&gt;
|[[ESP32 Horloge à LED|Une Horloge à LED]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Photos&lt;br /&gt;
|Matériel&lt;br /&gt;
|D90&lt;br /&gt;
[[Fichier:D90.png|sans_cadre|58x58px]]&lt;br /&gt;
|[[Connectique D90|Connectique]]&lt;br /&gt;
|-&lt;br /&gt;
|Théorie&lt;br /&gt;
|&lt;br /&gt;
|Les [[bases en optique pour la photo]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciel&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Logo-iso.png&amp;diff=1961</id>
		<title>Fichier:Logo-iso.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Logo-iso.png&amp;diff=1961"/>
		<updated>2026-04-26T12:05:07Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;visserie iso&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:MP750511-face.png&amp;diff=1960</id>
		<title>Fichier:MP750511-face.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:MP750511-face.png&amp;diff=1960"/>
		<updated>2026-04-23T20:55:20Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:MP750511-face.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Face avant du MP750511&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:AFG-2012.png&amp;diff=1959</id>
		<title>Fichier:AFG-2012.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:AFG-2012.png&amp;diff=1959"/>
		<updated>2026-04-23T20:52:30Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:AFG-2012.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le produit&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Multim%C3%A8tre&amp;diff=1958</id>
		<title>Multimètre</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Multim%C3%A8tre&amp;diff=1958"/>
		<updated>2026-04-23T20:50:37Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tout le monde a un multimètre (certains disent un voltmètre mais c&#039;est souvent un multimètre).  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Divers multimetres.png|sans_cadre|244x244px]]&lt;br /&gt;
&lt;br /&gt;
Mais nous n&#039;allons pas parler de cela ici. Nous allons nous focaliser sur des appareils connectés. C&#039;est la même chose, ça mesure la tension, l&#039;intensité, la fréquence d&#039;un courant la valeur d&#039;une résistance ou d&#039;une capacité....&lt;br /&gt;
&lt;br /&gt;
En général ce sont des appareils de labo a poser sur la paillasse.&lt;br /&gt;
&lt;br /&gt;
C&#039;est plus gros et ça ressemble à ça:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:MP730027 EU-UK.png|alt=MP730027 EU-UK|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Si on regarde derrière on y voit plein de prises supplémentaires. Sur le mien y&#039;a ça:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ImageRear Panel Overview .png|sans_cadre|675x675px]]&lt;br /&gt;
&lt;br /&gt;
On voit plein de choses intéressantes.&lt;br /&gt;
&lt;br /&gt;
# Le trigger externe: si on configure le multimètre correctement il attendra une impulsion sur ce canal pour déclencher une mesure. C&#039;est utile pour synchroniser la mesure à un évènement extérieur.&lt;br /&gt;
# AUX output c&#039;est l&#039;inverse, le multimètre peut informer électriquement (une impulsion aussi) que quelque chose s&#039;est passé. On peut par exemple lui dire &amp;quot;si la tension passe au dessous de 2.5V avertis moi&amp;quot;&lt;br /&gt;
# RS232. Avec les connecteurs 4 et 5 c&#039;est pas là que l&#039;on peut automatiser les process. Par ce biais on peut configurer la mesure (CC ou CA, Gamme de mesure, rythme de mesure, courant, tension, fréquence...). Un protocole existe et est relativement normalisé c&#039;est SCPI. La documentation de l&#039;appareil vous donnera les fonctions qu&#039;il sait utiliser.&lt;br /&gt;
# USB (la commande par un port USB)&lt;br /&gt;
# RJ45 (la commande par réseau au travers d&#039;une connexion ethernet)&lt;br /&gt;
# Là ça deviens du classique c&#039;est la tension du secteur 220 ou 110 (ou il y a encore des appareils qui détectent pas tout seuls. L&#039;alim n&#039;est peut être pas à découpage)&lt;br /&gt;
# Le fusible&lt;br /&gt;
# La prise secteur&lt;br /&gt;
# Pour relier la masse a quelque chose (une plaque de métal sur la paillasse ...)&lt;br /&gt;
# L&#039;encoche pour l&#039;antivol. Oui c&#039;est un appareil qui se fauche bien. (dans une école par exemple)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le multimétre présenté ci dessus est un [[multicomp PRO MP730027]] vendu par Farnell&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Divers_multimetres.png&amp;diff=1957</id>
		<title>Fichier:Divers multimetres.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Divers_multimetres.png&amp;diff=1957"/>
		<updated>2026-04-23T20:49:51Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Divers multimetres.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;exemple de multimètres&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:BoutonportMP730027.png&amp;diff=1956</id>
		<title>Fichier:BoutonportMP730027.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:BoutonportMP730027.png&amp;diff=1956"/>
		<updated>2026-04-23T20:46:43Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:BoutonportMP730027.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le bouton PORT&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ImageRear_Panel_Overview_.png&amp;diff=1955</id>
		<title>Fichier:ImageRear Panel Overview .png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ImageRear_Panel_Overview_.png&amp;diff=1955"/>
		<updated>2026-04-23T20:41:59Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : dans le manuel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
dans le manuel&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:MP730027_EU-UK.png&amp;diff=1953</id>
		<title>Fichier:MP730027 EU-UK.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:MP730027_EU-UK.png&amp;diff=1953"/>
		<updated>2026-04-23T20:37:10Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:MP730027 EU-UK.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mon multimetre de labo&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_routeur_en_t%C3%AAte_r%C3%A9seau_PI&amp;diff=1952</id>
		<title>Le routeur en tête réseau PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_routeur_en_t%C3%AAte_r%C3%A9seau_PI&amp;diff=1952"/>
		<updated>2026-04-22T21:54:32Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Installation des outils */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
La première étape sera de créer ce qui sera la tête du réseau.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-schema-front.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Schématiquement on a un raspberry PI en frontal. Il n&#039;a en aucun cas besoin de wifi donc un simple Raspbery PI2 sera suffisant.&lt;br /&gt;
&lt;br /&gt;
En revanche il lui faudra deux &amp;quot;pattes&amp;quot; réseau donc un adaptateur USB - Ethernet  sera nécessaire. De plus un écran [[Écran Adafruit 2.8 pouces TFT|Adafruit 2.8&#039;]] sera utilisé pour le &amp;quot;status&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
=== Architecture réseau: ===&lt;br /&gt;
&lt;br /&gt;
* eth0 (le port Ethernet standard) sera relié au WAN en tant que client DHCP. C&#039;est sur le routeur auquel il est relié que le serveur DHCP attribuera (ou pas) une IP fixe. &lt;br /&gt;
* eth1 (le port Ethernet sur USB) sera relié au LAN.  Il sera configuré en serveur DHCP et s&#039;occupera du sub-net 10.11.11.0/24. Les autres raspberry seront reliés à ce port via un switch.&lt;br /&gt;
La configuration réseau n&#039;est pas idéale car le contrôleur USB du PI2 n&#039;est pas USB3 mais USB2 et le port ethernet natif est également un ethernet USB.  Donc les deux ports partageront la bande passante de l&#039;USB2 de 480 Mbs max.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisateur d&#039;un adaptateur gigabit n&#039;a donc pas vraiment d&#039;intérêt car sur les 480 l&#039;Ethernet embarqué utilise déjà 100Mbs... il en reste théoriquement 380 a disposition sans compter les conflits. &lt;br /&gt;
&lt;br /&gt;
Bon moi j&#039;ai un adaptateur gigabit car c&#039;est le standard aujourd&#039;hui! Je serais prêt si je dois passer à un Raspberry PI 4 qui gère de l&#039;USB3 a 5Gbs et un Ethernet Gigabit. Je ne penses cependant pas que ce soit nécessaire. Le switch est gigabit et si, dans le LAN 10.11.11.0/24 on a deux PI4 ils communiqueront entre eux en gigabit.&lt;br /&gt;
&lt;br /&gt;
Derrière on aura donc toute sorte de serveurs basés sur des raspberry PI du genre:&lt;br /&gt;
&lt;br /&gt;
* Serveur node-red&lt;br /&gt;
* Serveur MariaDB&lt;br /&gt;
* Serveur MediaWiki&lt;br /&gt;
* Serveur Git&lt;br /&gt;
* ce dont on aura besoin...&lt;br /&gt;
&lt;br /&gt;
=== Modules installés ===&lt;br /&gt;
Sur ce serveur &amp;quot;front&amp;quot; on aura donc installé:&lt;br /&gt;
&lt;br /&gt;
* Un serveur DHCP pour eth1&lt;br /&gt;
* Un serveur ssh sur eth0 et eth1 utilisé comme &amp;quot;rebond&amp;quot;&lt;br /&gt;
* Un reverse proxy pour faire suivre les demandes vers les serveurs sur le &amp;quot;LAN 10.11.11&amp;quot;&lt;br /&gt;
* Un broker MQTT ouvert sur eth0 et eth1&lt;br /&gt;
* Un driver d&amp;quot;écran Adafruit 2.8&#039;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== La carte SD ===&lt;br /&gt;
On utilise Raspberry Pi Imager https://www.raspberrypi.com/software/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-1.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On choisit le modèle (moi c&#039;est un raspberry PI 2 y&#039;a pas besoin de mieux). Puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-2.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On ne veut pas de &amp;quot;desktop&amp;quot; on choisit &amp;quot;Raspberry PI OS (other)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-3.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On choisit la dernière version sans desktop puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-4.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Moi j&#039;ai qu&#039;un seul port SD il n&#039;y a pas d&#039;ambiguïté je le sélectionne puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-5.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On donne le nom à notre serveur puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-6.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On donne la localisation puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-7.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On définit le nom de l&#039;utilisateur et son mot de passe puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-8.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On peut ignorer le wifi dans notre cas (un raspberry PI 2 n&#039;est pas équité!) &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-9.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On s&#039;arrête un peut sur cette page. &lt;br /&gt;
&lt;br /&gt;
On a définit un login que n&#039;est pas &amp;quot;pi&amp;quot; mais qui peut être aisément trouvé. Notre mot de passe est sûrement très sécurisé mais toujours faillible. Comme le routeur sera probablement acessible de l&#039;extérieur il est nécessaire, a mon avis, de sécuriser le process de login ssh par une clé. J&#039;ai mis la clé publique du PC que j&#039;utilise habituellement pour la maintenance. Une seconde clé pourra être ajouté ultérieurement.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-10.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Je ne penses pas que ce soit nécessaire d&#039;utiliser Pi Connect, d&#039;autant plus que le PI devra être le moins chargé possible. &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-11.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On a un dernier récapitulatif. &amp;quot;WRITE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-12.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Oui je comprends, on efface et on flashe la carte!&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-13.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Ca s&#039;écrit... si une fenêtre proposant de formater la carte s&#039;ouvre... fermez là.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-14.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Apres avoir écrit la carte, on la vérifie (c&#039;est indispensable pour être sûr de la qualité de la carte)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-15.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est terminé. On peut soit en faire une seconde (un backup? mais il faudrait plutôt faire la copie après les étapes suivantes). &amp;quot;FINISH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
La carte est prête on peut lancer le premier boot.&lt;br /&gt;
&lt;br /&gt;
On insère la carte dans le PI2 en question. On y branche un clavier et un écran (ne pas brancher l&#039;adaptateur USB Ethernet la première fois) et GO! On blanche le courant.&lt;br /&gt;
&lt;br /&gt;
=== Premier boot ===&lt;br /&gt;
Il boote correctement.&lt;br /&gt;
&lt;br /&gt;
Moi il bloque un moment sur Network Manager mais continue (je penses que c&#039;est eth1 sur le port USB qui n&#039;est relié a rien qui le gène)&lt;br /&gt;
&lt;br /&gt;
Il boote normalement, affiche la progression sur la console sur l&#039;écran HDMI.&lt;br /&gt;
&lt;br /&gt;
La fin est un succinct :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[ OK ]  Reached target &#039;&#039;&#039;cloud-init.target&#039;&#039;&#039; - Cloud-init target.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et rien ne se passe. C&#039;est normal, pas de panique.&lt;br /&gt;
&lt;br /&gt;
La console à l&#039;écran se limite à... la console de base pour voir les erreurs. Pour se loguer il y a deux solutions :&lt;br /&gt;
&lt;br /&gt;
* Par ssh depuis une autre machine&lt;br /&gt;
* en allant sur une autre console de login &amp;quot;hardware&amp;quot; grâce a &amp;lt;ctrl&amp;gt; + &amp;lt;F2&amp;gt; jusqu&#039;à &amp;lt;F6&amp;gt;. La première &amp;lt;ctrl&amp;gt; &amp;lt;F1&amp;gt; sera toujours là ou seront affichés les messages.&lt;br /&gt;
&lt;br /&gt;
On va configurer les trucs de base.&lt;br /&gt;
&lt;br /&gt;
==== raspi-config ====&lt;br /&gt;
On lance le programme &amp;quot;raspi-config&amp;quot;. On a fait beaucoup du travail au moment de la préparation de la carte SD mais il en reste un peu.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo raspi-config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a le &amp;quot;classique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Raspi-config.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Dans 1 &amp;quot;System options&amp;quot; choisir  S6 &amp;quot;Autologin&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Raspi-config-autologin.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Selectionner &amp;lt;Yes&amp;gt; qui nous réponds &amp;lt;code&amp;gt;&amp;quot;Console autologin is enabled&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Oui si quelqu&#039;un rentre chez nous, branche un écran et un clavier sur la machine il sera logué automatiquement... c&#039;est un risque que je prends car, comme ces machines marchent très bien et durent des années il m&#039;arrive d&#039;oublier leur mot de passe.&lt;br /&gt;
&lt;br /&gt;
Dans 6 &amp;quot;Advanced Options&amp;quot; on choisit A1 &amp;quot;Expand Filesystem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Et le PI nous réponds :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Root partition has been resized.&lt;br /&gt;
The filesystem will be enlarged upon the next reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On valide par &amp;lt;OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au cas ou on lance un 8 &amp;quot;Update&amp;quot; mais si on vient de faire la carte il ne doit pas se passer grand chose.&lt;br /&gt;
&lt;br /&gt;
On branche l&#039;adaptateur USB Ethernet et on reboote&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;on voit le shutdown se dérouler sur la console et le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Le boot bloque un moment sur le démarrage du network manager sur eth1 mais on peut utiliser le serveur quand même.&lt;br /&gt;
&lt;br /&gt;
On peut vérifier que le &amp;quot;resize filesystem&amp;quot; est bien passé:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h /&lt;br /&gt;
Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/mmcblk0p2  229G  2.6G  217G   2% /&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J&#039;ai utilisé une carte de 256 Go on y est presque!&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l&#039;écran ===&lt;br /&gt;
[[Fichier:Adafruit 2.8&#039;&#039;.png|vignette|263x263px|L&#039;écran Adafruit 2.8 pouces]]&lt;br /&gt;
Adafuit le fabricant de l&#039;écran donnait autrefois une distribution spécifique pour cet écran. C&#039;était rapide mais pas très &amp;quot;propre&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Maintenant il y a un script python pour faire ce travail. Adafuit donne le process ici: https://learn.adafruit.com/adafruit-2-8-pitft-capacitive-touch/easy-install-2&lt;br /&gt;
&lt;br /&gt;
Je suis bon camarade je donne ici la méthode.&lt;br /&gt;
&lt;br /&gt;
==== Installation des outils ====&lt;br /&gt;
Il faut d&#039;abord installer les outils python de virtualisation d&#039;environnement.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install python3-venv&lt;br /&gt;
python3 -m venv env --upgrade-deps --system-site-packages&lt;br /&gt;
source env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ensuite on installe le script qui installera lui même l&#039;écran.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
sudo apt-get update                        # discutable&lt;br /&gt;
sudo apt-get install -y git python3-pip    # aussi&lt;br /&gt;
pip3 install --upgrade adafruit-python-shell click Flask-SQLAlchemy&lt;br /&gt;
git clone https://github.com/adafruit/Raspberry-Pi-Installer-Scripts.git&lt;br /&gt;
cd Raspberry-Pi-Installer-Scripts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Bon je penses que certains &amp;lt;code&amp;gt;apt-get install&amp;lt;/code&amp;gt; sont superflus mais je ne prends pas de risques.&lt;br /&gt;
&lt;br /&gt;
==== Installation elle même ====&lt;br /&gt;
Ici chez Adafruit donne une instruction pour chaque modèle d&#039;écran.&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;écran 2.8&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; capacitif :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -E env PATH=$PATH python3 adafruit-pitft.py --display=28c --rotation=90 --install-type=console&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;SI j&#039;avais utilisé la version résistive &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -E env PATH=$PATH python3 adafruit-pitft.py --display=28r --rotation=90 --install-type=console&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca se termine&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
PITFT Updating console to PiTFT...&lt;br /&gt;
Remove fbcp from /etc/rc.local, if it&#039;s there...&lt;br /&gt;
Configuring boot/config.txt for default HDMI&lt;br /&gt;
Installing console fbcon map helper...&lt;br /&gt;
Installing console fbcon map service...&lt;br /&gt;
PITFT Created symlink &#039;/etc/systemd/system/multi-user.target.wants/con2fbmap.service&#039; → &#039;/etc/systemd/system/con2fbmap.service&#039;.&lt;br /&gt;
&lt;br /&gt;
PITFT Job for con2fbmap.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status con2fbmap.service&amp;quot; and &amp;quot;journalctl -xeu con2fbmap.service&amp;quot; for details.&lt;br /&gt;
Turning off console blanking&lt;br /&gt;
Setting raspi-config to boot to console w/o login...&lt;br /&gt;
PITFT Success!&lt;br /&gt;
&lt;br /&gt;
Settings take effect on next boot.&lt;br /&gt;
&lt;br /&gt;
REBOOT NOW? [Y/n] Reboot started...&lt;br /&gt;
Connection to 192.168.0.77 closed by remote host.&lt;br /&gt;
Connection to 192.168.0.77 closed.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;En rebootant le PI.&lt;br /&gt;
&lt;br /&gt;
Et l&#039;écran est actif.&lt;br /&gt;
&lt;br /&gt;
Un dernier problème: Lorsque on reboote sans l&#039;écran HDMI... l&#039;écran LCD ne marche pas c&#039;est ballot&lt;br /&gt;
&lt;br /&gt;
===== Fichier config.txt =====&lt;br /&gt;
&lt;br /&gt;
On l&#039;édite avec&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /boot/firmware/config.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première chose est de DESACTIVER le son car: Si un écran HDMI est branché tout va bien le son est dirigé vers là. Mais il n&#039;y a pas d&#039;écran le son est dirigé vers le port jack 3.5 qui est géré par le GPIO 18 en PWM. On c&#039;est ce GPIO qui est utilisé par Adafruit pour le rétro éclairage de l&#039;écran. &amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Désactiver audio PWM&lt;br /&gt;
dtparam=audio=off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On désactive le son sur le JACK 3.3 comme ça. Le Raspberry PI 5 qui supprime le port jack 3.5 ne doit pas nécessiter cela. &lt;br /&gt;
&lt;br /&gt;
Ensuite  &lt;br /&gt;
&lt;br /&gt;
Et on y trouves &amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# --- added by adafruit-pitft-helper  ---&lt;br /&gt;
[all]&lt;br /&gt;
hdmi_force_hotplug=0&lt;br /&gt;
dtparam=spi=on&lt;br /&gt;
dtparam=i2c1=on&lt;br /&gt;
dtparam=i2c_arm=on&lt;br /&gt;
dtoverlay=pitft28-capacitive,rotate=90,speed=64000000,fps=30,drm&lt;br /&gt;
# --- end adafruit-pitft-helper  ---&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Alors qu&#039;avec :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# --- added by adafruit-pitft-helper ---&lt;br /&gt;
[all]&lt;br /&gt;
dtparam=spi=on&lt;br /&gt;
dtparam=i2c1=on&lt;br /&gt;
dtparam=i2c_arm=on&lt;br /&gt;
dtoverlay=pitft28-capacitive,rotate=270,speed=64000000,fps=30,drm&lt;br /&gt;
dtoverlay=gpio-backlight,gpios=18,active_low=0&lt;br /&gt;
hdmi_force_hotplug=1&lt;br /&gt;
hdmi_group=2&lt;br /&gt;
hdmi_mode=82&lt;br /&gt;
# --- end adafruit-pitft-helper  ---&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est mieux.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai ai profité pour retourner l&#039;écran (rotate=270) car avec un rotatate=90 les boutons sont a gauche.&lt;br /&gt;
&lt;br /&gt;
===== Le fichier cmdline.txt =====&lt;br /&gt;
&lt;br /&gt;
Toujours pour le modifier:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /boot/firmware/cmdline.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On y trouve &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
console=serial0,115200 console=tty1 root=PARTUUID=b104592a-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=FR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On supprime la &amp;quot;sérial console&amp;quot; et on active fbcon.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
console=tty1 fbcon=map:10 root=PARTUUID=b104592a-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=FR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On reboote et ca marche! Même sans l&#039;écran HDMI.&lt;br /&gt;
&lt;br /&gt;
Dans tous les cas on peut acceder au frame buffer sur /dev/fb1 pour la carte écran LCD.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp /dev/random /dev/fb1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et on voit du bruit sur l&#039;écran.&lt;br /&gt;
&lt;br /&gt;
==== Economiseur d&#039;écran. ====&lt;br /&gt;
L&#039;écran LCD est toujours allumé dans ce cas. C&#039;est pratique mais ca chauffe énormément, ça l&#039;use et ca consomme. Bref ppas top.&lt;br /&gt;
&lt;br /&gt;
On va faire un économiseur d&#039;écran. On pourrait le faire en détectant un appui dessus mais la date tactile du mien est morte. On a cependant 4 bon vieux boutons physiques que je vais utiliser.&lt;br /&gt;
&lt;br /&gt;
On a des boutions marqués de haut en bas &amp;lt;code&amp;gt;#17&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#22&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#23&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;#27&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nous nous proposons d&#039;utiliser le bouton du bas soit &amp;lt;code&amp;gt;#27&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Le script bash est assez simple:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# /usr/local/bin/gpio-screen-saver.sh&lt;br /&gt;
# Extinction du backlight après IDLE_TIMEOUT, rallumage par bouton (libgpiod v2).&lt;br /&gt;
# BL=GPIO18 (1=ON, 0=OFF), BTN=GPIO27 (pull-up interne, appui → INACTIVE).&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
CHIP=&amp;quot;/dev/gpiochip0&amp;quot;&lt;br /&gt;
BL_PIN=18&lt;br /&gt;
BTN_PIN=27&lt;br /&gt;
IDLE_TIMEOUT=10      # secondes (adapter)&lt;br /&gt;
SLEEP_STEP=0.2&lt;br /&gt;
MIN_OFF_HOLD=1       # hystérésis OFF minimale (s)&lt;br /&gt;
&lt;br /&gt;
GPIOSET=&amp;quot;/usr/bin/gpioset&amp;quot;&lt;br /&gt;
GPIOGET=&amp;quot;/usr/bin/gpioget&amp;quot;&lt;br /&gt;
&lt;br /&gt;
log() { printf &#039;[backlight] %s\n&#039; &amp;quot;$*&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
is_on=true&lt;br /&gt;
last_activity=$(date +%s)&lt;br /&gt;
off_since=0&lt;br /&gt;
&lt;br /&gt;
cleanup() {&lt;br /&gt;
  if [[ &amp;quot;$is_on&amp;quot; != true ]]; then&lt;br /&gt;
    log &amp;quot;Exit: backlight ON&amp;quot;&lt;br /&gt;
    &amp;quot;$GPIOSET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -t 0 &amp;quot;$BL_PIN=1&amp;quot; || true&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
trap cleanup EXIT&lt;br /&gt;
&lt;br /&gt;
log &amp;quot;Start: backlight ON&amp;quot;&lt;br /&gt;
&amp;quot;$GPIOSET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -t 0 &amp;quot;$BL_PIN=1&amp;quot;&lt;br /&gt;
is_on=true&lt;br /&gt;
last_activity=$(date +%s)&lt;br /&gt;
&lt;br /&gt;
while true; do&lt;br /&gt;
  now=$(date +%s)&lt;br /&gt;
&lt;br /&gt;
  # --- Lecture du bouton avec pull-up ---&lt;br /&gt;
  raw=$(&amp;quot;$GPIOGET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -b pull-up &amp;quot;$BTN_PIN&amp;quot; 2&amp;gt;/dev/null || echo &amp;quot;$BTN_PIN=inactive&amp;quot;)&lt;br /&gt;
  state=$(echo &amp;quot;$raw&amp;quot; | awk -F= &#039;{print $2}&#039;)   # &amp;quot;active&amp;quot; ou &amp;quot;inactive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if [[ &amp;quot;$state&amp;quot; == &amp;quot;inactive&amp;quot; ]]; then&lt;br /&gt;
    # Appui (niveau bas), anti-rebond&lt;br /&gt;
    sleep 0.02&lt;br /&gt;
    raw2=$(&amp;quot;$GPIOGET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -b pull-up &amp;quot;$BTN_PIN&amp;quot; 2&amp;gt;/dev/null || echo &amp;quot;$BTN_PIN=inactive&amp;quot;)&lt;br /&gt;
    state2=$(echo &amp;quot;$raw2&amp;quot; | awk -F= &#039;{print $2}&#039;)&lt;br /&gt;
&lt;br /&gt;
    if [[ &amp;quot;$state2&amp;quot; == &amp;quot;inactive&amp;quot; ]]; then&lt;br /&gt;
      if [[ &amp;quot;$is_on&amp;quot; != true ]]; then&lt;br /&gt;
        log &amp;quot;Button press → backlight ON&amp;quot;&lt;br /&gt;
        &amp;quot;$GPIOSET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -t 0 &amp;quot;$BL_PIN=1&amp;quot;&lt;br /&gt;
        is_on=true&lt;br /&gt;
      fi&lt;br /&gt;
      last_activity=$now&lt;br /&gt;
      sleep 0.2   # anti-rebond&lt;br /&gt;
    fi&lt;br /&gt;
  fi&lt;br /&gt;
  # --- Fin lecture bouton ---&lt;br /&gt;
&lt;br /&gt;
  if [[ &amp;quot;$is_on&amp;quot; == true ]]; then&lt;br /&gt;
    if (( now - last_activity &amp;gt;= IDLE_TIMEOUT )); then&lt;br /&gt;
      log &amp;quot;Idle &amp;gt;= ${IDLE_TIMEOUT}s → backlight OFF&amp;quot;&lt;br /&gt;
      &amp;quot;$GPIOSET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -t 0 &amp;quot;$BL_PIN=0&amp;quot;&lt;br /&gt;
      is_on=false&lt;br /&gt;
      off_since=$now&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
    # Hystérésis OFF minimale (optionnel)&lt;br /&gt;
    if (( now - off_since &amp;lt; MIN_OFF_HOLD )); then :; fi&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  sleep &amp;quot;$SLEEP_STEP&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;La ligne 2&#039;&#039;&#039; indique à bash comment gérer les erreurs &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-e&#039;&#039;&#039;&amp;lt;/code&amp;gt; implique qu&#039;a la première commande en erreur (!=0) le script entier s&#039;arrête (pas besoin de gérer les codes retour)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-u&#039;&#039;&#039;&amp;lt;/code&amp;gt; si on accède à une variable d&#039;environnement non existante le script s&#039;arrête (Lutte contre les fautes de frappe)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-o&#039;&#039;&#039;&amp;lt;/code&amp;gt; est plus subtile. On l&#039;appelle &amp;quot;pipe fail&amp;quot;. Si dans une commande avec des pipe &amp;lt;code&amp;gt;cmd | cmd1 | cmd2&amp;lt;/code&amp;gt;  l&#039;une des commandes plante le code d&#039;erreur du script (le &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt;) sera celui de la commande en question et pas celui de la dernière. si &amp;lt;code&amp;gt;cmd1&amp;lt;/code&amp;gt; provoque une erreur &amp;lt;code&amp;gt;$?=1&amp;lt;/code&amp;gt; mais que &amp;lt;code&amp;gt;cmd2&amp;lt;/code&amp;gt; passe bien &amp;lt;code&amp;gt;$?=0&amp;lt;/code&amp;gt;, le script retournera la valeur du &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt; de &amp;lt;code&amp;gt;cmd1&amp;lt;/code&amp;gt; si l&#039;option &amp;lt;code&amp;gt;-o&amp;lt;/code&amp;gt; est utilisée sinon c&#039;est la dernière qui gagne.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Les lignes 3 et 4&#039;&#039;&#039; définissent les lignes GPIO utilisées. Les adresse commencent à 512 donc l&#039;écran c&#039;est 512+18 (GPIO18) donc 530 et le bouton c&#039;est 512+27 soit 539.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;La ligne 5&#039;&#039;&#039; c&#039;est la durée au bout de laquelle l&#039;écran va s&#039;éteindre de nouveau. (20 sec ça ma paru bien pour un simple affichage de status)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lignes 8 à 13&#039;&#039;&#039; une fonction qui exporte le GPIO si ce n&#039;est pas déjà fait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lignes 16 et 17&#039;&#039;&#039; on définie les directions. écran=out bouton=in&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ligne 20&#039;&#039;&#039; on commence par allumer l&#039;écran&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ligne 22&#039;&#039;&#039; &amp;lt;code&amp;gt;last_activity&amp;lt;/code&amp;gt; reçoit le timestamp courant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lignes 24 à 38&#039;&#039;&#039; c&#039;est la boucle.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lignes 25 à 29&#039;&#039;&#039; on allume l&#039;écran su on détecte un appui sur le bouton et &amp;lt;code&amp;gt;ast_activity&amp;lt;/code&amp;gt; reçoit le timestamp courant.&lt;br /&gt;
* Lignes 31 à 35 on éteint l&#039;écran si on a dépassé le timeout &amp;lt;code&amp;gt;now - last_activity &amp;gt;= IDLE_TIMEOUT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Et c&#039;est tout.&lt;br /&gt;
&lt;br /&gt;
Maintenant on va faire un service ([[Deamon avec systemd|un deamon]]) de ce script. C&#039;est décrit dans le lien mail je donne la conf spécifique:&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Daemon pour économiseur d&#039;écran GPIO&lt;br /&gt;
After=multi-user.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
ExecStart=/usr/local/bin/gpio-screen-saver.sh&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=2&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On donne les noms suivants aux fichiers&lt;br /&gt;
&lt;br /&gt;
* gpio-screen-saver.sh est le bash vu plus haut&lt;br /&gt;
* gpio-screen-saver.service le fichier de conf ci-dessus&lt;br /&gt;
&lt;br /&gt;
On installe avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
sudo cp gpio-screen-saver.sh /usr/local/bin/&lt;br /&gt;
sudo chmod +x /usr/local/bin/gpio-screen-saver.sh&lt;br /&gt;
sudo cp gpio-screen-saver.service /etc/systemd/system/&lt;br /&gt;
&lt;br /&gt;
sudo systemctl daemon-reload&lt;br /&gt;
sudo systemctl enable --now gpio-screen-saver.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;SI ca marche bien il affiche juste le lien crée.&lt;br /&gt;
&lt;br /&gt;
===== Arrêt relance =====&lt;br /&gt;
Tout ceci est bien beau mais l&#039;écran LCD peut aussi servir de console de secours. Il suffit de branche un clavier et de taper ctrl+c et on récupère la console. Le timeout de 20 seconde va vite devenir insupportable (oui le clavier n&#039;est pas pris en compte dedans).&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl stop gpio-screen-saver.service       # Arrète le service&lt;br /&gt;
sudo systemctl start gpio-screen-saver.service      # Démarre le service&lt;br /&gt;
sudo systemctl restart gpio-screen-saver.service    # Redémarre le service (si on change la valeur du timeout pas exemple)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour avoir le statut:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status gpio-screen-saver.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui nous donne un joli:&lt;br /&gt;
[[Fichier:Screen-saver.service.png|sans_cadre|838x838px]]&lt;br /&gt;
Avec tout plein de détails.&lt;br /&gt;
&lt;br /&gt;
Pour que l&#039;arrêt soit définitif (même après un reboot):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable gpio-screen-saver.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et pour le réactiver&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl enable gpio-screen-saver.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== La configuration du réseau ===&lt;br /&gt;
Les Raspberry PI ne sont malheureusement équipés que d&#039;un seul port Ethernet. Il faut en ajouter un autre sur l&#039;un des ports USB. &lt;br /&gt;
&lt;br /&gt;
Cependant ce n&#039;est pas catastrophique. Le port eth0 est lui aussi un device USB sauf qu&#039;il est soudé sur la carte.&lt;br /&gt;
&lt;br /&gt;
Lorsque je banche mon adaptateur réseau sur un prise USB, j&#039;ai dans dmesg :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[   67.026854] usb 1-1.4: new high-speed USB device number 5 using dwc_otg&lt;br /&gt;
[   67.132758] usb 1-1.4: New USB device found, idVendor=0b95, idProduct=1790, bcdDevice= 2.00&lt;br /&gt;
[   67.132807] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[   67.132831] usb 1-1.4: Product: AX88179B&lt;br /&gt;
[   67.132851] usb 1-1.4: Manufacturer: ASIX&lt;br /&gt;
[   67.132869] usb 1-1.4: SerialNumber: 004132D3&lt;br /&gt;
[   67.275834] usbcore: registered new interface driver cdc_ether&lt;br /&gt;
[   67.323914] cdc_ncm 1-1.4:2.0: MAC-Address: 9c:69:d3:41:32:d3&lt;br /&gt;
[   67.323953] cdc_ncm 1-1.4:2.0: setting rx_max = 16384&lt;br /&gt;
[   67.324279] cdc_ncm 1-1.4:2.0: setting tx_max = 16384&lt;br /&gt;
[   67.325521] cdc_ncm 1-1.4:2.0 eth1: register &#039;cdc_ncm&#039; at usb-3f980000.usb-1.4, CDC NCM (NO ZLP), 9c:69:d3:41:32:d3&lt;br /&gt;
[   67.325863] usbcore: registered new interface driver cdc_ncm&lt;br /&gt;
[   67.346165] usbcore: registered new interface driver cdc_wdm&lt;br /&gt;
[   67.352494] usbcore: registered new interface driver cdc_mbim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Avec ifconfig j&#039;ai bien deux interfaces:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
eth0: flags=4163&amp;lt;UP,BROADCAST,RUNNING,MULTICAST&amp;gt;  mtu 1500&lt;br /&gt;
        inet 192.168.X.XX  netmask 255.255.255.0  broadcast 192.168.X.255&lt;br /&gt;
        inet6 fe80::xxxx:xxxx:xxxx:xxxx prefixlen 64  scopeid 0x20&amp;lt;link&amp;gt;&lt;br /&gt;
        inet6 2a01:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx prefixlen 64  scopeid 0x0&amp;lt;global&amp;gt;&lt;br /&gt;
        ether b8:27:eb:1c:05:fc  txqueuelen 1000  (Ethernet)&lt;br /&gt;
        RX packets 340  bytes 39348 (38.4 KiB)&lt;br /&gt;
        RX errors 0  dropped 0  overruns 0  frame 0&lt;br /&gt;
        TX packets 266  bytes 78263 (76.4 KiB)&lt;br /&gt;
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0&lt;br /&gt;
&lt;br /&gt;
eth1: flags=4099&amp;lt;UP,BROADCAST,MULTICAST&amp;gt;  mtu 1500&lt;br /&gt;
        ether 9c:69:d3:41:32:d3  txqueuelen 1000  (Ethernet)&lt;br /&gt;
        RX packets 0  bytes 0 (0.0 B)&lt;br /&gt;
        RX errors 0  dropped 0  overruns 0  frame 0&lt;br /&gt;
        TX packets 0  bytes 0 (0.0 B)&lt;br /&gt;
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;eth0&#039;&#039;&#039; est bien en DHCP sur mon routeur lui même connecté sur internet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;eth1&#039;&#039;&#039; est disponible. Configurons la. &lt;br /&gt;
&lt;br /&gt;
Notre objectif:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;eth1&amp;lt;/code&amp;gt; (USB‑Ethernet) en IP statique &amp;lt;code&amp;gt;10.11.11.1/24&amp;lt;/code&amp;gt; – passerelle du LAN.&lt;br /&gt;
* Serveur DHCP via &amp;lt;code&amp;gt;dnsmasq&amp;lt;/code&amp;gt; : plage &amp;lt;code&amp;gt;10.11.11.100–10.11.11.200&amp;lt;/code&amp;gt;, passerelle &amp;lt;code&amp;gt;10.11.11.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Routage IPv4 activé et NAT (masquerade) avec &amp;lt;code&amp;gt;nftables&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SI l&#039;adaptateur Ethernet n&#039;a pas été détecté en tant que eth1 il faudra changer cette valeur dans les commandes qui suivent.&lt;br /&gt;
&lt;br /&gt;
On entre les commandes:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nmcli con add type ethernet ifname eth0 con-name wan ipv4.method auto ipv6.method ignore&lt;br /&gt;
sudo nmcli con add type ethernet ifname eth1 con-name lan ipv4.method manual ipv4.addresses 10.11.11.1/24 ipv4.never-default yes ipv6.method ignore&lt;br /&gt;
sudo nmcli con up wan&lt;br /&gt;
sudo nmcli con up lan&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DHCP (dnsmasq) ====&lt;br /&gt;
On entre les commandes&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install -y dnsmasq&lt;br /&gt;
sudo tee /etc/dnsmasq.d/lan.conf &amp;gt;/dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
listen-address=127.0.0.1,10.11.11.1&lt;br /&gt;
domain=pilan&lt;br /&gt;
local=/pilan/&lt;br /&gt;
interface=eth1&lt;br /&gt;
bind-interfaces&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
dhcp-range=10.11.11.100,10.11.11.200,255.255.255.0,24h&lt;br /&gt;
dhcp-option=option:router,10.11.11.1&lt;br /&gt;
EOF&lt;br /&gt;
sudo systemctl enable --now dnsmasq&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca y est notre serveur DHCP est fonctionnel sur un LAN qui s&#039;appelle &amp;lt;code&amp;gt;pilan&amp;lt;/code&amp;gt;. Il qui écoute sur 10.11.11.1 mais aussi localhost. non pas qu&#039;il ait à servir des IP par DHCP à lui même mais pour servir de serveur DNS à lui aussi (on parle de DSN plus loin)&lt;br /&gt;
&lt;br /&gt;
==== Routage IPv4 et NAT ====&lt;br /&gt;
Il faut maintenant orchestrer le routage entre eth0 et eth1.&lt;br /&gt;
&lt;br /&gt;
On active le routage:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ip_forward=1&#039; | sudo tee /etc/sysctl.d/99-ip-forward.conf&lt;br /&gt;
sudo sysctl -p /etc/sysctl.d/99-ip-forward.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On configure nftables:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/nftables.conf &amp;gt;/dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
flush ruleset&lt;br /&gt;
table inet filter {&lt;br /&gt;
  chain input   { type filter hook input priority 0; policy accept; }&lt;br /&gt;
  chain output  { type filter hook output priority 0; policy accept; }&lt;br /&gt;
  chain forward { type filter hook forward priority 0; policy drop;&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
    iif &amp;quot;eth1&amp;quot; oif &amp;quot;eth0&amp;quot; accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
table ip nat {&lt;br /&gt;
  chain postrouting { type nat hook postrouting priority 100;&lt;br /&gt;
    oif &amp;quot;eth0&amp;quot; masquerade&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
EOF&lt;br /&gt;
sudo systemctl enable --now nftables&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On vérifie par :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip addr show eth1&lt;br /&gt;
&lt;br /&gt;
3: eth1: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc fq_codel state DOWN group default qlen 1000&lt;br /&gt;
    link/ether 9c:69:d3:41:32:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 10.11.11.1/24 brd 10.11.11.255 scope global noprefixroute eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Bon il n&#039;est relié a rien (NO-CARRIER et state DOWN) mais il a bien une adresse IP correcte.&lt;br /&gt;
&lt;br /&gt;
SI je branche mon PC dessus j&#039;ai bien :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip addr show eth1&lt;br /&gt;
&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000&lt;br /&gt;
    link/ether 9c:69:d3:41:32:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 10.11.11.1/24 brd 10.11.11.255 scope global noprefixroute eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::9e69:d3ff:fe41:32d3/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;L&#039;état est passé à BROADCAST et state UP&lt;br /&gt;
&lt;br /&gt;
==== Un petit dashboard sur la console ====&lt;br /&gt;
Un petit script permet d&#039;avoir les info essentielles :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
set -o pipefail&lt;br /&gt;
&lt;br /&gt;
printf &amp;quot;\e[2J&amp;quot;&lt;br /&gt;
esc=$&#039;\e&#039;&lt;br /&gt;
while [ 1 ]&lt;br /&gt;
do&lt;br /&gt;
    printf &amp;quot;\e[1;1H&amp;quot;&lt;br /&gt;
    date &amp;quot;+%d/%m/%Y %H:%M&amp;quot;&lt;br /&gt;
    echo &amp;quot;-----------------------------------------------&amp;quot;&lt;br /&gt;
    echo -n &amp;quot;Routeur WAN IP: &amp;quot;&lt;br /&gt;
    ifconfig eth0 | grep &amp;quot;inet &amp;quot; | awk &#039;{print $2 &amp;quot;  &amp;quot;}&#039;&lt;br /&gt;
    echo -n &amp;quot;LAN Gateway   : &amp;quot;&lt;br /&gt;
    ifconfig eth1 | grep &amp;quot;inet &amp;quot; | awk &#039;{print $2 &amp;quot;  &amp;quot;}&#039;&lt;br /&gt;
    echo &amp;quot;-----------------------------------------------&amp;quot;&lt;br /&gt;
    echo &amp;quot;LAN Clients: &amp;quot;&lt;br /&gt;
    cat /var/lib/misc/dnsmasq.leases | awk &#039;{print &amp;quot;\033[94m&amp;quot;,$2, &amp;quot;\033[0m&amp;quot;,$3,&amp;quot;\033[93m&amp;quot;,$4,&amp;quot;\033[0m&amp;quot;}&#039;&lt;br /&gt;
    echo &amp;quot;-----------------------------------------------&amp;quot;&lt;br /&gt;
    echo &amp;quot;Services: http&amp;quot;&lt;br /&gt;
    printf &amp;quot;node-red\t&amp;quot;&lt;br /&gt;
    curl --max-time 2 -I -s http://main-host.pilan:1880 | grep HTTP | sed &amp;quot;s/OK/${esc}[30;42m[OK]${esc}[0m 1880/&amp;quot;&lt;br /&gt;
    if [[ $? != 0 ]]; then&lt;br /&gt;
            printf &amp;quot;\033[31mERREUR\033[0m\n&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    printf &amp;quot;webssh  \t&amp;quot;&lt;br /&gt;
    curl --max-time 2 -I -s http://main-host.pilan:8888 | grep HTTP  | sed &amp;quot;s/OK/${esc}[30;42m[OK]${esc}[0m 8888/&amp;quot;&lt;br /&gt;
    if [[ $? != 0 ]]; then&lt;br /&gt;
            printf &amp;quot;\033[31mERREUR\033[0m\n&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 10&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on le lance:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dashboard-router.png|sans_cadre|432x432px]]&lt;br /&gt;
&lt;br /&gt;
Le plus élégant serait que ce script se lance sur le petit écran LCD du PI au démarrage. Facile on a configuré l&#039;autologin...&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vi ~/.profile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et on ajoute à la fin:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
if [ -n &amp;quot;$SSH_CONNECTION&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Welcome to SSH users&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    tput civis         # Hide carret&lt;br /&gt;
    ./router-dash.sh   &lt;br /&gt;
    tput cnorm         # Show carret&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Sur la console principale (l&#039;écran LCD adafruit) il est toujours possible de sortir du dashboard avec &amp;lt;Ctrl&amp;gt; + C &lt;br /&gt;
&lt;br /&gt;
=== Serveur DNS ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
On a déjà installé dnsmasq donc rien a installer de plus. &lt;br /&gt;
&lt;br /&gt;
Sur les clients ça marche déjà nickel (Comme on dit a Goro)&lt;br /&gt;
&lt;br /&gt;
En revanche sur le routeur lui-même on utilise le DNS fournit par network manager et il utilise celui qui nous a été donné par le serveur DHCP utilisé lors de la conf de eth0.&lt;br /&gt;
&lt;br /&gt;
Pas de panique c&#039;est juste de la conf.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nmcli connection modify &amp;quot;wan&amp;quot; ipv4.dns &amp;quot;127.0.0.1 192.168.0.1&amp;quot;&lt;br /&gt;
sudo nmcli connection modify &amp;quot;wan&amp;quot; ipv4.ignore-auto-dns yes&lt;br /&gt;
sudo nmcli connection up &amp;quot;wan&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On redémarre dnsmasq:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl restart dnsmasq&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je ne suis pas sûr que ce soit nécessaire mais bon... par acquis de conscience.&lt;br /&gt;
&lt;br /&gt;
==== Tests ====&lt;br /&gt;
Pour tester il nous faudra des outils DNS donc :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Déja on vérifie que sur le &amp;quot;patte&amp;quot; par défaut (eth0) on accède aux deus serveurs DNS:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 nmcli device show eth0 | grep IP4.DNS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Doit nous donner DEUX lignes:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
IP4.DNS[1]:                             127.0.0.1&lt;br /&gt;
IP4.DNS[2]:                             192.168.1.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ici le DNS n°2 est celui de ma box.&lt;br /&gt;
&lt;br /&gt;
On teste:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dig database&lt;br /&gt;
dig database.pilan&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui tous deux nous donnent les détail sur 10.11.11.50 (voir plus bas)&lt;br /&gt;
&lt;br /&gt;
=== Reverse proxy CADDY ===&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
Le &amp;quot;repository&amp;quot; n&#039;est pas standard. Donc il faut demander gentiement:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# 1. Ajouter la clé GPG&lt;br /&gt;
curl -1sLf &#039;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&#039; | \&lt;br /&gt;
sudo tee /etc/apt/trusted.gpg.d/caddy.gpg &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# 2. Ajouter le dépôt&lt;br /&gt;
curl -1sLf &#039;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&#039; | \&lt;br /&gt;
sudo tee /etc/apt/sources.list.d/caddy-stable.list&lt;br /&gt;
&lt;br /&gt;
# 3. Installer Caddy&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install caddy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ensuite on teste caddy&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
caddy version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Moi j&#039;ai un truc comme:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;v2.10.1 h1:g/gTHGFRTY0dec+UgMw9Snxdgytr+KK2TdvoRL/Ovu6U8=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On doit être en &amp;lt;code&amp;gt;v2.10.1&amp;lt;/code&amp;gt; avec un n° de build bizarre en base64... (le décodage donne rien...)&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Creation page de test&lt;br /&gt;
sudo mkdir -p /var/www/front&lt;br /&gt;
echo &amp;quot;&amp;lt;h1&amp;gt;Welcome to Front Router&amp;lt;/h1&amp;gt;&amp;quot; | sudo tee /var/www/front/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On édite le &amp;quot;caddy file&amp;quot;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/caddy/Caddyfile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Avec &amp;lt;syntaxhighlight lang=&amp;quot;apacheconf&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
        auto_https off # Pas de HTTPS auto en LAN&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:80 {&lt;br /&gt;
        root * /var/www/front&lt;br /&gt;
        file_server&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
secure.pinon-hebert.fr {&lt;br /&gt;
        root * /var/www/front&lt;br /&gt;
        file_server&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main-host.pilan {&lt;br /&gt;
        reverse_proxy http://main-host.pilan:8080 # ce sera pour plus tard rien n&#039;écoute ici&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On valide la conf:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo caddy fmt --overwrite /etc/caddy/Caddyfile&lt;br /&gt;
sudo caddy validate --config /etc/caddy/Caddyfile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne doit pas avoir d&#039;erreur et de warnings.&lt;br /&gt;
&lt;br /&gt;
Et on relance Caddy:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl reload caddy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On vérifie que le port 80 soit ouvert!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ss -ltnp | grep :80&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui doit répondre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;LISTEN 0      4096                                  *:80              *:*    users:((&amp;quot;caddy&amp;quot;,pid=26458,fd=7))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et un &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl http://front-router&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Réponds :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Welcome to Front Router&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chiffrement avec let&#039;s encrypy ===&lt;br /&gt;
Caddy incorpore par défaut un lien avec let&#039;s encrypt. Il n&#039;y a rien a faire de ce côté là!&lt;br /&gt;
&lt;br /&gt;
== Administration ==&lt;br /&gt;
Une fois installé voici les opérations d&#039;administrations possibles.&lt;br /&gt;
&lt;br /&gt;
=== Ajouter une redirection &amp;quot;reverse proxy&amp;quot; ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attention&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|45x45px]]&lt;br /&gt;
|Pour que la redirection fonctionne il faut que le process serveur sur la machine distante soit à l&#039;écoute sur le réseau et pas seulement sur localhost!&lt;br /&gt;
&amp;lt;code&amp;gt;listen 0.0.0.0         OUI&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;listen 127.0.0.1       NON&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Prérequis ====&lt;br /&gt;
Il faut avoir enregistré un DNS toto.mondomaine.com qui pointe vers une adresse IP qui, d&#039;une manière ou une autre arrive sur le routeur de tête. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attention&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|45x45px]]&lt;br /&gt;
|Il faut également que ce routeur soit ouvert sur les ports 80 et 443. &lt;br /&gt;
Oui il faut laisser ouvert le port 80 avec un serveur http derrière car let&#039;s encrypt s&#039;en sert lors du renouvellement.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# === Site public HTTPS vers toto (Let&#039;s Encrypt automatique) ===&lt;br /&gt;
toto.mondomaine.com {&lt;br /&gt;
        # (Optionnel) Email ACME pour les notifications de certificat&lt;br /&gt;
        tls tecinfo@mondomaine.com&lt;br /&gt;
&lt;br /&gt;
        # Logs utiles&lt;br /&gt;
        log {&lt;br /&gt;
                output file /var/log/caddy/toto.log&lt;br /&gt;
                format json&lt;br /&gt;
                level INFO&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # Compression &amp;amp; quelques en-têtes sécurité&lt;br /&gt;
        encode zstd gzip&lt;br /&gt;
        header {&lt;br /&gt;
                Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot;&lt;br /&gt;
                X-Content-Type-Options &amp;quot;nosniff&amp;quot;&lt;br /&gt;
                X-Frame-Options &amp;quot;DENY&amp;quot;&lt;br /&gt;
                Referrer-Policy &amp;quot;strict-origin-when-cross-origin&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # Reverse proxy vers Node-RED sur IP qui héberge TOTO A.B.C.B et le port de TOTO PORT&lt;br /&gt;
        reverse_proxy http://A.B.C.B:PORT {&lt;br /&gt;
                # Caddy gère automatiquement WebSocket et X-Forwarded-*&lt;br /&gt;
                # Si nécessaire :&lt;br /&gt;
                # header_up Host {host}&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# === (Recommandé) Forcer HTTP -&amp;gt; HTTPS pour ce FQDN ===&lt;br /&gt;
http://toto.mondomaine.com {&lt;br /&gt;
        redir https://toto.mondomaine.com{uri}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il faut créer le fichier de log &amp;quot;à la main&amp;quot;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Si c&#039;est pas fait&lt;br /&gt;
sudo mkdir -p /var/log/caddy&lt;br /&gt;
sudo chown -R caddy:caddy /var/log/caddy&lt;br /&gt;
sudo chmod 750 /var/log/caddy&lt;br /&gt;
# et ensuite &lt;br /&gt;
sudo mkdir /var/log/caddy/toto.log&lt;br /&gt;
sudo chown -R caddy:caddy /var/log/caddy/toto.log&lt;br /&gt;
sudo chmod 750 /var/log/caddy/toto.log&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ensuite on relance caddy.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl start caddy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Y&#039;a 300 000 raisons pour que ça ne marche pas du premier coup mais si on fait bien tout étape par étape ça doit marcher!&lt;br /&gt;
&lt;br /&gt;
=== Gestion des connexions ssh ===&lt;br /&gt;
Je ne sais pas pourquoi mais mon installation du routeur en &amp;lt;code&amp;gt;Raspbian GNU/Linux 13&amp;lt;/code&amp;gt; vit mal les serveurs du LAN en  &amp;lt;code&amp;gt;Debian GNU/Linux 12&amp;lt;/code&amp;gt; qui datent d&#039;il y a a peine 6 mois....&lt;br /&gt;
&lt;br /&gt;
AU ssh j&#039;ai des erreurs:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Unable to negotiate with 10.11.11.50 port 22: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,kex-strict-s-v00@openssh.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Une sombre histoire d&#039;algo de hashage que raspbian 13 considèrent comme à risque. Je vais passer les clients en  &amp;lt;code&amp;gt;Raspbian GNU/Linux 13&amp;lt;/code&amp;gt; des que possible mais en attendent j&#039;ai accepé des compromis sur la sécu pour les machines du lan &amp;lt;code&amp;gt;pilan&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dans mon ~/.ssh/config j&#039;ai ajouté:&amp;lt;syntaxhighlight lang=&amp;quot;apacheconf&amp;quot;&amp;gt;&lt;br /&gt;
Host *.pilan&lt;br /&gt;
    User admin&lt;br /&gt;
&lt;br /&gt;
    # Autoriser l&#039;ancien échange de clés (KEX)&lt;br /&gt;
    KexAlgorithms +diffie-hellman-group14-sha1&lt;br /&gt;
&lt;br /&gt;
    # Si les serveurs n&#039;annoncent que des clés/ signatures SHA-1&lt;br /&gt;
    HostkeyAlgorithms +ssh-rsa&lt;br /&gt;
    PubkeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
&lt;br /&gt;
    # (Optionnel) ciphers classiques&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ce qui fait que pour les machines du lan et seulement avec le user admin on peut se loguer depuis le front. &lt;br /&gt;
&lt;br /&gt;
=== Gestion de l&#039;allocation d&#039;IP fixes en DHCP ===&lt;br /&gt;
Autant je sous traite l&#039;adresse du routeur lui même sur sa &amp;quot;patte&amp;quot; eth0 au routeur qui lui est supérieur (ma box par exemple) autant, pour les machines branchées sur eth1 il peut être intéressant de leur donner une IP fixe.&lt;br /&gt;
&lt;br /&gt;
On peut rendre l&#039;IP statique sur le client mais le plus propre est de laisser le client en DHCP mais reconnaitre l&#039;adresse MAC du client et configurer le serveur DHCP pour lui donner TOUJOURS la même IP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Par exemple je voudrais que mon serveur de base de données appelé dadabase possède l&#039;adresse IP 10.11.11.50&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je relève son adresse mac sur le dashboard:&lt;br /&gt;
&lt;br /&gt;
Pour le moment on lui a donné:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;b8:27:ee:cc:f9:ac 10.11.11.171 database&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut simplement éditer le fichier: &amp;lt;code&amp;gt;/etc/dnsmasq.d/lan.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
 sudo vi /etc/dnsmasq.d/lan.conf&lt;br /&gt;
Et ajouter/modifier la ligne :&lt;br /&gt;
 dhcp-host=b8:27:ee:cc:f9:ac,10.11.11.50,database&lt;br /&gt;
Le serveur &amp;quot;&amp;lt;code&amp;gt;database&amp;lt;/code&amp;gt;&amp;quot; dont l&#039;adresse MAC est &amp;lt;code&amp;gt;b8:27:ee:cc:f9:ac&amp;lt;/code&amp;gt; se verra systématiquement affecté l&#039;adresse &amp;lt;code&amp;gt;10.11.11.50&amp;lt;/code&amp;gt;. Pour que le serveur prenne en compte le changement il faut relancer &amp;lt;code&amp;gt;dnsmasq&amp;lt;/code&amp;gt;&lt;br /&gt;
 sudo systemctl restart dnsmasq&lt;br /&gt;
Et c&#039;est tout.&lt;br /&gt;
&lt;br /&gt;
=== Ajout d&#039;une règle de redirection de port NAP/PAT ===&lt;br /&gt;
Dans cet exemple je vais rediriger ce qui rentre sur le port 2222 de eth0 sur front-router vers le port 22 sur le serveur git.&lt;br /&gt;
&lt;br /&gt;
==== Modification: ====&lt;br /&gt;
Tout se fait dans &amp;lt;code&amp;gt;/etc/nftables.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On ajoute dans &amp;lt;code&amp;gt;table ip filter&amp;lt;/code&amp;gt; la chaine &amp;lt;code&amp;gt;forward&amp;lt;/code&amp;gt;doit être modifiée:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  chain forward {&lt;br /&gt;
    type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # flux établis&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # ICI LES ANCIENNES REGLES&lt;br /&gt;
&lt;br /&gt;
    # DNAT SSH WAN:2222 -&amp;gt; GIT:22&lt;br /&gt;
    iifname $WAN oifname $LAN ip daddr $GIT tcp dport 22 ct state new accept&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et le post routing.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
table ip nat {&lt;br /&gt;
  chain prerouting {&lt;br /&gt;
    type nat hook prerouting priority -100; policy accept;&lt;br /&gt;
&lt;br /&gt;
    # DNAT SSH (port 2222 du frontal -&amp;gt; GIT:22)&lt;br /&gt;
    iifname $WAN tcp dport 2222 dnat to $GIT:22&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Application ====&lt;br /&gt;
On valide la syntaxe par :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nft -f /etc/nftables.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et on relance par :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl restart nftables&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Récapitulation ====&lt;br /&gt;
Le fichier &amp;lt;code&amp;gt;/etc/nftables.conf&amp;lt;/code&amp;gt; contient maintenant :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
define WAN = &amp;quot;eth0&amp;quot;                 # 192.168.0.0/24&lt;br /&gt;
define LAN = &amp;quot;eth1&amp;quot;                 # 10.11.11.0/24&lt;br /&gt;
define LAN_NET = 10.11.11.0/24&lt;br /&gt;
define GIT = 10.11.11.30&lt;br /&gt;
&lt;br /&gt;
table ip filter {&lt;br /&gt;
  chain input {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # loopback&lt;br /&gt;
    iifname &amp;quot;lo&amp;quot; accept&lt;br /&gt;
&lt;br /&gt;
    # established/related&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # ICMP utile&lt;br /&gt;
    ip protocol icmp accept&lt;br /&gt;
&lt;br /&gt;
    # DNS vers le routeur (clients du sous-LAN)&lt;br /&gt;
    iifname $LAN udp dport 53 accept&lt;br /&gt;
    iifname $LAN tcp dport 53 accept&lt;br /&gt;
&lt;br /&gt;
    # DHCP serveur (dnsmasq)&lt;br /&gt;
    iifname $LAN udp sport 68 udp dport 67 accept&lt;br /&gt;
    iifname $LAN udp sport 67 udp dport 68 accept&lt;br /&gt;
&lt;br /&gt;
    # SSH vers le routeur (port 22)&lt;br /&gt;
    iifname $LAN tcp dport 22 accept&lt;br /&gt;
    ip saddr 192.168.0.0/24 iifname $WAN tcp dport 22 accept&lt;br /&gt;
&lt;br /&gt;
    # HTTP/HTTPS vers Caddy sur le frontal&lt;br /&gt;
    iifname $WAN tcp dport {80, 443} accept&lt;br /&gt;
    iifname $LAN tcp dport {80, 443} accept&lt;br /&gt;
    # HTTP/3 (QUIC)&lt;br /&gt;
    iifname $WAN udp dport 443 accept&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  chain forward {&lt;br /&gt;
    type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # flux établis&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # LAN -&amp;gt; WAN (trafic sortant)&lt;br /&gt;
    iifname $LAN oifname $WAN ct state new accept&lt;br /&gt;
&lt;br /&gt;
    # DNAT SSH WAN:2222 -&amp;gt; GIT:22&lt;br /&gt;
    iifname $WAN oifname $LAN ip daddr $GIT tcp dport 22 ct state new accept&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  chain output {&lt;br /&gt;
    type filter hook output priority 0; policy accept;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table ip nat {&lt;br /&gt;
  chain prerouting {&lt;br /&gt;
    type nat hook prerouting priority -100; policy accept;&lt;br /&gt;
&lt;br /&gt;
    # DNAT SSH (port 2222 du frontal -&amp;gt; GIT:22)&lt;br /&gt;
    iifname $WAN tcp dport 2222 dnat to $GIT:22&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
chain postrouting {&lt;br /&gt;
    type nat hook postrouting priority 100; policy accept;&lt;br /&gt;
&lt;br /&gt;
    # Masquerade LAN -&amp;gt; WAN&lt;br /&gt;
    oifname $WAN ip saddr $LAN_NET masquerade&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Oui c&#039;est mort depuis le WAN seul le HTTPS est ouvert (et le HTTP pour let&#039;s encrypt) inutile d&#039;essayer de rentrer (par là en tout cas)&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_routeur_en_t%C3%AAte_r%C3%A9seau_PI&amp;diff=1951</id>
		<title>Le routeur en tête réseau PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_routeur_en_t%C3%AAte_r%C3%A9seau_PI&amp;diff=1951"/>
		<updated>2026-04-22T21:52:25Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : correction venv python d&amp;#039;install de l&amp;#039;écran&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
La première étape sera de créer ce qui sera la tête du réseau.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-schema-front.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Schématiquement on a un raspberry PI en frontal. Il n&#039;a en aucun cas besoin de wifi donc un simple Raspbery PI2 sera suffisant.&lt;br /&gt;
&lt;br /&gt;
En revanche il lui faudra deux &amp;quot;pattes&amp;quot; réseau donc un adaptateur USB - Ethernet  sera nécessaire. De plus un écran [[Écran Adafruit 2.8 pouces TFT|Adafruit 2.8&#039;]] sera utilisé pour le &amp;quot;status&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
=== Architecture réseau: ===&lt;br /&gt;
&lt;br /&gt;
* eth0 (le port Ethernet standard) sera relié au WAN en tant que client DHCP. C&#039;est sur le routeur auquel il est relié que le serveur DHCP attribuera (ou pas) une IP fixe. &lt;br /&gt;
* eth1 (le port Ethernet sur USB) sera relié au LAN.  Il sera configuré en serveur DHCP et s&#039;occupera du sub-net 10.11.11.0/24. Les autres raspberry seront reliés à ce port via un switch.&lt;br /&gt;
La configuration réseau n&#039;est pas idéale car le contrôleur USB du PI2 n&#039;est pas USB3 mais USB2 et le port ethernet natif est également un ethernet USB.  Donc les deux ports partageront la bande passante de l&#039;USB2 de 480 Mbs max.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisateur d&#039;un adaptateur gigabit n&#039;a donc pas vraiment d&#039;intérêt car sur les 480 l&#039;Ethernet embarqué utilise déjà 100Mbs... il en reste théoriquement 380 a disposition sans compter les conflits. &lt;br /&gt;
&lt;br /&gt;
Bon moi j&#039;ai un adaptateur gigabit car c&#039;est le standard aujourd&#039;hui! Je serais prêt si je dois passer à un Raspberry PI 4 qui gère de l&#039;USB3 a 5Gbs et un Ethernet Gigabit. Je ne penses cependant pas que ce soit nécessaire. Le switch est gigabit et si, dans le LAN 10.11.11.0/24 on a deux PI4 ils communiqueront entre eux en gigabit.&lt;br /&gt;
&lt;br /&gt;
Derrière on aura donc toute sorte de serveurs basés sur des raspberry PI du genre:&lt;br /&gt;
&lt;br /&gt;
* Serveur node-red&lt;br /&gt;
* Serveur MariaDB&lt;br /&gt;
* Serveur MediaWiki&lt;br /&gt;
* Serveur Git&lt;br /&gt;
* ce dont on aura besoin...&lt;br /&gt;
&lt;br /&gt;
=== Modules installés ===&lt;br /&gt;
Sur ce serveur &amp;quot;front&amp;quot; on aura donc installé:&lt;br /&gt;
&lt;br /&gt;
* Un serveur DHCP pour eth1&lt;br /&gt;
* Un serveur ssh sur eth0 et eth1 utilisé comme &amp;quot;rebond&amp;quot;&lt;br /&gt;
* Un reverse proxy pour faire suivre les demandes vers les serveurs sur le &amp;quot;LAN 10.11.11&amp;quot;&lt;br /&gt;
* Un broker MQTT ouvert sur eth0 et eth1&lt;br /&gt;
* Un driver d&amp;quot;écran Adafruit 2.8&#039;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== La carte SD ===&lt;br /&gt;
On utilise Raspberry Pi Imager https://www.raspberrypi.com/software/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-1.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On choisit le modèle (moi c&#039;est un raspberry PI 2 y&#039;a pas besoin de mieux). Puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-2.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On ne veut pas de &amp;quot;desktop&amp;quot; on choisit &amp;quot;Raspberry PI OS (other)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-3.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On choisit la dernière version sans desktop puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-4.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Moi j&#039;ai qu&#039;un seul port SD il n&#039;y a pas d&#039;ambiguïté je le sélectionne puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-5.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On donne le nom à notre serveur puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-6.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On donne la localisation puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-7.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On définit le nom de l&#039;utilisateur et son mot de passe puis &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-8.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On peut ignorer le wifi dans notre cas (un raspberry PI 2 n&#039;est pas équité!) &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-9.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On s&#039;arrête un peut sur cette page. &lt;br /&gt;
&lt;br /&gt;
On a définit un login que n&#039;est pas &amp;quot;pi&amp;quot; mais qui peut être aisément trouvé. Notre mot de passe est sûrement très sécurisé mais toujours faillible. Comme le routeur sera probablement acessible de l&#039;extérieur il est nécessaire, a mon avis, de sécuriser le process de login ssh par une clé. J&#039;ai mis la clé publique du PC que j&#039;utilise habituellement pour la maintenance. Une seconde clé pourra être ajouté ultérieurement.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-10.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Je ne penses pas que ce soit nécessaire d&#039;utiliser Pi Connect, d&#039;autant plus que le PI devra être le moins chargé possible. &amp;quot;SUIVANT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-11.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On a un dernier récapitulatif. &amp;quot;WRITE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-12.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Oui je comprends, on efface et on flashe la carte!&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-13.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Ca s&#039;écrit... si une fenêtre proposant de formater la carte s&#039;ouvre... fermez là.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-14.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Apres avoir écrit la carte, on la vérifie (c&#039;est indispensable pour être sûr de la qualité de la carte)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datacenter-sd-15.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est terminé. On peut soit en faire une seconde (un backup? mais il faudrait plutôt faire la copie après les étapes suivantes). &amp;quot;FINISH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
La carte est prête on peut lancer le premier boot.&lt;br /&gt;
&lt;br /&gt;
On insère la carte dans le PI2 en question. On y branche un clavier et un écran (ne pas brancher l&#039;adaptateur USB Ethernet la première fois) et GO! On blanche le courant.&lt;br /&gt;
&lt;br /&gt;
=== Premier boot ===&lt;br /&gt;
Il boote correctement.&lt;br /&gt;
&lt;br /&gt;
Moi il bloque un moment sur Network Manager mais continue (je penses que c&#039;est eth1 sur le port USB qui n&#039;est relié a rien qui le gène)&lt;br /&gt;
&lt;br /&gt;
Il boote normalement, affiche la progression sur la console sur l&#039;écran HDMI.&lt;br /&gt;
&lt;br /&gt;
La fin est un succinct :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[ OK ]  Reached target &#039;&#039;&#039;cloud-init.target&#039;&#039;&#039; - Cloud-init target.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et rien ne se passe. C&#039;est normal, pas de panique.&lt;br /&gt;
&lt;br /&gt;
La console à l&#039;écran se limite à... la console de base pour voir les erreurs. Pour se loguer il y a deux solutions :&lt;br /&gt;
&lt;br /&gt;
* Par ssh depuis une autre machine&lt;br /&gt;
* en allant sur une autre console de login &amp;quot;hardware&amp;quot; grâce a &amp;lt;ctrl&amp;gt; + &amp;lt;F2&amp;gt; jusqu&#039;à &amp;lt;F6&amp;gt;. La première &amp;lt;ctrl&amp;gt; &amp;lt;F1&amp;gt; sera toujours là ou seront affichés les messages.&lt;br /&gt;
&lt;br /&gt;
On va configurer les trucs de base.&lt;br /&gt;
&lt;br /&gt;
==== raspi-config ====&lt;br /&gt;
On lance le programme &amp;quot;raspi-config&amp;quot;. On a fait beaucoup du travail au moment de la préparation de la carte SD mais il en reste un peu.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo raspi-config&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a le &amp;quot;classique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Raspi-config.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Dans 1 &amp;quot;System options&amp;quot; choisir  S6 &amp;quot;Autologin&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Raspi-config-autologin.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Selectionner &amp;lt;Yes&amp;gt; qui nous réponds &amp;lt;code&amp;gt;&amp;quot;Console autologin is enabled&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Oui si quelqu&#039;un rentre chez nous, branche un écran et un clavier sur la machine il sera logué automatiquement... c&#039;est un risque que je prends car, comme ces machines marchent très bien et durent des années il m&#039;arrive d&#039;oublier leur mot de passe.&lt;br /&gt;
&lt;br /&gt;
Dans 6 &amp;quot;Advanced Options&amp;quot; on choisit A1 &amp;quot;Expand Filesystem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Et le PI nous réponds :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Root partition has been resized.&lt;br /&gt;
The filesystem will be enlarged upon the next reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On valide par &amp;lt;OK&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au cas ou on lance un 8 &amp;quot;Update&amp;quot; mais si on vient de faire la carte il ne doit pas se passer grand chose.&lt;br /&gt;
&lt;br /&gt;
On branche l&#039;adaptateur USB Ethernet et on reboote&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;on voit le shutdown se dérouler sur la console et le redémarrage.&lt;br /&gt;
&lt;br /&gt;
Le boot bloque un moment sur le démarrage du network manager sur eth1 mais on peut utiliser le serveur quand même.&lt;br /&gt;
&lt;br /&gt;
On peut vérifier que le &amp;quot;resize filesystem&amp;quot; est bien passé:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h /&lt;br /&gt;
Filesystem      Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/mmcblk0p2  229G  2.6G  217G   2% /&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J&#039;ai utilisé une carte de 256 Go on y est presque!&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l&#039;écran ===&lt;br /&gt;
[[Fichier:Adafruit 2.8&#039;&#039;.png|vignette|263x263px|L&#039;écran Adafruit 2.8 pouces]]&lt;br /&gt;
Adafuit le fabricant de l&#039;écran donnait autrefois une distribution spécifique pour cet écran. C&#039;était rapide mais pas très &amp;quot;propre&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Maintenant il y a un script python pour faire ce travail. Adafuit donne le process ici: https://learn.adafruit.com/adafruit-2-8-pitft-capacitive-touch/easy-install-2&lt;br /&gt;
&lt;br /&gt;
Je suis bon camarade je donne ici la méthode.&lt;br /&gt;
&lt;br /&gt;
==== Installation des outils ====&lt;br /&gt;
Il faut d&#039;abord installer les outils python de virtualisation d&#039;environnement.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install python3-venv&lt;br /&gt;
python3 -m venv env --upgrade-deps --system-site-packages&lt;br /&gt;
source env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ensuite on installe le script qui installera lui même l&#039;écran.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install -y git python3-pip&lt;br /&gt;
pip3 install --upgrade adafruit-python-shell click Flask-SQLAlchemy&lt;br /&gt;
git clone https://github.com/adafruit/Raspberry-Pi-Installer-Scripts.git&lt;br /&gt;
cd Raspberry-Pi-Installer-Scripts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Bon je penses que certains &amp;lt;code&amp;gt;apt-get install&amp;lt;/code&amp;gt; sont superflus mais je ne prends pas de risques.&lt;br /&gt;
&lt;br /&gt;
==== Installation elle même ====&lt;br /&gt;
Ici chez Adafruit donne une instruction pour chaque modèle d&#039;écran.&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;écran 2.8&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt; capacitif :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -E env PATH=$PATH python3 adafruit-pitft.py --display=28c --rotation=90 --install-type=console&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;SI j&#039;avais utilisé la version résistive &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -E env PATH=$PATH python3 adafruit-pitft.py --display=28r --rotation=90 --install-type=console&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca se termine&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
PITFT Updating console to PiTFT...&lt;br /&gt;
Remove fbcp from /etc/rc.local, if it&#039;s there...&lt;br /&gt;
Configuring boot/config.txt for default HDMI&lt;br /&gt;
Installing console fbcon map helper...&lt;br /&gt;
Installing console fbcon map service...&lt;br /&gt;
PITFT Created symlink &#039;/etc/systemd/system/multi-user.target.wants/con2fbmap.service&#039; → &#039;/etc/systemd/system/con2fbmap.service&#039;.&lt;br /&gt;
&lt;br /&gt;
PITFT Job for con2fbmap.service failed because the control process exited with error code.&lt;br /&gt;
See &amp;quot;systemctl status con2fbmap.service&amp;quot; and &amp;quot;journalctl -xeu con2fbmap.service&amp;quot; for details.&lt;br /&gt;
Turning off console blanking&lt;br /&gt;
Setting raspi-config to boot to console w/o login...&lt;br /&gt;
PITFT Success!&lt;br /&gt;
&lt;br /&gt;
Settings take effect on next boot.&lt;br /&gt;
&lt;br /&gt;
REBOOT NOW? [Y/n] Reboot started...&lt;br /&gt;
Connection to 192.168.0.77 closed by remote host.&lt;br /&gt;
Connection to 192.168.0.77 closed.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;En rebootant le PI.&lt;br /&gt;
&lt;br /&gt;
Et l&#039;écran est actif.&lt;br /&gt;
&lt;br /&gt;
Un dernier problème: Lorsque on reboote sans l&#039;écran HDMI... l&#039;écran LCD ne marche pas c&#039;est ballot&lt;br /&gt;
&lt;br /&gt;
===== Fichier config.txt =====&lt;br /&gt;
&lt;br /&gt;
On l&#039;édite avec&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /boot/firmware/config.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première chose est de DESACTIVER le son car: Si un écran HDMI est branché tout va bien le son est dirigé vers là. Mais il n&#039;y a pas d&#039;écran le son est dirigé vers le port jack 3.5 qui est géré par le GPIO 18 en PWM. On c&#039;est ce GPIO qui est utilisé par Adafruit pour le rétro éclairage de l&#039;écran. &amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Désactiver audio PWM&lt;br /&gt;
dtparam=audio=off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On désactive le son sur le JACK 3.3 comme ça. Le Raspberry PI 5 qui supprime le port jack 3.5 ne doit pas nécessiter cela. &lt;br /&gt;
&lt;br /&gt;
Ensuite  &lt;br /&gt;
&lt;br /&gt;
Et on y trouves &amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# --- added by adafruit-pitft-helper  ---&lt;br /&gt;
[all]&lt;br /&gt;
hdmi_force_hotplug=0&lt;br /&gt;
dtparam=spi=on&lt;br /&gt;
dtparam=i2c1=on&lt;br /&gt;
dtparam=i2c_arm=on&lt;br /&gt;
dtoverlay=pitft28-capacitive,rotate=90,speed=64000000,fps=30,drm&lt;br /&gt;
# --- end adafruit-pitft-helper  ---&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Alors qu&#039;avec :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# --- added by adafruit-pitft-helper ---&lt;br /&gt;
[all]&lt;br /&gt;
dtparam=spi=on&lt;br /&gt;
dtparam=i2c1=on&lt;br /&gt;
dtparam=i2c_arm=on&lt;br /&gt;
dtoverlay=pitft28-capacitive,rotate=270,speed=64000000,fps=30,drm&lt;br /&gt;
dtoverlay=gpio-backlight,gpios=18,active_low=0&lt;br /&gt;
hdmi_force_hotplug=1&lt;br /&gt;
hdmi_group=2&lt;br /&gt;
hdmi_mode=82&lt;br /&gt;
# --- end adafruit-pitft-helper  ---&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est mieux.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai ai profité pour retourner l&#039;écran (rotate=270) car avec un rotatate=90 les boutons sont a gauche.&lt;br /&gt;
&lt;br /&gt;
===== Le fichier cmdline.txt =====&lt;br /&gt;
&lt;br /&gt;
Toujours pour le modifier:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /boot/firmware/cmdline.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On y trouve &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
console=serial0,115200 console=tty1 root=PARTUUID=b104592a-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=FR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On supprime la &amp;quot;sérial console&amp;quot; et on active fbcon.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
console=tty1 fbcon=map:10 root=PARTUUID=b104592a-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=FR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On reboote et ca marche! Même sans l&#039;écran HDMI.&lt;br /&gt;
&lt;br /&gt;
Dans tous les cas on peut acceder au frame buffer sur /dev/fb1 pour la carte écran LCD.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp /dev/random /dev/fb1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et on voit du bruit sur l&#039;écran.&lt;br /&gt;
&lt;br /&gt;
==== Economiseur d&#039;écran. ====&lt;br /&gt;
L&#039;écran LCD est toujours allumé dans ce cas. C&#039;est pratique mais ca chauffe énormément, ça l&#039;use et ca consomme. Bref ppas top.&lt;br /&gt;
&lt;br /&gt;
On va faire un économiseur d&#039;écran. On pourrait le faire en détectant un appui dessus mais la date tactile du mien est morte. On a cependant 4 bon vieux boutons physiques que je vais utiliser.&lt;br /&gt;
&lt;br /&gt;
On a des boutions marqués de haut en bas &amp;lt;code&amp;gt;#17&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#22&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#23&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;#27&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nous nous proposons d&#039;utiliser le bouton du bas soit &amp;lt;code&amp;gt;#27&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Le script bash est assez simple:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# /usr/local/bin/gpio-screen-saver.sh&lt;br /&gt;
# Extinction du backlight après IDLE_TIMEOUT, rallumage par bouton (libgpiod v2).&lt;br /&gt;
# BL=GPIO18 (1=ON, 0=OFF), BTN=GPIO27 (pull-up interne, appui → INACTIVE).&lt;br /&gt;
&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
CHIP=&amp;quot;/dev/gpiochip0&amp;quot;&lt;br /&gt;
BL_PIN=18&lt;br /&gt;
BTN_PIN=27&lt;br /&gt;
IDLE_TIMEOUT=10      # secondes (adapter)&lt;br /&gt;
SLEEP_STEP=0.2&lt;br /&gt;
MIN_OFF_HOLD=1       # hystérésis OFF minimale (s)&lt;br /&gt;
&lt;br /&gt;
GPIOSET=&amp;quot;/usr/bin/gpioset&amp;quot;&lt;br /&gt;
GPIOGET=&amp;quot;/usr/bin/gpioget&amp;quot;&lt;br /&gt;
&lt;br /&gt;
log() { printf &#039;[backlight] %s\n&#039; &amp;quot;$*&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
is_on=true&lt;br /&gt;
last_activity=$(date +%s)&lt;br /&gt;
off_since=0&lt;br /&gt;
&lt;br /&gt;
cleanup() {&lt;br /&gt;
  if [[ &amp;quot;$is_on&amp;quot; != true ]]; then&lt;br /&gt;
    log &amp;quot;Exit: backlight ON&amp;quot;&lt;br /&gt;
    &amp;quot;$GPIOSET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -t 0 &amp;quot;$BL_PIN=1&amp;quot; || true&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
trap cleanup EXIT&lt;br /&gt;
&lt;br /&gt;
log &amp;quot;Start: backlight ON&amp;quot;&lt;br /&gt;
&amp;quot;$GPIOSET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -t 0 &amp;quot;$BL_PIN=1&amp;quot;&lt;br /&gt;
is_on=true&lt;br /&gt;
last_activity=$(date +%s)&lt;br /&gt;
&lt;br /&gt;
while true; do&lt;br /&gt;
  now=$(date +%s)&lt;br /&gt;
&lt;br /&gt;
  # --- Lecture du bouton avec pull-up ---&lt;br /&gt;
  raw=$(&amp;quot;$GPIOGET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -b pull-up &amp;quot;$BTN_PIN&amp;quot; 2&amp;gt;/dev/null || echo &amp;quot;$BTN_PIN=inactive&amp;quot;)&lt;br /&gt;
  state=$(echo &amp;quot;$raw&amp;quot; | awk -F= &#039;{print $2}&#039;)   # &amp;quot;active&amp;quot; ou &amp;quot;inactive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if [[ &amp;quot;$state&amp;quot; == &amp;quot;inactive&amp;quot; ]]; then&lt;br /&gt;
    # Appui (niveau bas), anti-rebond&lt;br /&gt;
    sleep 0.02&lt;br /&gt;
    raw2=$(&amp;quot;$GPIOGET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -b pull-up &amp;quot;$BTN_PIN&amp;quot; 2&amp;gt;/dev/null || echo &amp;quot;$BTN_PIN=inactive&amp;quot;)&lt;br /&gt;
    state2=$(echo &amp;quot;$raw2&amp;quot; | awk -F= &#039;{print $2}&#039;)&lt;br /&gt;
&lt;br /&gt;
    if [[ &amp;quot;$state2&amp;quot; == &amp;quot;inactive&amp;quot; ]]; then&lt;br /&gt;
      if [[ &amp;quot;$is_on&amp;quot; != true ]]; then&lt;br /&gt;
        log &amp;quot;Button press → backlight ON&amp;quot;&lt;br /&gt;
        &amp;quot;$GPIOSET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -t 0 &amp;quot;$BL_PIN=1&amp;quot;&lt;br /&gt;
        is_on=true&lt;br /&gt;
      fi&lt;br /&gt;
      last_activity=$now&lt;br /&gt;
      sleep 0.2   # anti-rebond&lt;br /&gt;
    fi&lt;br /&gt;
  fi&lt;br /&gt;
  # --- Fin lecture bouton ---&lt;br /&gt;
&lt;br /&gt;
  if [[ &amp;quot;$is_on&amp;quot; == true ]]; then&lt;br /&gt;
    if (( now - last_activity &amp;gt;= IDLE_TIMEOUT )); then&lt;br /&gt;
      log &amp;quot;Idle &amp;gt;= ${IDLE_TIMEOUT}s → backlight OFF&amp;quot;&lt;br /&gt;
      &amp;quot;$GPIOSET&amp;quot; -c &amp;quot;$CHIP&amp;quot; -t 0 &amp;quot;$BL_PIN=0&amp;quot;&lt;br /&gt;
      is_on=false&lt;br /&gt;
      off_since=$now&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
    # Hystérésis OFF minimale (optionnel)&lt;br /&gt;
    if (( now - off_since &amp;lt; MIN_OFF_HOLD )); then :; fi&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  sleep &amp;quot;$SLEEP_STEP&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;La ligne 2&#039;&#039;&#039; indique à bash comment gérer les erreurs &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-e&#039;&#039;&#039;&amp;lt;/code&amp;gt; implique qu&#039;a la première commande en erreur (!=0) le script entier s&#039;arrête (pas besoin de gérer les codes retour)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-u&#039;&#039;&#039;&amp;lt;/code&amp;gt; si on accède à une variable d&#039;environnement non existante le script s&#039;arrête (Lutte contre les fautes de frappe)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-o&#039;&#039;&#039;&amp;lt;/code&amp;gt; est plus subtile. On l&#039;appelle &amp;quot;pipe fail&amp;quot;. Si dans une commande avec des pipe &amp;lt;code&amp;gt;cmd | cmd1 | cmd2&amp;lt;/code&amp;gt;  l&#039;une des commandes plante le code d&#039;erreur du script (le &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt;) sera celui de la commande en question et pas celui de la dernière. si &amp;lt;code&amp;gt;cmd1&amp;lt;/code&amp;gt; provoque une erreur &amp;lt;code&amp;gt;$?=1&amp;lt;/code&amp;gt; mais que &amp;lt;code&amp;gt;cmd2&amp;lt;/code&amp;gt; passe bien &amp;lt;code&amp;gt;$?=0&amp;lt;/code&amp;gt;, le script retournera la valeur du &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt; de &amp;lt;code&amp;gt;cmd1&amp;lt;/code&amp;gt; si l&#039;option &amp;lt;code&amp;gt;-o&amp;lt;/code&amp;gt; est utilisée sinon c&#039;est la dernière qui gagne.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Les lignes 3 et 4&#039;&#039;&#039; définissent les lignes GPIO utilisées. Les adresse commencent à 512 donc l&#039;écran c&#039;est 512+18 (GPIO18) donc 530 et le bouton c&#039;est 512+27 soit 539.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;La ligne 5&#039;&#039;&#039; c&#039;est la durée au bout de laquelle l&#039;écran va s&#039;éteindre de nouveau. (20 sec ça ma paru bien pour un simple affichage de status)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lignes 8 à 13&#039;&#039;&#039; une fonction qui exporte le GPIO si ce n&#039;est pas déjà fait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lignes 16 et 17&#039;&#039;&#039; on définie les directions. écran=out bouton=in&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ligne 20&#039;&#039;&#039; on commence par allumer l&#039;écran&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ligne 22&#039;&#039;&#039; &amp;lt;code&amp;gt;last_activity&amp;lt;/code&amp;gt; reçoit le timestamp courant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lignes 24 à 38&#039;&#039;&#039; c&#039;est la boucle.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lignes 25 à 29&#039;&#039;&#039; on allume l&#039;écran su on détecte un appui sur le bouton et &amp;lt;code&amp;gt;ast_activity&amp;lt;/code&amp;gt; reçoit le timestamp courant.&lt;br /&gt;
* Lignes 31 à 35 on éteint l&#039;écran si on a dépassé le timeout &amp;lt;code&amp;gt;now - last_activity &amp;gt;= IDLE_TIMEOUT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Et c&#039;est tout.&lt;br /&gt;
&lt;br /&gt;
Maintenant on va faire un service ([[Deamon avec systemd|un deamon]]) de ce script. C&#039;est décrit dans le lien mail je donne la conf spécifique:&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Daemon pour économiseur d&#039;écran GPIO&lt;br /&gt;
After=multi-user.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
ExecStart=/usr/local/bin/gpio-screen-saver.sh&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=2&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On donne les noms suivants aux fichiers&lt;br /&gt;
&lt;br /&gt;
* gpio-screen-saver.sh est le bash vu plus haut&lt;br /&gt;
* gpio-screen-saver.service le fichier de conf ci-dessus&lt;br /&gt;
&lt;br /&gt;
On installe avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
set -euo pipefail&lt;br /&gt;
&lt;br /&gt;
sudo cp gpio-screen-saver.sh /usr/local/bin/&lt;br /&gt;
sudo chmod +x /usr/local/bin/gpio-screen-saver.sh&lt;br /&gt;
sudo cp gpio-screen-saver.service /etc/systemd/system/&lt;br /&gt;
&lt;br /&gt;
sudo systemctl daemon-reload&lt;br /&gt;
sudo systemctl enable --now gpio-screen-saver.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;SI ca marche bien il affiche juste le lien crée.&lt;br /&gt;
&lt;br /&gt;
===== Arrêt relance =====&lt;br /&gt;
Tout ceci est bien beau mais l&#039;écran LCD peut aussi servir de console de secours. Il suffit de branche un clavier et de taper ctrl+c et on récupère la console. Le timeout de 20 seconde va vite devenir insupportable (oui le clavier n&#039;est pas pris en compte dedans).&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl stop gpio-screen-saver.service       # Arrète le service&lt;br /&gt;
sudo systemctl start gpio-screen-saver.service      # Démarre le service&lt;br /&gt;
sudo systemctl restart gpio-screen-saver.service    # Redémarre le service (si on change la valeur du timeout pas exemple)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour avoir le statut:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl status gpio-screen-saver.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui nous donne un joli:&lt;br /&gt;
[[Fichier:Screen-saver.service.png|sans_cadre|838x838px]]&lt;br /&gt;
Avec tout plein de détails.&lt;br /&gt;
&lt;br /&gt;
Pour que l&#039;arrêt soit définitif (même après un reboot):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable gpio-screen-saver.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et pour le réactiver&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl enable gpio-screen-saver.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== La configuration du réseau ===&lt;br /&gt;
Les Raspberry PI ne sont malheureusement équipés que d&#039;un seul port Ethernet. Il faut en ajouter un autre sur l&#039;un des ports USB. &lt;br /&gt;
&lt;br /&gt;
Cependant ce n&#039;est pas catastrophique. Le port eth0 est lui aussi un device USB sauf qu&#039;il est soudé sur la carte.&lt;br /&gt;
&lt;br /&gt;
Lorsque je banche mon adaptateur réseau sur un prise USB, j&#039;ai dans dmesg :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[   67.026854] usb 1-1.4: new high-speed USB device number 5 using dwc_otg&lt;br /&gt;
[   67.132758] usb 1-1.4: New USB device found, idVendor=0b95, idProduct=1790, bcdDevice= 2.00&lt;br /&gt;
[   67.132807] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[   67.132831] usb 1-1.4: Product: AX88179B&lt;br /&gt;
[   67.132851] usb 1-1.4: Manufacturer: ASIX&lt;br /&gt;
[   67.132869] usb 1-1.4: SerialNumber: 004132D3&lt;br /&gt;
[   67.275834] usbcore: registered new interface driver cdc_ether&lt;br /&gt;
[   67.323914] cdc_ncm 1-1.4:2.0: MAC-Address: 9c:69:d3:41:32:d3&lt;br /&gt;
[   67.323953] cdc_ncm 1-1.4:2.0: setting rx_max = 16384&lt;br /&gt;
[   67.324279] cdc_ncm 1-1.4:2.0: setting tx_max = 16384&lt;br /&gt;
[   67.325521] cdc_ncm 1-1.4:2.0 eth1: register &#039;cdc_ncm&#039; at usb-3f980000.usb-1.4, CDC NCM (NO ZLP), 9c:69:d3:41:32:d3&lt;br /&gt;
[   67.325863] usbcore: registered new interface driver cdc_ncm&lt;br /&gt;
[   67.346165] usbcore: registered new interface driver cdc_wdm&lt;br /&gt;
[   67.352494] usbcore: registered new interface driver cdc_mbim&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Avec ifconfig j&#039;ai bien deux interfaces:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
eth0: flags=4163&amp;lt;UP,BROADCAST,RUNNING,MULTICAST&amp;gt;  mtu 1500&lt;br /&gt;
        inet 192.168.X.XX  netmask 255.255.255.0  broadcast 192.168.X.255&lt;br /&gt;
        inet6 fe80::xxxx:xxxx:xxxx:xxxx prefixlen 64  scopeid 0x20&amp;lt;link&amp;gt;&lt;br /&gt;
        inet6 2a01:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx prefixlen 64  scopeid 0x0&amp;lt;global&amp;gt;&lt;br /&gt;
        ether b8:27:eb:1c:05:fc  txqueuelen 1000  (Ethernet)&lt;br /&gt;
        RX packets 340  bytes 39348 (38.4 KiB)&lt;br /&gt;
        RX errors 0  dropped 0  overruns 0  frame 0&lt;br /&gt;
        TX packets 266  bytes 78263 (76.4 KiB)&lt;br /&gt;
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0&lt;br /&gt;
&lt;br /&gt;
eth1: flags=4099&amp;lt;UP,BROADCAST,MULTICAST&amp;gt;  mtu 1500&lt;br /&gt;
        ether 9c:69:d3:41:32:d3  txqueuelen 1000  (Ethernet)&lt;br /&gt;
        RX packets 0  bytes 0 (0.0 B)&lt;br /&gt;
        RX errors 0  dropped 0  overruns 0  frame 0&lt;br /&gt;
        TX packets 0  bytes 0 (0.0 B)&lt;br /&gt;
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;eth0&#039;&#039;&#039; est bien en DHCP sur mon routeur lui même connecté sur internet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;eth1&#039;&#039;&#039; est disponible. Configurons la. &lt;br /&gt;
&lt;br /&gt;
Notre objectif:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;eth1&amp;lt;/code&amp;gt; (USB‑Ethernet) en IP statique &amp;lt;code&amp;gt;10.11.11.1/24&amp;lt;/code&amp;gt; – passerelle du LAN.&lt;br /&gt;
* Serveur DHCP via &amp;lt;code&amp;gt;dnsmasq&amp;lt;/code&amp;gt; : plage &amp;lt;code&amp;gt;10.11.11.100–10.11.11.200&amp;lt;/code&amp;gt;, passerelle &amp;lt;code&amp;gt;10.11.11.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Routage IPv4 activé et NAT (masquerade) avec &amp;lt;code&amp;gt;nftables&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SI l&#039;adaptateur Ethernet n&#039;a pas été détecté en tant que eth1 il faudra changer cette valeur dans les commandes qui suivent.&lt;br /&gt;
&lt;br /&gt;
On entre les commandes:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nmcli con add type ethernet ifname eth0 con-name wan ipv4.method auto ipv6.method ignore&lt;br /&gt;
sudo nmcli con add type ethernet ifname eth1 con-name lan ipv4.method manual ipv4.addresses 10.11.11.1/24 ipv4.never-default yes ipv6.method ignore&lt;br /&gt;
sudo nmcli con up wan&lt;br /&gt;
sudo nmcli con up lan&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DHCP (dnsmasq) ====&lt;br /&gt;
On entre les commandes&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install -y dnsmasq&lt;br /&gt;
sudo tee /etc/dnsmasq.d/lan.conf &amp;gt;/dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
listen-address=127.0.0.1,10.11.11.1&lt;br /&gt;
domain=pilan&lt;br /&gt;
local=/pilan/&lt;br /&gt;
interface=eth1&lt;br /&gt;
bind-interfaces&lt;br /&gt;
domain-needed&lt;br /&gt;
bogus-priv&lt;br /&gt;
dhcp-range=10.11.11.100,10.11.11.200,255.255.255.0,24h&lt;br /&gt;
dhcp-option=option:router,10.11.11.1&lt;br /&gt;
EOF&lt;br /&gt;
sudo systemctl enable --now dnsmasq&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca y est notre serveur DHCP est fonctionnel sur un LAN qui s&#039;appelle &amp;lt;code&amp;gt;pilan&amp;lt;/code&amp;gt;. Il qui écoute sur 10.11.11.1 mais aussi localhost. non pas qu&#039;il ait à servir des IP par DHCP à lui même mais pour servir de serveur DNS à lui aussi (on parle de DSN plus loin)&lt;br /&gt;
&lt;br /&gt;
==== Routage IPv4 et NAT ====&lt;br /&gt;
Il faut maintenant orchestrer le routage entre eth0 et eth1.&lt;br /&gt;
&lt;br /&gt;
On active le routage:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ip_forward=1&#039; | sudo tee /etc/sysctl.d/99-ip-forward.conf&lt;br /&gt;
sudo sysctl -p /etc/sysctl.d/99-ip-forward.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On configure nftables:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tee /etc/nftables.conf &amp;gt;/dev/null &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
flush ruleset&lt;br /&gt;
table inet filter {&lt;br /&gt;
  chain input   { type filter hook input priority 0; policy accept; }&lt;br /&gt;
  chain output  { type filter hook output priority 0; policy accept; }&lt;br /&gt;
  chain forward { type filter hook forward priority 0; policy drop;&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
    iif &amp;quot;eth1&amp;quot; oif &amp;quot;eth0&amp;quot; accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
table ip nat {&lt;br /&gt;
  chain postrouting { type nat hook postrouting priority 100;&lt;br /&gt;
    oif &amp;quot;eth0&amp;quot; masquerade&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
EOF&lt;br /&gt;
sudo systemctl enable --now nftables&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On vérifie par :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip addr show eth1&lt;br /&gt;
&lt;br /&gt;
3: eth1: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc fq_codel state DOWN group default qlen 1000&lt;br /&gt;
    link/ether 9c:69:d3:41:32:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 10.11.11.1/24 brd 10.11.11.255 scope global noprefixroute eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Bon il n&#039;est relié a rien (NO-CARRIER et state DOWN) mais il a bien une adresse IP correcte.&lt;br /&gt;
&lt;br /&gt;
SI je branche mon PC dessus j&#039;ai bien :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip addr show eth1&lt;br /&gt;
&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000&lt;br /&gt;
    link/ether 9c:69:d3:41:32:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 10.11.11.1/24 brd 10.11.11.255 scope global noprefixroute eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::9e69:d3ff:fe41:32d3/64 scope link proto kernel_ll&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;L&#039;état est passé à BROADCAST et state UP&lt;br /&gt;
&lt;br /&gt;
==== Un petit dashboard sur la console ====&lt;br /&gt;
Un petit script permet d&#039;avoir les info essentielles :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
set -o pipefail&lt;br /&gt;
&lt;br /&gt;
printf &amp;quot;\e[2J&amp;quot;&lt;br /&gt;
esc=$&#039;\e&#039;&lt;br /&gt;
while [ 1 ]&lt;br /&gt;
do&lt;br /&gt;
    printf &amp;quot;\e[1;1H&amp;quot;&lt;br /&gt;
    date &amp;quot;+%d/%m/%Y %H:%M&amp;quot;&lt;br /&gt;
    echo &amp;quot;-----------------------------------------------&amp;quot;&lt;br /&gt;
    echo -n &amp;quot;Routeur WAN IP: &amp;quot;&lt;br /&gt;
    ifconfig eth0 | grep &amp;quot;inet &amp;quot; | awk &#039;{print $2 &amp;quot;  &amp;quot;}&#039;&lt;br /&gt;
    echo -n &amp;quot;LAN Gateway   : &amp;quot;&lt;br /&gt;
    ifconfig eth1 | grep &amp;quot;inet &amp;quot; | awk &#039;{print $2 &amp;quot;  &amp;quot;}&#039;&lt;br /&gt;
    echo &amp;quot;-----------------------------------------------&amp;quot;&lt;br /&gt;
    echo &amp;quot;LAN Clients: &amp;quot;&lt;br /&gt;
    cat /var/lib/misc/dnsmasq.leases | awk &#039;{print &amp;quot;\033[94m&amp;quot;,$2, &amp;quot;\033[0m&amp;quot;,$3,&amp;quot;\033[93m&amp;quot;,$4,&amp;quot;\033[0m&amp;quot;}&#039;&lt;br /&gt;
    echo &amp;quot;-----------------------------------------------&amp;quot;&lt;br /&gt;
    echo &amp;quot;Services: http&amp;quot;&lt;br /&gt;
    printf &amp;quot;node-red\t&amp;quot;&lt;br /&gt;
    curl --max-time 2 -I -s http://main-host.pilan:1880 | grep HTTP | sed &amp;quot;s/OK/${esc}[30;42m[OK]${esc}[0m 1880/&amp;quot;&lt;br /&gt;
    if [[ $? != 0 ]]; then&lt;br /&gt;
            printf &amp;quot;\033[31mERREUR\033[0m\n&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    printf &amp;quot;webssh  \t&amp;quot;&lt;br /&gt;
    curl --max-time 2 -I -s http://main-host.pilan:8888 | grep HTTP  | sed &amp;quot;s/OK/${esc}[30;42m[OK]${esc}[0m 8888/&amp;quot;&lt;br /&gt;
    if [[ $? != 0 ]]; then&lt;br /&gt;
            printf &amp;quot;\033[31mERREUR\033[0m\n&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    sleep 10&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on le lance:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dashboard-router.png|sans_cadre|432x432px]]&lt;br /&gt;
&lt;br /&gt;
Le plus élégant serait que ce script se lance sur le petit écran LCD du PI au démarrage. Facile on a configuré l&#039;autologin...&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vi ~/.profile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et on ajoute à la fin:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
if [ -n &amp;quot;$SSH_CONNECTION&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Welcome to SSH users&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    tput civis         # Hide carret&lt;br /&gt;
    ./router-dash.sh   &lt;br /&gt;
    tput cnorm         # Show carret&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Sur la console principale (l&#039;écran LCD adafruit) il est toujours possible de sortir du dashboard avec &amp;lt;Ctrl&amp;gt; + C &lt;br /&gt;
&lt;br /&gt;
=== Serveur DNS ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
On a déjà installé dnsmasq donc rien a installer de plus. &lt;br /&gt;
&lt;br /&gt;
Sur les clients ça marche déjà nickel (Comme on dit a Goro)&lt;br /&gt;
&lt;br /&gt;
En revanche sur le routeur lui-même on utilise le DNS fournit par network manager et il utilise celui qui nous a été donné par le serveur DHCP utilisé lors de la conf de eth0.&lt;br /&gt;
&lt;br /&gt;
Pas de panique c&#039;est juste de la conf.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nmcli connection modify &amp;quot;wan&amp;quot; ipv4.dns &amp;quot;127.0.0.1 192.168.0.1&amp;quot;&lt;br /&gt;
sudo nmcli connection modify &amp;quot;wan&amp;quot; ipv4.ignore-auto-dns yes&lt;br /&gt;
sudo nmcli connection up &amp;quot;wan&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On redémarre dnsmasq:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl restart dnsmasq&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je ne suis pas sûr que ce soit nécessaire mais bon... par acquis de conscience.&lt;br /&gt;
&lt;br /&gt;
==== Tests ====&lt;br /&gt;
Pour tester il nous faudra des outils DNS donc :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Déja on vérifie que sur le &amp;quot;patte&amp;quot; par défaut (eth0) on accède aux deus serveurs DNS:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 nmcli device show eth0 | grep IP4.DNS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Doit nous donner DEUX lignes:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
IP4.DNS[1]:                             127.0.0.1&lt;br /&gt;
IP4.DNS[2]:                             192.168.1.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ici le DNS n°2 est celui de ma box.&lt;br /&gt;
&lt;br /&gt;
On teste:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dig database&lt;br /&gt;
dig database.pilan&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui tous deux nous donnent les détail sur 10.11.11.50 (voir plus bas)&lt;br /&gt;
&lt;br /&gt;
=== Reverse proxy CADDY ===&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
Le &amp;quot;repository&amp;quot; n&#039;est pas standard. Donc il faut demander gentiement:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# 1. Ajouter la clé GPG&lt;br /&gt;
curl -1sLf &#039;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&#039; | \&lt;br /&gt;
sudo tee /etc/apt/trusted.gpg.d/caddy.gpg &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# 2. Ajouter le dépôt&lt;br /&gt;
curl -1sLf &#039;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&#039; | \&lt;br /&gt;
sudo tee /etc/apt/sources.list.d/caddy-stable.list&lt;br /&gt;
&lt;br /&gt;
# 3. Installer Caddy&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install caddy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ensuite on teste caddy&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
caddy version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Moi j&#039;ai un truc comme:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;v2.10.1 h1:g/gTHGFRTY0dec+UgMw9Snxdgytr+KK2TdvoRL/Ovu6U8=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On doit être en &amp;lt;code&amp;gt;v2.10.1&amp;lt;/code&amp;gt; avec un n° de build bizarre en base64... (le décodage donne rien...)&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Creation page de test&lt;br /&gt;
sudo mkdir -p /var/www/front&lt;br /&gt;
echo &amp;quot;&amp;lt;h1&amp;gt;Welcome to Front Router&amp;lt;/h1&amp;gt;&amp;quot; | sudo tee /var/www/front/index.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On édite le &amp;quot;caddy file&amp;quot;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/caddy/Caddyfile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Avec &amp;lt;syntaxhighlight lang=&amp;quot;apacheconf&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
        auto_https off # Pas de HTTPS auto en LAN&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:80 {&lt;br /&gt;
        root * /var/www/front&lt;br /&gt;
        file_server&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
secure.pinon-hebert.fr {&lt;br /&gt;
        root * /var/www/front&lt;br /&gt;
        file_server&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main-host.pilan {&lt;br /&gt;
        reverse_proxy http://main-host.pilan:8080 # ce sera pour plus tard rien n&#039;écoute ici&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On valide la conf:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo caddy fmt --overwrite /etc/caddy/Caddyfile&lt;br /&gt;
sudo caddy validate --config /etc/caddy/Caddyfile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne doit pas avoir d&#039;erreur et de warnings.&lt;br /&gt;
&lt;br /&gt;
Et on relance Caddy:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl reload caddy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On vérifie que le port 80 soit ouvert!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ss -ltnp | grep :80&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui doit répondre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;LISTEN 0      4096                                  *:80              *:*    users:((&amp;quot;caddy&amp;quot;,pid=26458,fd=7))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et un &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl http://front-router&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Réponds :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Welcome to Front Router&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chiffrement avec let&#039;s encrypy ===&lt;br /&gt;
Caddy incorpore par défaut un lien avec let&#039;s encrypt. Il n&#039;y a rien a faire de ce côté là!&lt;br /&gt;
&lt;br /&gt;
== Administration ==&lt;br /&gt;
Une fois installé voici les opérations d&#039;administrations possibles.&lt;br /&gt;
&lt;br /&gt;
=== Ajouter une redirection &amp;quot;reverse proxy&amp;quot; ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attention&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|45x45px]]&lt;br /&gt;
|Pour que la redirection fonctionne il faut que le process serveur sur la machine distante soit à l&#039;écoute sur le réseau et pas seulement sur localhost!&lt;br /&gt;
&amp;lt;code&amp;gt;listen 0.0.0.0         OUI&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;listen 127.0.0.1       NON&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Prérequis ====&lt;br /&gt;
Il faut avoir enregistré un DNS toto.mondomaine.com qui pointe vers une adresse IP qui, d&#039;une manière ou une autre arrive sur le routeur de tête. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attention&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|45x45px]]&lt;br /&gt;
|Il faut également que ce routeur soit ouvert sur les ports 80 et 443. &lt;br /&gt;
Oui il faut laisser ouvert le port 80 avec un serveur http derrière car let&#039;s encrypt s&#039;en sert lors du renouvellement.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# === Site public HTTPS vers toto (Let&#039;s Encrypt automatique) ===&lt;br /&gt;
toto.mondomaine.com {&lt;br /&gt;
        # (Optionnel) Email ACME pour les notifications de certificat&lt;br /&gt;
        tls tecinfo@mondomaine.com&lt;br /&gt;
&lt;br /&gt;
        # Logs utiles&lt;br /&gt;
        log {&lt;br /&gt;
                output file /var/log/caddy/toto.log&lt;br /&gt;
                format json&lt;br /&gt;
                level INFO&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # Compression &amp;amp; quelques en-têtes sécurité&lt;br /&gt;
        encode zstd gzip&lt;br /&gt;
        header {&lt;br /&gt;
                Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains; preload&amp;quot;&lt;br /&gt;
                X-Content-Type-Options &amp;quot;nosniff&amp;quot;&lt;br /&gt;
                X-Frame-Options &amp;quot;DENY&amp;quot;&lt;br /&gt;
                Referrer-Policy &amp;quot;strict-origin-when-cross-origin&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # Reverse proxy vers Node-RED sur IP qui héberge TOTO A.B.C.B et le port de TOTO PORT&lt;br /&gt;
        reverse_proxy http://A.B.C.B:PORT {&lt;br /&gt;
                # Caddy gère automatiquement WebSocket et X-Forwarded-*&lt;br /&gt;
                # Si nécessaire :&lt;br /&gt;
                # header_up Host {host}&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# === (Recommandé) Forcer HTTP -&amp;gt; HTTPS pour ce FQDN ===&lt;br /&gt;
http://toto.mondomaine.com {&lt;br /&gt;
        redir https://toto.mondomaine.com{uri}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il faut créer le fichier de log &amp;quot;à la main&amp;quot;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Si c&#039;est pas fait&lt;br /&gt;
sudo mkdir -p /var/log/caddy&lt;br /&gt;
sudo chown -R caddy:caddy /var/log/caddy&lt;br /&gt;
sudo chmod 750 /var/log/caddy&lt;br /&gt;
# et ensuite &lt;br /&gt;
sudo mkdir /var/log/caddy/toto.log&lt;br /&gt;
sudo chown -R caddy:caddy /var/log/caddy/toto.log&lt;br /&gt;
sudo chmod 750 /var/log/caddy/toto.log&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ensuite on relance caddy.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl start caddy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Y&#039;a 300 000 raisons pour que ça ne marche pas du premier coup mais si on fait bien tout étape par étape ça doit marcher!&lt;br /&gt;
&lt;br /&gt;
=== Gestion des connexions ssh ===&lt;br /&gt;
Je ne sais pas pourquoi mais mon installation du routeur en &amp;lt;code&amp;gt;Raspbian GNU/Linux 13&amp;lt;/code&amp;gt; vit mal les serveurs du LAN en  &amp;lt;code&amp;gt;Debian GNU/Linux 12&amp;lt;/code&amp;gt; qui datent d&#039;il y a a peine 6 mois....&lt;br /&gt;
&lt;br /&gt;
AU ssh j&#039;ai des erreurs:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Unable to negotiate with 10.11.11.50 port 22: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,kex-strict-s-v00@openssh.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Une sombre histoire d&#039;algo de hashage que raspbian 13 considèrent comme à risque. Je vais passer les clients en  &amp;lt;code&amp;gt;Raspbian GNU/Linux 13&amp;lt;/code&amp;gt; des que possible mais en attendent j&#039;ai accepé des compromis sur la sécu pour les machines du lan &amp;lt;code&amp;gt;pilan&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dans mon ~/.ssh/config j&#039;ai ajouté:&amp;lt;syntaxhighlight lang=&amp;quot;apacheconf&amp;quot;&amp;gt;&lt;br /&gt;
Host *.pilan&lt;br /&gt;
    User admin&lt;br /&gt;
&lt;br /&gt;
    # Autoriser l&#039;ancien échange de clés (KEX)&lt;br /&gt;
    KexAlgorithms +diffie-hellman-group14-sha1&lt;br /&gt;
&lt;br /&gt;
    # Si les serveurs n&#039;annoncent que des clés/ signatures SHA-1&lt;br /&gt;
    HostkeyAlgorithms +ssh-rsa&lt;br /&gt;
    PubkeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
&lt;br /&gt;
    # (Optionnel) ciphers classiques&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ce qui fait que pour les machines du lan et seulement avec le user admin on peut se loguer depuis le front. &lt;br /&gt;
&lt;br /&gt;
=== Gestion de l&#039;allocation d&#039;IP fixes en DHCP ===&lt;br /&gt;
Autant je sous traite l&#039;adresse du routeur lui même sur sa &amp;quot;patte&amp;quot; eth0 au routeur qui lui est supérieur (ma box par exemple) autant, pour les machines branchées sur eth1 il peut être intéressant de leur donner une IP fixe.&lt;br /&gt;
&lt;br /&gt;
On peut rendre l&#039;IP statique sur le client mais le plus propre est de laisser le client en DHCP mais reconnaitre l&#039;adresse MAC du client et configurer le serveur DHCP pour lui donner TOUJOURS la même IP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Par exemple je voudrais que mon serveur de base de données appelé dadabase possède l&#039;adresse IP 10.11.11.50&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je relève son adresse mac sur le dashboard:&lt;br /&gt;
&lt;br /&gt;
Pour le moment on lui a donné:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;b8:27:ee:cc:f9:ac 10.11.11.171 database&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut simplement éditer le fichier: &amp;lt;code&amp;gt;/etc/dnsmasq.d/lan.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
 sudo vi /etc/dnsmasq.d/lan.conf&lt;br /&gt;
Et ajouter/modifier la ligne :&lt;br /&gt;
 dhcp-host=b8:27:ee:cc:f9:ac,10.11.11.50,database&lt;br /&gt;
Le serveur &amp;quot;&amp;lt;code&amp;gt;database&amp;lt;/code&amp;gt;&amp;quot; dont l&#039;adresse MAC est &amp;lt;code&amp;gt;b8:27:ee:cc:f9:ac&amp;lt;/code&amp;gt; se verra systématiquement affecté l&#039;adresse &amp;lt;code&amp;gt;10.11.11.50&amp;lt;/code&amp;gt;. Pour que le serveur prenne en compte le changement il faut relancer &amp;lt;code&amp;gt;dnsmasq&amp;lt;/code&amp;gt;&lt;br /&gt;
 sudo systemctl restart dnsmasq&lt;br /&gt;
Et c&#039;est tout.&lt;br /&gt;
&lt;br /&gt;
=== Ajout d&#039;une règle de redirection de port NAP/PAT ===&lt;br /&gt;
Dans cet exemple je vais rediriger ce qui rentre sur le port 2222 de eth0 sur front-router vers le port 22 sur le serveur git.&lt;br /&gt;
&lt;br /&gt;
==== Modification: ====&lt;br /&gt;
Tout se fait dans &amp;lt;code&amp;gt;/etc/nftables.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On ajoute dans &amp;lt;code&amp;gt;table ip filter&amp;lt;/code&amp;gt; la chaine &amp;lt;code&amp;gt;forward&amp;lt;/code&amp;gt;doit être modifiée:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  chain forward {&lt;br /&gt;
    type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # flux établis&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # ICI LES ANCIENNES REGLES&lt;br /&gt;
&lt;br /&gt;
    # DNAT SSH WAN:2222 -&amp;gt; GIT:22&lt;br /&gt;
    iifname $WAN oifname $LAN ip daddr $GIT tcp dport 22 ct state new accept&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et le post routing.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
table ip nat {&lt;br /&gt;
  chain prerouting {&lt;br /&gt;
    type nat hook prerouting priority -100; policy accept;&lt;br /&gt;
&lt;br /&gt;
    # DNAT SSH (port 2222 du frontal -&amp;gt; GIT:22)&lt;br /&gt;
    iifname $WAN tcp dport 2222 dnat to $GIT:22&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Application ====&lt;br /&gt;
On valide la syntaxe par :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nft -f /etc/nftables.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et on relance par :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl restart nftables&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Récapitulation ====&lt;br /&gt;
Le fichier &amp;lt;code&amp;gt;/etc/nftables.conf&amp;lt;/code&amp;gt; contient maintenant :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
define WAN = &amp;quot;eth0&amp;quot;                 # 192.168.0.0/24&lt;br /&gt;
define LAN = &amp;quot;eth1&amp;quot;                 # 10.11.11.0/24&lt;br /&gt;
define LAN_NET = 10.11.11.0/24&lt;br /&gt;
define GIT = 10.11.11.30&lt;br /&gt;
&lt;br /&gt;
table ip filter {&lt;br /&gt;
  chain input {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # loopback&lt;br /&gt;
    iifname &amp;quot;lo&amp;quot; accept&lt;br /&gt;
&lt;br /&gt;
    # established/related&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # ICMP utile&lt;br /&gt;
    ip protocol icmp accept&lt;br /&gt;
&lt;br /&gt;
    # DNS vers le routeur (clients du sous-LAN)&lt;br /&gt;
    iifname $LAN udp dport 53 accept&lt;br /&gt;
    iifname $LAN tcp dport 53 accept&lt;br /&gt;
&lt;br /&gt;
    # DHCP serveur (dnsmasq)&lt;br /&gt;
    iifname $LAN udp sport 68 udp dport 67 accept&lt;br /&gt;
    iifname $LAN udp sport 67 udp dport 68 accept&lt;br /&gt;
&lt;br /&gt;
    # SSH vers le routeur (port 22)&lt;br /&gt;
    iifname $LAN tcp dport 22 accept&lt;br /&gt;
    ip saddr 192.168.0.0/24 iifname $WAN tcp dport 22 accept&lt;br /&gt;
&lt;br /&gt;
    # HTTP/HTTPS vers Caddy sur le frontal&lt;br /&gt;
    iifname $WAN tcp dport {80, 443} accept&lt;br /&gt;
    iifname $LAN tcp dport {80, 443} accept&lt;br /&gt;
    # HTTP/3 (QUIC)&lt;br /&gt;
    iifname $WAN udp dport 443 accept&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  chain forward {&lt;br /&gt;
    type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # flux établis&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # LAN -&amp;gt; WAN (trafic sortant)&lt;br /&gt;
    iifname $LAN oifname $WAN ct state new accept&lt;br /&gt;
&lt;br /&gt;
    # DNAT SSH WAN:2222 -&amp;gt; GIT:22&lt;br /&gt;
    iifname $WAN oifname $LAN ip daddr $GIT tcp dport 22 ct state new accept&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  chain output {&lt;br /&gt;
    type filter hook output priority 0; policy accept;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table ip nat {&lt;br /&gt;
  chain prerouting {&lt;br /&gt;
    type nat hook prerouting priority -100; policy accept;&lt;br /&gt;
&lt;br /&gt;
    # DNAT SSH (port 2222 du frontal -&amp;gt; GIT:22)&lt;br /&gt;
    iifname $WAN tcp dport 2222 dnat to $GIT:22&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
chain postrouting {&lt;br /&gt;
    type nat hook postrouting priority 100; policy accept;&lt;br /&gt;
&lt;br /&gt;
    # Masquerade LAN -&amp;gt; WAN&lt;br /&gt;
    oifname $WAN ip saddr $LAN_NET masquerade&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Oui c&#039;est mort depuis le WAN seul le HTTPS est ouvert (et le HTTP pour let&#039;s encrypt) inutile d&#039;essayer de rentrer (par là en tout cas)&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Infrastructure_bas%C3%A9e_PI&amp;diff=1950</id>
		<title>Infrastructure basée PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Infrastructure_bas%C3%A9e_PI&amp;diff=1950"/>
		<updated>2026-04-22T21:09:47Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Image.png|vignette]]&lt;br /&gt;
L&#039;architecture PILAN ressemble à quelque chose comme ça:[[Fichier:Archi pilan.png|sans_cadre|769x769px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Infrastructure_bas%C3%A9e_PI&amp;diff=1949</id>
		<title>Infrastructure basée PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Infrastructure_bas%C3%A9e_PI&amp;diff=1949"/>
		<updated>2026-04-22T21:07:46Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Archi pilan.png|sans_cadre|769x769px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Archi_pilan.png&amp;diff=1948</id>
		<title>Fichier:Archi pilan.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Archi_pilan.png&amp;diff=1948"/>
		<updated>2026-04-22T21:07:22Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Architecture L2/L3  + L4/L7&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Bash_random&amp;diff=1947</id>
		<title>Bash random</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Bash_random&amp;diff=1947"/>
		<updated>2026-04-08T08:49:23Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les ordinateurs savent faire beaucoup de chose mais ont beaucoup de mal avec le hasard. Leur conception déterministe ne les prédispose pas à ce genre de travail. Deux solutions émergent:&lt;br /&gt;
&lt;br /&gt;
* Se baser sur un phénomène physique aléatoire ou réputé tel mais c&#039;est très difficile et il faut avoir un capteur pour cela.&lt;br /&gt;
* Utiliser un algorithme pseudo aléatoire. La suite de nombre sera réputé aléatoire même su toujours la même. Exemple les chiffres de PI. La suite est aléatoire mais commence toujours par 3.14... l&#039;ordinateur utilise souvent le temps pour prendre &amp;quot;en marche&amp;quot; cette séquence.&lt;br /&gt;
&lt;br /&gt;
== Sulution basée sur des répétitions de uuid ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la page de génération de uuid j&#039;avais mentionné la disponibillité d&#039;un outil de génération :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/sys/kernel/random/uuid &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui nous donne des chaines du type :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
45448407-faf9-42af-af54-fbe6194a510c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le script suivant :&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
while [ 1 ]&lt;br /&gt;
do &lt;br /&gt;
  export RND=`cat /proc/sys/kernel/random/uuid  | cut -b 1-8,10-13,15-18,20-23,25-`&lt;br /&gt;
  echo -n $RND&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Va nous donner une suite ininterrompue de digits en hexa.&lt;br /&gt;
&lt;br /&gt;
Si on veut du binaire xxd est notre amis mai, attention, le binaire n&#039;est pas affichable. On redirige vers un fichier.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
while [ 1 ]&lt;br /&gt;
  do &lt;br /&gt;
  export RND=`cat /proc/sys/kernel/random/uuid  | cut -b 1-8,10-13,15-18,20-23,25-`&lt;br /&gt;
  echo -n $RND&lt;br /&gt;
done | xxd -r -p &amp;gt; binary-random.bin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On fait tourner ce scriot quelques secondes et on l&#039;arrête par &amp;lt;CTRL&amp;gt;+C.&lt;br /&gt;
&lt;br /&gt;
On récupère un fichier binaire aléatoire.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;afficher avec &amp;lt;code&amp;gt;od -x&amp;lt;/code&amp;gt; ou avec &amp;lt;code&amp;gt;base64&amp;lt;/code&amp;gt; par exemple.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Bash_random&amp;diff=1946</id>
		<title>Bash random</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Bash_random&amp;diff=1946"/>
		<updated>2026-04-08T08:31:50Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Page créée avec « Les ordinateurs savent faire beaucoup de chose mais ont beaucoup de mal avec le hasard. Leur conception déterministe ne les prédispose pas à ce genre de travail. Deux solutions émergent:  * Se baser sur un phénomène physique aléatoire ou réputé tel mais c&amp;#039;est très difficile et il faut avoir un capteur pour cela. * Utiliser un algorithme pseudo aléatoire. La suite de nombre sera réputé aléatoire même su toujours la même. Exemple les chiffres de PI.... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les ordinateurs savent faire beaucoup de chose mais ont beaucoup de mal avec le hasard. Leur conception déterministe ne les prédispose pas à ce genre de travail. Deux solutions émergent:&lt;br /&gt;
&lt;br /&gt;
* Se baser sur un phénomène physique aléatoire ou réputé tel mais c&#039;est très difficile et il faut avoir un capteur pour cela.&lt;br /&gt;
* Utiliser un algorithme pseudo aléatoire. La suite de nombre sera réputé aléatoire même su toujours la même. Exemple les chiffres de PI. La suite est aléatoire mais commence toujours par 3.14... l&#039;ordinateur utilise souvent le temps pour prendre &amp;quot;en marche&amp;quot; cette séquence.&lt;br /&gt;
&lt;br /&gt;
Dans la page de génération de uuid j&#039;avais mentionné la disponibillité d&#039;un outil de génération :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/sys/kernel/random/uuid &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui nous donne des chaines du type :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
45448407-faf9-42af-af54-fbe6194a510c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le script suivant :&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
while [ 1 ]&lt;br /&gt;
do &lt;br /&gt;
  export RND=`cat /proc/sys/kernel/random/uuid  | cut -b 1-8,10-13,15-18,20-23,25-`&lt;br /&gt;
  echo -n $RND&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Va nous donner une suite ininterrompue de digits en hexa.&lt;br /&gt;
&lt;br /&gt;
Si on veut du binaire xxd est notre amis mai, attention, le binaire n&#039;est pas affichable. On redirige vers un fichier.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
while [ 1 ]&lt;br /&gt;
  do &lt;br /&gt;
  export RND=`cat /proc/sys/kernel/random/uuid  | cut -b 1-8,10-13,15-18,20-23,25-`&lt;br /&gt;
  echo -n $RND&lt;br /&gt;
done | xxd -r -p &amp;gt; binary-random.bin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On fait tourner ce scriot quelques secondes et on l&#039;arrête par &amp;lt;CTRL&amp;gt;+C.&lt;br /&gt;
&lt;br /&gt;
On récupère un fichier binaire aléatoire.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;afficher avec &amp;lt;code&amp;gt;od -x&amp;lt;/code&amp;gt; ou avec &amp;lt;code&amp;gt;base64&amp;lt;/code&amp;gt; par exemple.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=1945</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=1945"/>
		<updated>2026-04-08T08:08:45Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bienvenu sur ma nouvelle &amp;quot;Knowledge base&amp;quot; [[Spécial:Version|Version]] autohébergée.&lt;br /&gt;
&lt;br /&gt;
Une page temporaire pour la mise à jour de ce wiki-ci: [[MAJ WIKI]] (a faire)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Développement &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Logo C++.png|sans_cadre|61x61px]] C/C++ : &#039;&#039;&#039;LE&#039;&#039;&#039; Langage de programation.&lt;br /&gt;
|Les [[sockets C]]&lt;br /&gt;
Gérer l&#039;écran &amp;quot;à la vi&amp;quot; avec [[Curses en C|curses]]&lt;br /&gt;
&lt;br /&gt;
Gérer le [[Temps à la milliseconde en C|temps à la milliseconde]].&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Perl logo.png|sans_cadre|48x48px]]Perl : Le meilleur langage de script. &lt;br /&gt;
|Quelques [[Quelques modules Perl|modules Perl]] utiles.&lt;br /&gt;
Petits [[hacks en perl]]. &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Python Logo.png|alt=Python|sans_cadre|74x74px]]Python : Pas mon préféré mais il est tellement utilisé!&lt;br /&gt;
|Syntaxe [[Les bases de Python|de base]],&lt;br /&gt;
Gestion des [[Exceptions en Python|exceptions]].&lt;br /&gt;
&lt;br /&gt;
Python et ses [[Environnements virtuels Python|environnements virtuels]].&lt;br /&gt;
&lt;br /&gt;
Les [[Modules et outils de développement Python|modules et les outils de développement]]. &lt;br /&gt;
&lt;br /&gt;
[[Gestion des documents PDF en Python|Gestion des documents PDF]]. &lt;br /&gt;
&lt;br /&gt;
[[Petits exemples de code Python|Petits exemples de code]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outils&lt;br /&gt;
|[[Fichier:Git logo.png|sans_cadre|67x67px]]Git&lt;br /&gt;
|[[GIT Utilisation simple|Utilisation simple]] &lt;br /&gt;
[[GIT-HUB]]&lt;br /&gt;
|-&lt;br /&gt;
|Shell&lt;br /&gt;
|sh/bash&lt;br /&gt;
|Syntaxe du [[If en bash|if]].&lt;br /&gt;
Syntaxe de [[For in bash|for]].&lt;br /&gt;
&lt;br /&gt;
Traiter des [[CSV bash|fichiers csv]]&lt;br /&gt;
Traitement de phrases [[Encodage d&#039;objets complexes#Usage en shell (commande jq)|JSON avec jq]]&lt;br /&gt;
&lt;br /&gt;
[[Bash random|Générer de hasard]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;8&amp;quot; |Système&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Global&lt;br /&gt;
|[[Encodage]] de caractères&lt;br /&gt;
|Le [[code morse]], le [[code baudot]], les codes [[ASCII]], les séquences [[ANSI]] le code [[Code Gray|Gray]] et un OVNI, le code [[Extended Binary Coded Decimal Interchange Code|EBCEDIC]]&lt;br /&gt;
les code [[UNICODE]].&lt;br /&gt;
|-&lt;br /&gt;
|Encodage d&#039;objets&lt;br /&gt;
|Les [[entiers]]&lt;br /&gt;
le [[temps]]&lt;br /&gt;
&lt;br /&gt;
Les [[nombres flottants]]&lt;br /&gt;
&lt;br /&gt;
[[Encodage d&#039;objets complexes|Les objets complexes]]&lt;br /&gt;
&lt;br /&gt;
Encodage de binaire en [[base64]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Linux [[Fichier:Linux-logo.png|sans_cadre|93x93px]]&lt;br /&gt;
|Général&lt;br /&gt;
|[[Généralités Linux|Généralités]] quel que soient les distributions de linux (ou UNIX).&lt;br /&gt;
Lancer un [[deamon avec systemd]].&lt;br /&gt;
&lt;br /&gt;
Configurer une client [[Connexion SSH|ssh]].&lt;br /&gt;
&lt;br /&gt;
Installer [[web-ssh]]&lt;br /&gt;
|-&lt;br /&gt;
|Debian (Ubuntu...)&lt;br /&gt;
|[[Gestion des services Debian/Ubuntu|Gestion des services]]&lt;br /&gt;
&lt;br /&gt;
[[Nettoyage APT]]&lt;br /&gt;
&lt;br /&gt;
Informations sur une [[Info distribution DEBIAN|distribution]]&lt;br /&gt;
|-&lt;br /&gt;
|WSL &lt;br /&gt;
|[[Relancer WSL]]&lt;br /&gt;
&lt;br /&gt;
[[Monter un disque externe dans wsl]]&lt;br /&gt;
&lt;br /&gt;
[[Utiliser un port USB dans WSL]]&lt;br /&gt;
|-&lt;br /&gt;
|Windows [[Fichier:Microsoft Windows Logo.png|sans_cadre|96x96px]]&lt;br /&gt;
|..., 10, 11&lt;br /&gt;
|[[Wireshark]] &amp;lt;sub&amp;gt;(images manquantes)&amp;lt;/sub&amp;gt;&lt;br /&gt;
CYGWIN&lt;br /&gt;
&lt;br /&gt;
[[MINGW32]]&lt;br /&gt;
&lt;br /&gt;
[[Scoop]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Open WRT]]&lt;br /&gt;
[[Fichier:Open WRT LOGO.png|sans_cadre|135x135px]]&lt;br /&gt;
|Global&lt;br /&gt;
[[GL Inet]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gl-inet-router.png|sans_cadre|147x147px]]&lt;br /&gt;
|[[GL Inet Reset|Reset]] sortie d&#039;usine.&lt;br /&gt;
Réglage du serveur [[Open WRT DHCP|DHCP]]&lt;br /&gt;
&lt;br /&gt;
Ajouter un [[OpenWRTpackages|package]].&lt;br /&gt;
&lt;br /&gt;
[[Open WRT Commandes de base pour le réseau|Commandes de base pour le réseau]].&lt;br /&gt;
&lt;br /&gt;
[[tcpdump]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le ssh depuis le côté WAN.]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le WEB depuis le coté WAN]]&lt;br /&gt;
&lt;br /&gt;
Gérer des ampoules [[Wiz et OpenWRT|Phillips Wiz]].&lt;br /&gt;
&lt;br /&gt;
Installer un outil de [[Test de la bande passante Open WRT|test de la bande passante]] de la patte &amp;quot;wan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Auto hébergement&lt;br /&gt;
[[Fichier:AnarchySymbol.png|sans_cadre|107x107px]]&lt;br /&gt;
|[[Fichier:Raspberry.png|sans_cadre|40x40px]]  [[Raspberry PI]]&lt;br /&gt;
|L&#039;auto hébergement est assez facile à réaliser chez sois. Une solution est d&#039;utiliser un ou plusieurs raspberry PI.&lt;br /&gt;
[[Auto Hebergement|La base]] explique l&#039;installation de base d&#039;un PI comme module de base.&lt;br /&gt;
&lt;br /&gt;
REPRISE de l&#039;architecture. Je vais tenter une refonte de cette section. Elle devrait remplacer celle ci dessus&lt;br /&gt;
&lt;br /&gt;
# [[Infrastructure basée PI|Architecture]]&lt;br /&gt;
# &amp;lt;code&amp;gt;front-router&amp;lt;/code&amp;gt;[[Le routeur en tête réseau PI|Le routeur en tête]] &lt;br /&gt;
# [[Node-red dans le LAN|Un serveur Node-red]] &lt;br /&gt;
#&amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;[[PI GitLab|Un serveur Git]]&lt;br /&gt;
#&amp;lt;code&amp;gt;database&amp;lt;/code&amp;gt;[[PI MariaDB|Un serveur de base de données]]&lt;br /&gt;
#&amp;lt;code&amp;gt;mediawiki&amp;lt;/code&amp;gt; [[PI MediaWiki|Un serveur mediawiki]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |APIs&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Géolocalisation et cartographie&lt;br /&gt;
|IP API&lt;br /&gt;
|[[Abstract API]] Donne une localisation a partir d&#039;une IP&lt;br /&gt;
[[IPinfo]] Une autre bibliotheque de localisation d&#039;IP&lt;br /&gt;
|-&lt;br /&gt;
|Ephemérides&lt;br /&gt;
|[[Sunset and sunrise times API]] va nous dire quand le soleil se lève quand il se couche, la lune…&lt;br /&gt;
|-&lt;br /&gt;
|Trafic Aérien&lt;br /&gt;
|[[FlightRadar24]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;6&amp;quot; |Logiciels&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Middleware&lt;br /&gt;
|Bases de données relationelles&lt;br /&gt;
|Le langage [[SQL]] &lt;br /&gt;
Les &amp;quot;minimales&amp;quot;: [[MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Les encore plus minimales: [[SQLite]] &lt;br /&gt;
&lt;br /&gt;
Les maximales: [[Oracle]], [[PostgeSQL]]&lt;br /&gt;
|-&lt;br /&gt;
|Bases de données NoSQL&lt;br /&gt;
|[[mongodb]]&lt;br /&gt;
|-&lt;br /&gt;
|Messages&lt;br /&gt;
|[[MQTT]]&lt;br /&gt;
|-&lt;br /&gt;
|Serveur applicatifs/web&lt;br /&gt;
|[[Apache]]&lt;br /&gt;
&lt;br /&gt;
[[Weblogic]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Bureautique&lt;br /&gt;
|Excel&lt;br /&gt;
|[[Gestion des dates sous Excel|Gestion des dates]]&amp;lt;nowiki/&amp;gt; &lt;br /&gt;
[[EXCEL Gestion des chaines de caractères|Gest]][[EXCEL Gestion des chaines de caractères|io]][[EXCEL Gestion des chaines de caractères|n d]][[EXCEL Gestion des chaines de caractères|es cha]][[EXCEL Gestion des chaines de caractères|în]][[EXCEL Gestion des chaines de caractères|es de c]][[EXCEL Gestion des chaines de caractères|ar]][[EXCEL Gestion des chaines de caractères|actère]][[EXCEL Gestion des chaines de caractères|s]]&lt;br /&gt;
&lt;br /&gt;
[[Identifier si la clé d&#039;une ligne est présente dans un autre tableau]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outlook&lt;br /&gt;
|[[Outlook - Gestion des archives|Gestion des archives]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;4&amp;quot; |Sécurite&lt;br /&gt;
|Chiffrement / déchiffrage&lt;br /&gt;
|OpenSSL&lt;br /&gt;
|[[Les bases de Open SSL|La base]]&lt;br /&gt;
[[OpenSSL et AES]] (symetrique)&lt;br /&gt;
&lt;br /&gt;
[[OpenSSL_et_RSA]] (asymetrique)&lt;br /&gt;
&lt;br /&gt;
Avec [[SMIME et Certificats x509|x509 et SMIME]] on marie les deux&lt;br /&gt;
&lt;br /&gt;
Comment [[OpenSSL extraire un certificat|extraire un certificat]] d&#039;un serveur en production.&lt;br /&gt;
&lt;br /&gt;
PGP et [[GPG]] (chiffrer de documents)&lt;br /&gt;
&lt;br /&gt;
Générer un [[mode de passe sécurisé]]&lt;br /&gt;
&lt;br /&gt;
Les autres commandes [[openssl]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Certificats&lt;br /&gt;
|Generalités&lt;br /&gt;
|[[Les certificats X.509|Un certificat c&#039;est quoi?]]&lt;br /&gt;
|-&lt;br /&gt;
|PKI&lt;br /&gt;
|[[PKI familiale|Faire une PKI &amp;quot;familiale&amp;quot;]]&lt;br /&gt;
|-&lt;br /&gt;
|https&lt;br /&gt;
|[[Certificats Serveur https|Certificats Serveur]]&lt;br /&gt;
[[Certificats Client https|Certificats Client]]&lt;br /&gt;
&lt;br /&gt;
[[Let&#039;s encrypt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot; |Embarqué&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Microcontroleurs&lt;br /&gt;
|[[Fichier:Arduino Logo.png|sans_cadre|40x40px]][[Arduino]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[ESP8266]]&lt;br /&gt;
|Le module [[SON/OFF Smart Switch|Smart Switch]] de SONOFF&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Espessif logo.png|gauche|sans_cadre|40x40px]][[ESP32]]&lt;br /&gt;
|Environnement de dev [[ESP-IDF]], Utiliser [[mkspiffs]].&lt;br /&gt;
La carte &amp;quot;breakout&amp;quot; [[ESP32_DEVKITV1]]&lt;br /&gt;
La carte &amp;quot;AZ delivery&amp;quot; [[ESP32_DEVKITV2]]&lt;br /&gt;
&lt;br /&gt;
Faire des [[ESP32 Requetês HTTPs|requetês HTTPs]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Firmware Update|Firmware Update]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Matrice de led|Exemple d&#039;utilisation de matrice de LED]] (circuit MAX 72xx)&lt;br /&gt;
&lt;br /&gt;
Programmation module [[ESP32C3 avec écran spotear]].&lt;br /&gt;
|-&lt;br /&gt;
!Fusion&lt;br /&gt;
|Dev ESP 32 sur Raspberry PI&lt;br /&gt;
|Ici un article qui touche aux deux sujets. [[Poste de DEV ESP32 sur PI|Comment programmes les  microcontrôleurs ESP32 à partir d&#039;un raspberry PI]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |SBC (single board computers)&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Fichier:Logo PI.png|sans_cadre|36x36px]][[Raspberry PI]]&lt;br /&gt;
|[[Les modèles de Raspberry PI]]&lt;br /&gt;
La configuration réseau [[DHCP ou IP fixe]] &lt;br /&gt;
&lt;br /&gt;
Ecran [[Écran Adafruit 2.8 pouces TFT|Adafruit 2.8&#039;]]&#039;et [[Cohabitation écran Adafruit PiTFT 2.8&amp;quot; et HDMI|Cohabitation des écrans]]. &lt;br /&gt;
&lt;br /&gt;
Utiliser le [[frame-buffer]]&lt;br /&gt;
&lt;br /&gt;
[[Demarrer PI4 en USB|Gérer un PI4 dont le lecteur de carte SD est HS]].&lt;br /&gt;
|-&lt;br /&gt;
|Installer :&lt;br /&gt;
[[RPi-NodeRed|NodeRed]], [[Mosquitto]], [[MariaDB sur Raspberry PI|MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Le service graphique de gestion des mises à jour [[PackageKit]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Bpi.png|sans_cadre|48x48px]]Banana PI&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Objets connectés&lt;br /&gt;
|[[Fichier:PHILLIPS HUE LOGO.png|sans_cadre|87x87px]]&lt;br /&gt;
|Description [[PHILLIPS HUE|API]] de base&lt;br /&gt;
Le site de Phillips : https://developers.meethue.com/develop/hue-api-v2/getting-started/&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:X-sense logo.png|sans_cadre|52x52px]]x-sense&lt;br /&gt;
|[[X-sense|Description générale]]&lt;br /&gt;
Utilisation avec le module [[python-xsense]]&lt;br /&gt;
|-&lt;br /&gt;
|Phillips Wiz&lt;br /&gt;
|Les limites de ces [[Securite PHILLIPS WIZ|ampoules au niveau sécurité]].&lt;br /&gt;
Utilisation avec un [[Wiz et OpenWRT|routeur OpenWrt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;9&amp;quot; |Electronique&lt;br /&gt;
|Composants&lt;br /&gt;
|Composants actifs&lt;br /&gt;
|[[Le transistor bipolaire]]&lt;br /&gt;
|-&lt;br /&gt;
|Circuits&lt;br /&gt;
|Filtres&lt;br /&gt;
|Filtre de rejection : https://poujouly.net/2015/10/25/filtre-notch-50hz/ (oui un lien externe pour le moment)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Le labo&lt;br /&gt;
|Le protocoles&lt;br /&gt;
|[[UART/RS323]]&lt;br /&gt;
&lt;br /&gt;
[[SCPI uart]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Les outils de mesures connectables&lt;br /&gt;
|[[Multimètre]] modèle : &lt;br /&gt;
&lt;br /&gt;
* [[Multicomp PRO MP730027]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Générateur de fonctions arbitraire]] modèles : &lt;br /&gt;
&lt;br /&gt;
* [[GwINSTEK AFG-2012]]&lt;br /&gt;
* [[Multicomp MP75511]]&lt;br /&gt;
* [[FeelTech FY6600]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Osciloscope]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Alimantation]]&lt;br /&gt;
&lt;br /&gt;
[[Alimentation USB C]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Conception&lt;br /&gt;
|[[Fichier:Autodesk Eagle logo.png|sans_cadre|123x123px]]&lt;br /&gt;
|Logiciel de conception de circuits et de modélisation de circuit imprimés.&lt;br /&gt;
[[EAGLE - Plans de masse|Plans de masse]]&lt;br /&gt;
&lt;br /&gt;
[[Les unités dans EAGLE]]&lt;br /&gt;
|-&lt;br /&gt;
|LTspice&lt;br /&gt;
|Logiciel de simulation électronique&lt;br /&gt;
[[LTspice fichier de simulation|Utiliser un signal numérisé en entré d&#039;une simulation]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;7&amp;quot; |CAO FAO&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Mécanique&lt;br /&gt;
|Visserie&lt;br /&gt;
|[[Dimensions visserie ISO]]&lt;br /&gt;
|-&lt;br /&gt;
|Usinage&lt;br /&gt;
|Dimensions des [[fraises en unités Imériales/US]]&lt;br /&gt;
|-&lt;br /&gt;
|Fabrication additive&lt;br /&gt;
|Imprimantes 3D FDM&lt;br /&gt;
|[[Fichier:Ultimaker logo.png|sans_cadre|37x37px]] [[Ultimaker 2]]&lt;br /&gt;
|-&lt;br /&gt;
|CNC&lt;br /&gt;
|Fraiseuses&lt;br /&gt;
|La base… la [[CNC 3018|3018]].&lt;br /&gt;
Faire des perçages avec un [[CNC Percages gcode|programme python]].&lt;br /&gt;
&lt;br /&gt;
Graver des [[PCB avec CNC|PCB]]&lt;br /&gt;
&lt;br /&gt;
[[Changer la broche CNC3018|Changer la broche]]&lt;br /&gt;
|-&lt;br /&gt;
|Découpeuse (Vinyle ou autre)&lt;br /&gt;
|Silhouette&lt;br /&gt;
|[[SILHOUETTE Paramètres de base|Paramètres de base]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciels de CAO&lt;br /&gt;
|[[Fichier:Freecad logo.png|alt=FREE CAD|sans_cadre|47x47px]]FreeCad&lt;br /&gt;
|[[FreeCad]]&lt;br /&gt;
|-&lt;br /&gt;
|Outillage&lt;br /&gt;
|Metrologie&lt;br /&gt;
|[[Comparateur Numérique]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Projets complets&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Création/Configuration de serveur&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Exemple chez GANDI&lt;br /&gt;
|[[Serveur mediawiki basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur nodered basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur Owncloud]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur DNS GANDI|Serveur DNS]]&lt;br /&gt;
|-&lt;br /&gt;
|Objets connectés&lt;br /&gt;
|ESP32&lt;br /&gt;
|[[ESP32 Horloge à LED|Une Horloge à LED]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Photos&lt;br /&gt;
|Matériel&lt;br /&gt;
|D90&lt;br /&gt;
[[Fichier:D90.png|sans_cadre|58x58px]]&lt;br /&gt;
|[[Connectique D90|Connectique]]&lt;br /&gt;
|-&lt;br /&gt;
|Théorie&lt;br /&gt;
|&lt;br /&gt;
|Les [[bases en optique pour la photo]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciel&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Python-xsense&amp;diff=1944</id>
		<title>Python-xsense</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Python-xsense&amp;diff=1944"/>
		<updated>2026-03-28T23:08:37Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L&#039;utilisation des capteurs x-sense en dehors des applications classiques est assez mal documentée. J&#039;ai seulement trouvé un module python : [https://github.com/theosnel/python-xsense/tree/develop python-xsense] sur github.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Pour moi elle a été relativement douloureuse mais avec les infos ci-dessous ca va tout seul.&lt;br /&gt;
&lt;br /&gt;
Il vaut mieux créer un environnement virtuel python pour cela.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m venv x-sense-env&lt;br /&gt;
source x-sense-env/bin/activate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On clone le repository git.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/theosnel/python-xsense.git&lt;br /&gt;
cd python-xsense&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On y est mais avant de lancer le test.py il y a beaucoup de modules a installer.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
python -m pip install requests&lt;br /&gt;
python -m pip install boto3&lt;br /&gt;
python -m pip install pycognito&lt;br /&gt;
python -m pip install paho-mqtt&lt;br /&gt;
python -m pip install aiohttp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Attention pour paho. Le programme dit qu&#039;il manque le module paho mais, si on le trouves pour windows, pour linux il faut bien préciser paho-mqtt!&lt;br /&gt;
&lt;br /&gt;
Ensuite on lance le programme de test avec les identifiants que l&#039;on a entrés avec l&#039;application lors de la création du compte.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
python test.py --username &#039;mail@mondomaine.com&#039; --password &#039;monmotdepasse&#039;&lt;br /&gt;
----[ Paris Eugène Millon (XXXX7AD2F07111EXXXX711521EXXXXAA) ]-----------------&lt;br /&gt;
Station de base (SBS50):&lt;br /&gt;
  serial  : 14BXXXX&lt;br /&gt;
  online  : yes&lt;br /&gt;
  values  : {&#039;type&#039;: &#039;SBS50&#039;, &#039;stationSN&#039;: &#039;14B9XXXX&#039;, &#039;deviceSN&#039;: &#039;14B9XXXX&#039;, &#039;sw&#039;: &#039;v1.5.7&#039;, &#039;rfFreq&#039;: &#039;868&#039;, &#039;voiceVol&#039;: &#039;75&#039;, &#039;alarmVol&#039;: &#039;75&#039;, &#039;alarmTone&#039;: &#039;1&#039;, &#039;ledBrt&#039;: &#039;8&#039;, &#039;ssid&#039;: &#039;XXX&#039;, &#039;ip&#039;: &#039;X.Y.Z.101&#039;, &#039;mac&#039;: &#039;EC:C9:FF:7A:XX:XX&#039;, &#039;macBT&#039;: &#039;EC:C9:FF:7A:XX:XX&#039;, &#039;wifiRSSI&#039;: &#039;-61&#039;}&lt;br /&gt;
# Station de base (XXXXE563F07111EFB406B141D849XXXX)&lt;br /&gt;
Thermo-hygromètre (STH51):&lt;br /&gt;
  serial  : 00000001&lt;br /&gt;
  online  : yes&lt;br /&gt;
  values  : {&#039;type&#039;: &#039;STH51&#039;, &#039;batInfo&#039;: 3, &#039;rfLevel&#039;: 3, &#039;online&#039;: &#039;1&#039;, &#039;alarmStatus&#039;: False, &#039;temperature&#039;: 19.8, &#039;humidity&#039;: 45.6, &#039;temperatureUnit&#039;: &#039;1&#039;, &#039;temperatureRange&#039;: [-20, 60], &#039;humidityRange&#039;: [0, 100], &#039;alarmEnabled&#039;: True, &#039;continuedAlarm&#039;: False, &#039;time&#039;: &#039;20250221181904&#039;}&lt;br /&gt;
Thermo-hygromètre 2 (STH51):&lt;br /&gt;
  serial  : 00000002&lt;br /&gt;
  online  : yes&lt;br /&gt;
  values  : {&#039;type&#039;: &#039;STH51&#039;, &#039;batInfo&#039;: 3, &#039;rfLevel&#039;: 3, &#039;online&#039;: &#039;1&#039;, &#039;alarmStatus&#039;: False, &#039;temperature&#039;: 18.4, &#039;humidity&#039;: 51.2, &#039;temperatureUnit&#039;: &#039;1&#039;, &#039;temperatureRange&#039;: [-20, 60], &#039;humidityRange&#039;: [0, 100], &#039;alarmEnabled&#039;: True, &#039;continuedAlarm&#039;: False, &#039;time&#039;: &#039;20250221181904&#039;}&lt;br /&gt;
Thermo-hygromètre 3 (STH51):&lt;br /&gt;
  serial  : 00000003&lt;br /&gt;
  online  : yes&lt;br /&gt;
  values  : {&#039;type&#039;: &#039;STH51&#039;, &#039;batInfo&#039;: 3, &#039;rfLevel&#039;: 3, &#039;online&#039;: &#039;1&#039;, &#039;alarmStatus&#039;: False, &#039;temperature&#039;: 18.7, &#039;humidity&#039;: 48.8, &#039;temperatureUnit&#039;: &#039;1&#039;, &#039;temperatureRange&#039;: [-20, 60], &#039;humidityRange&#039;: [0, 100], &#039;alarmEnabled&#039;: True, &#039;continuedAlarm&#039;: False, &#039;time&#039;: &#039;20250221181905&#039;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On voit bien comment obtenir toutes les informations sur les capteurs installés. En particulier la température et l&#039;humidité des 3 capteurs.&lt;br /&gt;
&lt;br /&gt;
L&#039;étude du code nous en apprendra beaucoup.&lt;br /&gt;
&lt;br /&gt;
=== Repository GIT ===&lt;br /&gt;
Un repo git est crée dans l&#039;environnement de dev.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git:repo/python-xsense&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Lire le README.MD il résume ce qui est dit ci-dessus et explique comment ça marche.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=PI_GitLab&amp;diff=1943</id>
		<title>PI GitLab</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=PI_GitLab&amp;diff=1943"/>
		<updated>2026-03-24T00:06:08Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Depuis l&amp;#039;extérieur du LAN &amp;quot;pilan&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== La base ===&lt;br /&gt;
On crée une carte standard avec Raspberry Pi Imager (Dernière version sans desktop et en activant l&#039;acces ssh).&lt;br /&gt;
&lt;br /&gt;
Plus un petit :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour rattraper le retard de l&#039;image sur le dépots.&lt;br /&gt;
&lt;br /&gt;
Ensuite un &amp;lt;code&amp;gt;sudo raspi-config&amp;lt;/code&amp;gt; pour :&lt;br /&gt;
&lt;br /&gt;
* Activer l&#039;autologin que l&#039;on utilisera en urgence si le frontal plante ou si on a oublie le mot de passe.&lt;br /&gt;
* Le &amp;quot;expand file system&amp;quot; être sur de ne rien perdre.&lt;br /&gt;
&lt;br /&gt;
On lui ajoute une adresse IP fixe sur le routeur : [[Le routeur en tête réseau PI#Gestion de l&#039;allocation d&#039;IP fixes en DHCP|IP FIXE]].&lt;br /&gt;
&lt;br /&gt;
=== La partie spécifique ===&lt;br /&gt;
On commence par la base:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install -y git &lt;br /&gt;
sudo apt install -y cgit&lt;br /&gt;
sudo apt install -y fcgiwrap spawn-fcgi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;fcgiwrap&#039;&#039;&#039; : un petit démon qui “wrappe” les scripts CGI pour les exécuter via le protocole FastCGI.  → C’est ce qui permet à un serveur web (lighttpd, nginx, Caddy via reverse proxy) de lancer &amp;lt;code&amp;gt;cgit.cgi&amp;lt;/code&amp;gt; proprement.&lt;br /&gt;
* &#039;&#039;&#039;spawn-fcgi&#039;&#039;&#039; : un utilitaire pour démarrer &amp;lt;code&amp;gt;fcgiwrap&amp;lt;/code&amp;gt; facilement (en créant un socket Unix ou TCP).&lt;br /&gt;
&lt;br /&gt;
==== Config de fcgiwrap ====&lt;br /&gt;
Créer une fichier &amp;lt;code&amp;gt;fcgiwrap.service&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=fcgiwrap FastCGI server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=/usr/bin/spawn-fcgi -s /var/run/fcgiwrap.socket -M 0660 -u www-data -g www-data /usr/sbin/fcgiwrap&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=2&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et utiliser le fichier d&#039;installation install.sh :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sudo cp fcgiwrap.service /etc/systemd/system/.&lt;br /&gt;
sudo systemctl daemon-reload&lt;br /&gt;
sudo systemctl enable fcgiwrap.service&lt;br /&gt;
sudo systemctl start fcgiwrap.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;l&#039;installation donne :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Synchronizing state of fcgiwrap.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.&lt;br /&gt;
Executing: /usr/lib/systemd/systemd-sysv-install enable fcgiwrap&lt;br /&gt;
Created symlink &#039;/etc/systemd/system/multi-user.target.wants/fcgiwrap.service&#039; → &#039;/etc/systemd/system/fcgiwrap.service&#039;.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et on peut vérifier par :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status fcgiwrap.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui nous réponds par un beau:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Fcgiwrap.socket.status.png|sans_cadre|569x569px]]&lt;br /&gt;
&lt;br /&gt;
J&#039;ai pas pu résister à mettre une jolie copie d&#039;écran avec du vert partout.&lt;br /&gt;
&lt;br /&gt;
On a GIT installé sur le serveur et on a fcgi qui propose un acces a git en cgi-bin. Il faut maintenant installer un serveur http pour gérer le lien http avec le programme CGI.&lt;br /&gt;
&lt;br /&gt;
==== Installation lighthttp ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install -y lighttpd&lt;br /&gt;
sudo lighttpd-enable-mod fastcgi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;L&#039;installation se fait normalement et ensuite le module fastcgi est activé:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Enabling fastcgi: ok&lt;br /&gt;
Run &amp;quot;service lighttpd force-reload&amp;quot; to enable changes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Connexion avec cgit. ====&lt;br /&gt;
On modifie /etc/lighttpd/lighttpd.conf :&lt;br /&gt;
&lt;br /&gt;
Dans les modules on doit trouver :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
server.modules = (&lt;br /&gt;
        &amp;quot;mod_indexfile&amp;quot;,&lt;br /&gt;
        &amp;quot;mod_access&amp;quot;,&lt;br /&gt;
        &amp;quot;mod_alias&amp;quot;,&lt;br /&gt;
        &amp;quot;mod_redirect&amp;quot;,&lt;br /&gt;
        &amp;quot;mod_fastcgi&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et la définition du serveur :&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
server.document-root        = &amp;quot;/usr/share/cgit&amp;quot;&lt;br /&gt;
server.upload-dirs          = ( &amp;quot;/var/cache/lighttpd/uploads&amp;quot; )&lt;br /&gt;
server.errorlog             = &amp;quot;/var/log/lighttpd/error.log&amp;quot;&lt;br /&gt;
server.pid-file             = &amp;quot;/run/lighttpd.pid&amp;quot;&lt;br /&gt;
server.username             = &amp;quot;www-data&amp;quot;&lt;br /&gt;
server.groupname            = &amp;quot;www-data&amp;quot;&lt;br /&gt;
server.port                 = 8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans &amp;lt;code&amp;gt;/etc/lighttpd/conf-available&amp;lt;/code&amp;gt; on crée 50-cgit.conf :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Activer les modules nécessaires (en extension, pas en redéfinition)&lt;br /&gt;
server.modules += ( &amp;quot;mod_fastcgi&amp;quot;, &amp;quot;mod_alias&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
# Déclarer cgit via FastCGI (socket systemd fcgiwrap)&lt;br /&gt;
# On mappe l&#039;URL /cgit vers le CGI cgit.cgi&lt;br /&gt;
fastcgi.server += ( &amp;quot;/cgit&amp;quot; =&amp;gt;&lt;br /&gt;
  ((&lt;br /&gt;
    &amp;quot;socket&amp;quot;       =&amp;gt; &amp;quot;/run/fcgiwrap.socket&amp;quot;,&lt;br /&gt;
    &amp;quot;bin-path&amp;quot;     =&amp;gt; &amp;quot;/usr/lib/cgit/cgit.cgi&amp;quot;,&lt;br /&gt;
    &amp;quot;check-local&amp;quot;  =&amp;gt; &amp;quot;disable&amp;quot;,&lt;br /&gt;
    &amp;quot;mode&amp;quot;         =&amp;gt; &amp;quot;responder&amp;quot;&lt;br /&gt;
  ))&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# Servir les assets CSS / logo&lt;br /&gt;
alias.url += ( &amp;quot;/cgit-css/&amp;quot; =&amp;gt; &amp;quot;/usr/share/cgit/&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
# Permettre que cgit soit servi comme page d&#039;index&lt;br /&gt;
index-file.names += ( &amp;quot;cgit.cgi&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On active le fichier de conf :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo lighttpd-enable-mod cgit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On vérifie la syntaxe:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo lighttpd -t -f /etc/lighttpd/lighttpd.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui doit nous répondre : &amp;lt;code&amp;gt;Syntax OK&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On crée le répertoire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /srv/git&lt;br /&gt;
sudo chown -R www-data:www-data /srv/git&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sudo mkdir -p /var/log/lighttpd&lt;br /&gt;
sudo chown www-data:www-data /var/log/lighttpd&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et on redémarre lighthttpd:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl restart lighttpd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Utilisation ==&lt;br /&gt;
&lt;br /&gt;
=== Depuis le LAN &amp;quot;pilan&amp;quot; ===&lt;br /&gt;
Là c&#039;est simple on clone un repo par :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone user-git@git.pilan:repo/misc.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Depuis l&#039;extérieur du LAN &amp;quot;pilan&amp;quot; ===&lt;br /&gt;
Donc depuis mon LAN domestique ou connecté en VPN dessus:&lt;br /&gt;
&lt;br /&gt;
On doit utiliser la redirection de port entre front-router:2222 et git:22.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;git clone &amp;quot;ssh://jpinon@git:2222/~/repo/misc.git&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;C&#039;est un peut plus relou.&lt;br /&gt;
&lt;br /&gt;
On peut se simplifier la vie en ajoutant dans &amp;lt;code&amp;gt;.ssh/config&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;makefile&amp;quot;&amp;gt;Host git&lt;br /&gt;
        HostName git&lt;br /&gt;
        Port 2222&lt;br /&gt;
        User user-git&amp;lt;/syntaxhighlight&amp;gt;Apres ça un simple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git:repo/misc.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;marchera très bien !&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1942</id>
		<title>ESP32C3 avec écran spotear</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1942"/>
		<updated>2026-03-22T21:55:02Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Niveau Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Appelé en français &amp;quot;Mini ornement de Bureau&amp;quot; voici le module ESP32 C3 équipé de son écran. Personnellement c&#039;est mon premier C3 donc mes débuts en RISC-V. Bon tant que je fais du C avec l&#039;IDE Arduino ca devrait pas trop se voir.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget.png|vignette|220x220px]]&lt;br /&gt;
&lt;br /&gt;
== Premier contact ==&lt;br /&gt;
Apres avoir joué au petit mécano pour monter le bidule. On le branche sur une alim USB (micro USB le design ne date pas d&#039;hier).&lt;br /&gt;
&lt;br /&gt;
On le branche et il affiche un message (assez moche en vérité) indiquant de configurer son &amp;quot;mobile WLAN&amp;quot; avec les paramètres :&lt;br /&gt;
&lt;br /&gt;
SSID : spotpear (c&#039;est le fabricant)&lt;br /&gt;
&lt;br /&gt;
WIFI Key : 12345678&lt;br /&gt;
&lt;br /&gt;
On peut pas plus sûr comme mot de passe !&lt;br /&gt;
&lt;br /&gt;
Le message du dessous me parait me parait assez ésotérique. Ca sent la traduction du chinois fait pas une IA poussive.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget+wifi.png|gauche|vignette|215x215px]]&lt;br /&gt;
Je configure un routeur avec ces paramètres et je rebranche le bigonx.&lt;br /&gt;
&lt;br /&gt;
Une belle barre de progression s&#039;affiche et ensuite un superbe écran!&lt;br /&gt;
&lt;br /&gt;
Que c&#039;est beau!&lt;br /&gt;
&lt;br /&gt;
A première vue:&lt;br /&gt;
&lt;br /&gt;
* L&#039;écran est très correct. Lumineux et lisible.&lt;br /&gt;
* &amp;lt;u&amp;gt;Pour le mini firmware:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;heure locale est juste. Il sait se mètre à l&#039;heure et détecte correctement le fuseau horaire et l&#039;heure été/hiver&lt;br /&gt;
&lt;br /&gt;
* La date est bonne&lt;br /&gt;
* La localisation à Clichy est fausse (on est a Paris aujourd&#039;hui)&lt;br /&gt;
* La température semble correcte le service météo est juste en revanche le fait d&#039;afficher en °F alors qu&#039;on est a Clichy...Bof bof.&lt;br /&gt;
* La météo est correcte (il pleut, il pleut en ce mois de mars 2026)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le barre de progression du wifi étant verte et le symbole &amp;quot;Temp&amp;quot; en bleu je suppose que cet écran est RGB. (Chercher le rouge)&lt;br /&gt;
&lt;br /&gt;
== Recherche de documentation ==&lt;br /&gt;
Le bidule acheté 9€ sur Aliexpress est livré avec.... 8 entretoises 8 vis une façade trouée pour l&#039;écran et un bout de plastique noir pour le fond. Mais .... Aucune doc.&lt;br /&gt;
&lt;br /&gt;
Pas grave y&#039;a Google et Gemini.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai trouvé :&lt;br /&gt;
&lt;br /&gt;
https://www.elektroda.com/news/news4091334.html  où un certain p.kaczmarek2 détaille tout le process d&#039;utilisation.&lt;br /&gt;
&lt;br /&gt;
https://spotpear.com/wiki/ESP32-C3-desktop-trinket-Mini-TV-Portable-Pendant-LVGL-1.44inch-LCD-ST7735.html le site du fabricant.&lt;br /&gt;
&lt;br /&gt;
== Niveau Hardware ==&lt;br /&gt;
La carte est assez simple on y trouve :&lt;br /&gt;
&lt;br /&gt;
* Le joli écran de 1,44&amp;lt;nowiki&amp;gt;&#039;&#039; de 128x128 pixel  (on est loin du 300 ppp) utilisé en SPI (peut être possible en I2C). Pour les personnes normales utilisant le système métrique (le monde entier sauf les USA, le Libéria et la Birmanie je crois) 1.44&#039;&#039; ca fait 36,6 mm. La taille doit venir de ces unités exotiques où un pouce est divisé en 144 points. Je sais pas j&#039;ai pas l&#039;&amp;lt;/nowiki&amp;gt;habitude... Doit y avoir une logique.&lt;br /&gt;
* Une prise pour une batterie et un circuit de charge PL4054&lt;br /&gt;
* Un régulateur linéaire pour faire du 3.3 V CAT 6219 qui m&#039;a pas l&#039;aire d&#039;être tout jeune&lt;br /&gt;
* Un quartz 40 MHz&lt;br /&gt;
* Une petite mémoire flash de 128 Mbits (16b Mo) W25q128 &lt;br /&gt;
* 4 boutons poussoirs &lt;br /&gt;
** RESET (ou plutôt CHIP_EN) avec son petit circuit de reset automatique&lt;br /&gt;
** Un bouton BOOT cablé sur IO09&lt;br /&gt;
** Deux boutons (actifs bas) sur IO8 et I010&lt;br /&gt;
* Une led sur IO11&lt;br /&gt;
* Une LED qui, si je comprends le schéma électronique s&#039;allume quand le batterie se charge  &lt;br /&gt;
* Le port USB est relié au ESP32C3 qui doit savoir le gérer en natif (pas de FTDI ou autre)&lt;br /&gt;
* 5 GPIO accessibles sur 6 broches &lt;br /&gt;
** GPIO1&lt;br /&gt;
** GPIO6&lt;br /&gt;
** GPIO7&lt;br /&gt;
** GPIO20&lt;br /&gt;
** GPIO21&lt;br /&gt;
* Une broches de masse (coté GPIO)&lt;br /&gt;
* Une broche +5V et une +3.3V autour du port µUSB&lt;br /&gt;
&lt;br /&gt;
== Niveau developpement ==&lt;br /&gt;
Il faut installer un environnement correct. [[Poste de DEV ESP32 sur PI|C&#039;est détaillé ici]]. Avec un premier &amp;quot;hello world&amp;quot; qui fait clignoter une LED.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser l&#039;écran ===&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1941</id>
		<title>Poste de DEV ESP32 sur PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1941"/>
		<updated>2026-03-22T21:20:37Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Exemple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ttyACM0: USB ACM deviceUne fois n&#039;est pas coutume je vais utiliser un Raspberry PI en mode graphique. Un bel écran HDMI branché sur HDMI N°1.&lt;br /&gt;
&lt;br /&gt;
Une installation simple avec toutes les valeurs de bases et seulement un ou deux delta:&lt;br /&gt;
&lt;br /&gt;
* [[PackageKit|Suppression de l&#039;outil graphique PackageKit]] qui empèche les sudo apt install normeaux.&lt;br /&gt;
* Mettre a jour avec &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt full-upgrade&lt;br /&gt;
sudo apt install gnome-screenshot #C&#039;est pas necessaire mais pour enrichier ce wiki je mets ca sur tous mes postes de dev&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Passer Chromium en français pour pouvoir éditer ce site tranquilement.&lt;br /&gt;
&lt;br /&gt;
== Préparer le Raspberry Pi ==&lt;br /&gt;
Normalement c&#039;est inutile sur une installation par défaut mais au cas ou...&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install python3 python3-pip python3-venv git build-essential&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer Visual Studio Code (version ARM64/ARMHF) ==&lt;br /&gt;
Visual studio code n&#039;est pas dans les repo par défaut. Il fout faire toute le sequence suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install wget gpg # Pour moi sur une insall par défaut ça n&#039;a rien fait&lt;br /&gt;
# On télécharge la clé gpg de microsoft&lt;br /&gt;
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor &amp;gt; microsoft.gpg&lt;br /&gt;
# On installe cette clé&lt;br /&gt;
sudo install -o root -g root -m 644 microsoft.gpg /usr/share/keyrings/&lt;br /&gt;
# On ajoute une source pour apt&lt;br /&gt;
sudo sh -c &#039;echo &amp;quot;deb [arch=arm64 signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/code stable main&amp;quot; &amp;gt; /etc/apt/sources.list.d/vscode.list&#039;&lt;br /&gt;
# On synchronise&lt;br /&gt;
sudo apt update&lt;br /&gt;
# On installe (c&#039;est que ca fait le boulot)&lt;br /&gt;
sudo apt install code&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer PlatformIO dans VS Code ==&lt;br /&gt;
On ouvre Visual Studio Code sagement avec le menu &amp;quot;Framboise | Programmation | Visual Studio Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Aller dans &amp;quot;extension&amp;quot; : Icone [[Fichier:Visualstudiocode-extensions.png|sans_cadre|25x25px]]&lt;br /&gt;
&lt;br /&gt;
On recherche platformIO&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Et on installe. (Si ça demande si on y crois &amp;quot;Trust&amp;quot; on dit oui)&lt;br /&gt;
&lt;br /&gt;
Ça prend quelques minutes et ça affiche la page de garde PlatformIO.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home.png|sans_cadre|871x871px]]&lt;br /&gt;
&lt;br /&gt;
== Installer les toolchains ESP32 (automatique) ==&lt;br /&gt;
Il n&#039;y a rien a installer en tant que tel. Ça se fait à la création du projet. On passe donc à la suite.&lt;br /&gt;
&lt;br /&gt;
== Créer un projet ESP32 avec PlatformIO ==&lt;br /&gt;
Par défaut ca vas être créé dans (ça doit pouvoir se changer mais je sais pas encore faire):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/home/$USER/Documents/PlatformIO/Projects/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On clique sur l&#039;icône Platform IO dans la barre d&#039;icône de gauche: [[Fichier:Platform-io icon.png|sans_cadre|28x28px]]&lt;br /&gt;
&lt;br /&gt;
On attends un moment (surtout le première fois)...&lt;br /&gt;
&lt;br /&gt;
Et dans la fenêtre : PlatformIO:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io menu.png|sans_cadre|316x316px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur Create new Project.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home-2.png|sans_cadre|778x778px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur &amp;quot;+ New Project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Choisir la &amp;quot;carte&amp;quot;. ===&lt;br /&gt;
La il faut savoir quelle carte on a et surtout quelle est son interface.&lt;br /&gt;
&lt;br /&gt;
Si on branche la carte sur le PI et que l&#039;on examine dmesg.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.122196] usb 1-1.1: new full-speed USB device number 10 using xhci_hcd&lt;br /&gt;
[ 6757.217480] usb 1-1.1: New USB device found, idVendor=303a, idProduct=1001, bcdDevice= 1.01&lt;br /&gt;
[ 6757.217498] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[ 6757.217503] usb 1-1.1: Product: USB JTAG/serial debug unit&lt;br /&gt;
[ 6757.217508] usb 1-1.1: Manufacturer: Espressif&lt;br /&gt;
[ 6757.217512] usb 1-1.1: SerialNumber: AC:A7:04:83:55:70&lt;br /&gt;
[ 6757.226869] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;ai une interface en ttyACM0. J&#039;aurais pu avoir :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.226869] usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/syntaxhighlight&amp;gt;On choisit la carte en fonction de ça :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Type de carte&lt;br /&gt;
!dmesg&lt;br /&gt;
!carte&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitc-02&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitm-1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Doit y en avoir d&#039;autres&lt;br /&gt;
|...&lt;br /&gt;
|}&lt;br /&gt;
Donc pour moi :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio-board.png|sans_cadre|593x593px]]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps le framework Arduino c&#039;est plus simple.&lt;br /&gt;
&lt;br /&gt;
On clique sur Finish et on attends...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attention&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|44x44px]]&lt;br /&gt;
|Cette partie doit se faire &#039;&#039;connecté à internet&#039;&#039; la première fois puisque, comme vu plus haut, c&#039;est là que l&#039;on va chercher les éléments de la &#039;&#039;toolchain&#039;&#039; manquants.&lt;br /&gt;
|}&lt;br /&gt;
On a successivement les infos suivantes  :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32-rasp-02.png|sans_cadre|300x300px]] [[Fichier:ESP32-rasp-01.png|sans_cadre|296x296px]] [[Fichier:ESP32-rasp-03.png|sans_cadre]] [[Fichier:ESP32-rasp-04.png|sans_cadre|296x296px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A la fin (moi ca a pris 15 min mais je suis loin du Point D&#039;acces Wifi) on a un beau projet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Default-esp32-project.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le code de &amp;quot;main.cpp&amp;quot; est par défaut :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// put function declarations here:&lt;br /&gt;
int myFunction(int, int);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  int result = myFunction(2, 3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// put function definitions here:&lt;br /&gt;
int myFunction(int x, int y) {&lt;br /&gt;
  return x + y;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connectivité USB ==&lt;br /&gt;
En fonction de la carte (voir ci dessus) on a un &amp;quot;device&amp;quot; que le système crée au branchement :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
crw-rw----+ 1 root plugdev 166, 0 22 mars  18:49  /dev/ttyACM0  # C&#039;est mou cas&lt;br /&gt;
crw-rw----+ 1 root dialout 166, 0 22 mars  18:49  /dev/ttyUSB01 # Ca pourait être ça&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il faut vérifier que l&#039;utilisateur que vous utilisez pour le dev soit bien membre du groupe (&amp;lt;code&amp;gt;plugdev&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;dialout&amp;lt;/code&amp;gt;) &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
uid=.... gid=.... groupes=20(dialout),24(cdrom),29(audio),44(video),46(plugdev),60(games),100(users),102(netdev),986(gpio),992(render),996(input)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Moi je suis bien : &amp;lt;code&amp;gt;plugdev&amp;lt;/code&amp;gt; donc ça va marcher sinon un petit :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo usermod -aG dialout $USER&lt;br /&gt;
sudo usermod -aG plugdev $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et ça marche!&lt;br /&gt;
&lt;br /&gt;
== Compiler et flasher ==&lt;br /&gt;
On arrive au cœur du sujet!&lt;br /&gt;
&lt;br /&gt;
Moi j&#039;ai du modifier platformio.ini:&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
; PlatformIO Project Configuration File&lt;br /&gt;
;&lt;br /&gt;
;   Build options: build flags, source filter&lt;br /&gt;
;   Upload options: custom upload port, speed and extra flags&lt;br /&gt;
;   Library options: dependencies, extra library storages&lt;br /&gt;
;   Advanced options: extra scripting&lt;br /&gt;
;&lt;br /&gt;
; Please visit documentation for the other options and examples&lt;br /&gt;
; https://docs.platformio.org/page/projectconf.html&lt;br /&gt;
&lt;br /&gt;
[env:esp32-c3-devkitc-02]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = esp32-c3-devkitc-02&lt;br /&gt;
framework = arduino&lt;br /&gt;
upload_protocol = esptool&lt;br /&gt;
upload_port = /dev/ttyACM0&lt;br /&gt;
monitor_port = /dev/ttyACM0&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
debug_tool = custom&lt;br /&gt;
debug_server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On sauvegarde et ensuite, sur la petite barre du bas:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudio-lower-bar.png|sans_cadre|709x709px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur la coche pour compiler: Ce doit se terminer par un beau SUCCESS en vert.&lt;br /&gt;
&lt;br /&gt;
On clique ensuite sur le flèche (entre la coche et la poubelle) : On voit les logs de esptool :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Compressed 228800 bytes to 128556...&lt;br /&gt;
Writing at 0x00010000... (12 %)&lt;br /&gt;
Writing at 0x0001aa3d... (25 %)&lt;br /&gt;
Writing at 0x0002180e... (37 %)&lt;br /&gt;
Writing at 0x00027993... (50 %)&lt;br /&gt;
Writing at 0x0002df5c... (62 %)&lt;br /&gt;
Writing at 0x00033c3b... (75 %)&lt;br /&gt;
Writing at 0x0003b93d... (87 %)&lt;br /&gt;
Writing at 0x00042705... (100 %)&lt;br /&gt;
Wrote 228800 bytes (128556 compressed) at 0x00010000 in 0.8 seconds (effective 2163.5 kbit/s)...&lt;br /&gt;
Hash of data verified.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et aussi un beau SUCCESS en vert.&lt;br /&gt;
&lt;br /&gt;
C&#039;est fait on a flashé avec un beau programme... qui fait rien.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
Avec la carte  avec [[ESP32C3 avec écran spotear|écran et ESP32-C3]] j&#039;ai testé:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LED_PIN 11&lt;br /&gt;
#define PERIODE 500 // miliseconds&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  pinMode(LED_PIN,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
  digitalWrite(LED_PIN,true);&lt;br /&gt;
  delay (PERIODE/2);&lt;br /&gt;
  digitalWrite(LED_PIN,false);&lt;br /&gt;
  delay (PERIODE/2);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;Ca marche bien j&#039;ai la led à droit de la prise USB qui clignotte.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1940</id>
		<title>ESP32C3 avec écran spotear</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ESP32C3_avec_%C3%A9cran_spotear&amp;diff=1940"/>
		<updated>2026-03-22T21:18:18Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Appelé en français &amp;quot;Mini ornement de Bureau&amp;quot; voici le module ESP32 C3 équipé de son écran. Personnellement c&#039;est mon premier C3 donc mes débuts en RISC-V. Bon tant que je fais du C avec l&#039;IDE Arduino ca devrait pas trop se voir.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget.png|vignette|220x220px]]&lt;br /&gt;
&lt;br /&gt;
== Premier contact ==&lt;br /&gt;
Apres avoir joué au petit mécano pour monter le bidule. On le branche sur une alim USB (micro USB le design ne date pas d&#039;hier).&lt;br /&gt;
&lt;br /&gt;
On le branche et il affiche un message (assez moche en vérité) indiquant de configurer son &amp;quot;mobile WLAN&amp;quot; avec les paramètres :&lt;br /&gt;
&lt;br /&gt;
SSID : spotpear (c&#039;est le fabricant)&lt;br /&gt;
&lt;br /&gt;
WIFI Key : 12345678&lt;br /&gt;
&lt;br /&gt;
On peut pas plus sûr comme mot de passe !&lt;br /&gt;
&lt;br /&gt;
Le message du dessous me parait me parait assez ésotérique. Ca sent la traduction du chinois fait pas une IA poussive.&lt;br /&gt;
[[Fichier:ESC32C3-desktop-gadget+wifi.png|gauche|vignette|215x215px]]&lt;br /&gt;
Je configure un routeur avec ces paramètres et je rebranche le bigonx.&lt;br /&gt;
&lt;br /&gt;
Une belle barre de progression s&#039;affiche et ensuite un superbe écran!&lt;br /&gt;
&lt;br /&gt;
Que c&#039;est beau!&lt;br /&gt;
&lt;br /&gt;
A première vue:&lt;br /&gt;
&lt;br /&gt;
* L&#039;écran est très correct. Lumineux et lisible.&lt;br /&gt;
* &amp;lt;u&amp;gt;Pour le mini firmware:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* L&#039;heure locale est juste. Il sait se mètre à l&#039;heure et détecte correctement le fuseau horaire et l&#039;heure été/hiver&lt;br /&gt;
&lt;br /&gt;
* La date est bonne&lt;br /&gt;
* La localisation à Clichy est fausse (on est a Paris aujourd&#039;hui)&lt;br /&gt;
* La température semble correcte le service météo est juste en revanche le fait d&#039;afficher en °F alors qu&#039;on est a Clichy...Bof bof.&lt;br /&gt;
* La météo est correcte (il pleut, il pleut en ce mois de mars 2026)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le barre de progression du wifi étant verte et le symbole &amp;quot;Temp&amp;quot; en bleu je suppose que cet écran est RGB. (Chercher le rouge)&lt;br /&gt;
&lt;br /&gt;
== Recherche de documentation ==&lt;br /&gt;
Le bidule acheté 9€ sur Aliexpress est livré avec.... 8 entretoises 8 vis une façade trouée pour l&#039;écran et un bout de plastique noir pour le fond. Mais .... Aucune doc.&lt;br /&gt;
&lt;br /&gt;
Pas grave y&#039;a Google et Gemini.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai trouvé :&lt;br /&gt;
&lt;br /&gt;
https://www.elektroda.com/news/news4091334.html  où un certain p.kaczmarek2 détaille tout le process d&#039;utilisation.&lt;br /&gt;
&lt;br /&gt;
https://spotpear.com/wiki/ESP32-C3-desktop-trinket-Mini-TV-Portable-Pendant-LVGL-1.44inch-LCD-ST7735.html le site du fabricant.&lt;br /&gt;
&lt;br /&gt;
== Niveau Hardware ==&lt;br /&gt;
La carte est assez simple on y trouve :&lt;br /&gt;
&lt;br /&gt;
* Le joli écran de 1,44&amp;lt;nowiki&amp;gt;&#039;&#039; de 128x128 pixel  (on est loin du 300 ppp) utilisé en SPI (peut être possible en I2C). Pour les personnes normales utilisant le système métrique (le monde entier sauf les USA, le Libéria et la Birmanie je crois) 1.44&#039;&#039; ca fait 36,6 mm. La taille doit venir de ces unités exotiques où un pouce est divisé en 144 points. Je sais pas j&#039;ai pas l&#039;&amp;lt;/nowiki&amp;gt;habitude... Doit y avoir une logique.&lt;br /&gt;
* Une prise pour une batterie et un circuit de charge PL4054&lt;br /&gt;
* Un régulateur linéaire pour faire du 3.3 V CAT 6219 qui m&#039;a pas l&#039;aire d&#039;être tout jeune&lt;br /&gt;
* Un quartz 40 MHz&lt;br /&gt;
* Une petite mémoire flash de 128 Mbits (16b Mo) W25q128 &lt;br /&gt;
* 4 boutons poussoirs &lt;br /&gt;
** RESET (ou plutôt CHIP_EN) avec son petit circuit de reset automatique&lt;br /&gt;
** Un bouton BOOT cablé sur IO09&lt;br /&gt;
** Deux boutons (actifs bas) sur IO8 et I010&lt;br /&gt;
* Une led sur IO11&lt;br /&gt;
* Une LED qui, si je comprends le schéma électronique s&#039;allume quand le batterie se charge  &lt;br /&gt;
* Le port USB est relié au ESP32C3 qui doit savoir le gérer en natif (pas de FTDI ou autre)&lt;br /&gt;
* 5 GPIO accessibles sur 6 broches &lt;br /&gt;
** GPIO1&lt;br /&gt;
** GPIO6&lt;br /&gt;
** GPIO7&lt;br /&gt;
** GPIO20&lt;br /&gt;
** GPIO21&lt;br /&gt;
* Une broches de masse (coté GPIO)&lt;br /&gt;
* Une broche +5V et une +3.3V autour du port µUSB&lt;br /&gt;
&lt;br /&gt;
== Niveau developpement ==&lt;br /&gt;
Il faut installer un environnement correct. [[Poste de DEV ESP32 sur PI|C&#039;est détaillé ici]]. Avec un premier &amp;quot;hello world&amp;quot; qui fait clignoter une LED.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1939</id>
		<title>Poste de DEV ESP32 sur PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1939"/>
		<updated>2026-03-22T21:15:31Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ttyACM0: USB ACM deviceUne fois n&#039;est pas coutume je vais utiliser un Raspberry PI en mode graphique. Un bel écran HDMI branché sur HDMI N°1.&lt;br /&gt;
&lt;br /&gt;
Une installation simple avec toutes les valeurs de bases et seulement un ou deux delta:&lt;br /&gt;
&lt;br /&gt;
* [[PackageKit|Suppression de l&#039;outil graphique PackageKit]] qui empèche les sudo apt install normeaux.&lt;br /&gt;
* Mettre a jour avec &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt full-upgrade&lt;br /&gt;
sudo apt install gnome-screenshot #C&#039;est pas necessaire mais pour enrichier ce wiki je mets ca sur tous mes postes de dev&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Passer Chromium en français pour pouvoir éditer ce site tranquilement.&lt;br /&gt;
&lt;br /&gt;
== Préparer le Raspberry Pi ==&lt;br /&gt;
Normalement c&#039;est inutile sur une installation par défaut mais au cas ou...&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install python3 python3-pip python3-venv git build-essential&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer Visual Studio Code (version ARM64/ARMHF) ==&lt;br /&gt;
Visual studio code n&#039;est pas dans les repo par défaut. Il fout faire toute le sequence suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install wget gpg # Pour moi sur une insall par défaut ça n&#039;a rien fait&lt;br /&gt;
# On télécharge la clé gpg de microsoft&lt;br /&gt;
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor &amp;gt; microsoft.gpg&lt;br /&gt;
# On installe cette clé&lt;br /&gt;
sudo install -o root -g root -m 644 microsoft.gpg /usr/share/keyrings/&lt;br /&gt;
# On ajoute une source pour apt&lt;br /&gt;
sudo sh -c &#039;echo &amp;quot;deb [arch=arm64 signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/code stable main&amp;quot; &amp;gt; /etc/apt/sources.list.d/vscode.list&#039;&lt;br /&gt;
# On synchronise&lt;br /&gt;
sudo apt update&lt;br /&gt;
# On installe (c&#039;est que ca fait le boulot)&lt;br /&gt;
sudo apt install code&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer PlatformIO dans VS Code ==&lt;br /&gt;
On ouvre Visual Studio Code sagement avec le menu &amp;quot;Framboise | Programmation | Visual Studio Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Aller dans &amp;quot;extension&amp;quot; : Icone [[Fichier:Visualstudiocode-extensions.png|sans_cadre|25x25px]]&lt;br /&gt;
&lt;br /&gt;
On recherche platformIO&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Et on installe. (Si ça demande si on y crois &amp;quot;Trust&amp;quot; on dit oui)&lt;br /&gt;
&lt;br /&gt;
Ça prend quelques minutes et ça affiche la page de garde PlatformIO.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home.png|sans_cadre|871x871px]]&lt;br /&gt;
&lt;br /&gt;
== Installer les toolchains ESP32 (automatique) ==&lt;br /&gt;
Il n&#039;y a rien a installer en tant que tel. Ça se fait à la création du projet. On passe donc à la suite.&lt;br /&gt;
&lt;br /&gt;
== Créer un projet ESP32 avec PlatformIO ==&lt;br /&gt;
Par défaut ca vas être créé dans (ça doit pouvoir se changer mais je sais pas encore faire):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/home/$USER/Documents/PlatformIO/Projects/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On clique sur l&#039;icône Platform IO dans la barre d&#039;icône de gauche: [[Fichier:Platform-io icon.png|sans_cadre|28x28px]]&lt;br /&gt;
&lt;br /&gt;
On attends un moment (surtout le première fois)...&lt;br /&gt;
&lt;br /&gt;
Et dans la fenêtre : PlatformIO:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io menu.png|sans_cadre|316x316px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur Create new Project.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home-2.png|sans_cadre|778x778px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur &amp;quot;+ New Project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Choisir la &amp;quot;carte&amp;quot;. ===&lt;br /&gt;
La il faut savoir quelle carte on a et surtout quelle est son interface.&lt;br /&gt;
&lt;br /&gt;
Si on branche la carte sur le PI et que l&#039;on examine dmesg.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.122196] usb 1-1.1: new full-speed USB device number 10 using xhci_hcd&lt;br /&gt;
[ 6757.217480] usb 1-1.1: New USB device found, idVendor=303a, idProduct=1001, bcdDevice= 1.01&lt;br /&gt;
[ 6757.217498] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[ 6757.217503] usb 1-1.1: Product: USB JTAG/serial debug unit&lt;br /&gt;
[ 6757.217508] usb 1-1.1: Manufacturer: Espressif&lt;br /&gt;
[ 6757.217512] usb 1-1.1: SerialNumber: AC:A7:04:83:55:70&lt;br /&gt;
[ 6757.226869] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;ai une interface en ttyACM0. J&#039;aurais pu avoir :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.226869] usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/syntaxhighlight&amp;gt;On choisit la carte en fonction de ça :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Type de carte&lt;br /&gt;
!dmesg&lt;br /&gt;
!carte&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitc-02&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitm-1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Doit y en avoir d&#039;autres&lt;br /&gt;
|...&lt;br /&gt;
|}&lt;br /&gt;
Donc pour moi :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio-board.png|sans_cadre|593x593px]]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps le framework Arduino c&#039;est plus simple.&lt;br /&gt;
&lt;br /&gt;
On clique sur Finish et on attends...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attention&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|44x44px]]&lt;br /&gt;
|Cette partie doit se faire &#039;&#039;connecté à internet&#039;&#039; la première fois puisque, comme vu plus haut, c&#039;est là que l&#039;on va chercher les éléments de la &#039;&#039;toolchain&#039;&#039; manquants.&lt;br /&gt;
|}&lt;br /&gt;
On a successivement les infos suivantes  :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32-rasp-02.png|sans_cadre|300x300px]] [[Fichier:ESP32-rasp-01.png|sans_cadre|296x296px]] [[Fichier:ESP32-rasp-03.png|sans_cadre]] [[Fichier:ESP32-rasp-04.png|sans_cadre|296x296px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A la fin (moi ca a pris 15 min mais je suis loin du Point D&#039;acces Wifi) on a un beau projet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Default-esp32-project.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le code de &amp;quot;main.cpp&amp;quot; est par défaut :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// put function declarations here:&lt;br /&gt;
int myFunction(int, int);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  int result = myFunction(2, 3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// put function definitions here:&lt;br /&gt;
int myFunction(int x, int y) {&lt;br /&gt;
  return x + y;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connectivité USB ==&lt;br /&gt;
En fonction de la carte (voir ci dessus) on a un &amp;quot;device&amp;quot; que le système crée au branchement :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
crw-rw----+ 1 root plugdev 166, 0 22 mars  18:49  /dev/ttyACM0  # C&#039;est mou cas&lt;br /&gt;
crw-rw----+ 1 root dialout 166, 0 22 mars  18:49  /dev/ttyUSB01 # Ca pourait être ça&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il faut vérifier que l&#039;utilisateur que vous utilisez pour le dev soit bien membre du groupe (&amp;lt;code&amp;gt;plugdev&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;dialout&amp;lt;/code&amp;gt;) &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
uid=.... gid=.... groupes=20(dialout),24(cdrom),29(audio),44(video),46(plugdev),60(games),100(users),102(netdev),986(gpio),992(render),996(input)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Moi je suis bien : &amp;lt;code&amp;gt;plugdev&amp;lt;/code&amp;gt; donc ça va marcher sinon un petit :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo usermod -aG dialout $USER&lt;br /&gt;
sudo usermod -aG plugdev $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et ça marche!&lt;br /&gt;
&lt;br /&gt;
== Compiler et flasher ==&lt;br /&gt;
On arrive au cœur du sujet!&lt;br /&gt;
&lt;br /&gt;
Moi j&#039;ai du modifier platformio.ini:&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
; PlatformIO Project Configuration File&lt;br /&gt;
;&lt;br /&gt;
;   Build options: build flags, source filter&lt;br /&gt;
;   Upload options: custom upload port, speed and extra flags&lt;br /&gt;
;   Library options: dependencies, extra library storages&lt;br /&gt;
;   Advanced options: extra scripting&lt;br /&gt;
;&lt;br /&gt;
; Please visit documentation for the other options and examples&lt;br /&gt;
; https://docs.platformio.org/page/projectconf.html&lt;br /&gt;
&lt;br /&gt;
[env:esp32-c3-devkitc-02]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = esp32-c3-devkitc-02&lt;br /&gt;
framework = arduino&lt;br /&gt;
upload_protocol = esptool&lt;br /&gt;
upload_port = /dev/ttyACM0&lt;br /&gt;
monitor_port = /dev/ttyACM0&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
debug_tool = custom&lt;br /&gt;
debug_server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On sauvegarde et ensuite, sur la petite barre du bas:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudio-lower-bar.png|sans_cadre|709x709px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur la coche pour compiler: Ce doit se terminer par un beau SUCCESS en vert.&lt;br /&gt;
&lt;br /&gt;
On clique ensuite sur le flèche (entre la coche et la poubelle) : On voit les logs de esptool :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Compressed 228800 bytes to 128556...&lt;br /&gt;
Writing at 0x00010000... (12 %)&lt;br /&gt;
Writing at 0x0001aa3d... (25 %)&lt;br /&gt;
Writing at 0x0002180e... (37 %)&lt;br /&gt;
Writing at 0x00027993... (50 %)&lt;br /&gt;
Writing at 0x0002df5c... (62 %)&lt;br /&gt;
Writing at 0x00033c3b... (75 %)&lt;br /&gt;
Writing at 0x0003b93d... (87 %)&lt;br /&gt;
Writing at 0x00042705... (100 %)&lt;br /&gt;
Wrote 228800 bytes (128556 compressed) at 0x00010000 in 0.8 seconds (effective 2163.5 kbit/s)...&lt;br /&gt;
Hash of data verified.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et aussi un beau SUCCESS en vert.&lt;br /&gt;
&lt;br /&gt;
C&#039;est fait on a flashé avec un beau programme... qui fait rien.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
Avec la carte  avec [[ESP32C3 avec écran spotear|écran et ESP32-C3]] j&#039;ai testé:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// put function declarations here:&lt;br /&gt;
int myFunction(int, int);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  pinMode(11,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
  digitalWrite(11,true);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(11,false);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche bien j&#039;ai la led à droit de la prise USB qui clignotte.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1938</id>
		<title>Poste de DEV ESP32 sur PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1938"/>
		<updated>2026-03-22T18:32:28Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ttyACM0: USB ACM deviceUne fois n&#039;est pas coutume je vais utiliser un Raspberry PI en mode graphique. Un bel écran HDMI branché sur HDMI N°1.&lt;br /&gt;
&lt;br /&gt;
Une installation simple avec toutes les valeurs de bases et seulement un ou deux delta:&lt;br /&gt;
&lt;br /&gt;
* [[PackageKit|Suppression de l&#039;outil graphique PackageKit]] qui empèche les sudo apt install normeaux.&lt;br /&gt;
* Mettre a jour avec &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt full-upgrade&lt;br /&gt;
sudo apt install gnome-screenshot #C&#039;est pas necessaire mais pour enrichier ce wiki je mets ca sur tous mes postes de dev&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Passer Chromium en français pour pouvoir éditer ce site tranquilement.&lt;br /&gt;
&lt;br /&gt;
== Préparer le Raspberry Pi ==&lt;br /&gt;
Normalement c&#039;est inutile sur une installation par défaut mais au cas ou...&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install python3 python3-pip python3-venv git build-essential&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer Visual Studio Code (version ARM64/ARMHF) ==&lt;br /&gt;
Visual studio code n&#039;est pas dans les repo par défaut. Il fout faire toute le sequence suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install wget gpg # Pour moi sur une insall par défaut ça n&#039;a rien fait&lt;br /&gt;
# On télécharge la clé gpg de microsoft&lt;br /&gt;
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor &amp;gt; microsoft.gpg&lt;br /&gt;
# On installe cette clé&lt;br /&gt;
sudo install -o root -g root -m 644 microsoft.gpg /usr/share/keyrings/&lt;br /&gt;
# On ajoute une source pour apt&lt;br /&gt;
sudo sh -c &#039;echo &amp;quot;deb [arch=arm64 signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/code stable main&amp;quot; &amp;gt; /etc/apt/sources.list.d/vscode.list&#039;&lt;br /&gt;
# On synchronise&lt;br /&gt;
sudo apt update&lt;br /&gt;
# On installe (c&#039;est que ca fait le boulot)&lt;br /&gt;
sudo apt install code&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer PlatformIO dans VS Code ==&lt;br /&gt;
On ouvre Visual Studio Code sagement avec le menu &amp;quot;Framboise | Programmation | Visual Studio Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Aller dans &amp;quot;extension&amp;quot; : Icone [[Fichier:Visualstudiocode-extensions.png|sans_cadre|25x25px]]&lt;br /&gt;
&lt;br /&gt;
On recherche platformIO&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Et on installe. (Si ça demande si on y crois &amp;quot;Trust&amp;quot; on dit oui)&lt;br /&gt;
&lt;br /&gt;
Ça prend quelques minutes et ça affiche la page de garde PlatformIO.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home.png|sans_cadre|871x871px]]&lt;br /&gt;
&lt;br /&gt;
== Installer les toolchains ESP32 (automatique) ==&lt;br /&gt;
Il n&#039;y a rien a installer en tant que tel. Ça se fait à la création du projet. On passe donc à la suite.&lt;br /&gt;
&lt;br /&gt;
== Créer un projet ESP32 avec PlatformIO ==&lt;br /&gt;
Par défaut ca vas être créé dans (ça doit pouvoir se changer mais je sais pas encore faire):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/home/$USER/Documents/PlatformIO/Projects/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On clique sur l&#039;icône Platform IO dans la barre d&#039;icône de gauche: [[Fichier:Platform-io icon.png|sans_cadre|28x28px]]&lt;br /&gt;
&lt;br /&gt;
On attends un moment (surtout le première fois)...&lt;br /&gt;
&lt;br /&gt;
Et dans la fenêtre : PlatformIO:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io menu.png|sans_cadre|316x316px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur Create new Project.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home-2.png|sans_cadre|778x778px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur &amp;quot;+ New Project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Choisir la &amp;quot;carte&amp;quot;. ===&lt;br /&gt;
La il faut savoir quelle carte on a et surtout quelle est son interface.&lt;br /&gt;
&lt;br /&gt;
Si on branche la carte sur le PI et que l&#039;on examine dmesg.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.122196] usb 1-1.1: new full-speed USB device number 10 using xhci_hcd&lt;br /&gt;
[ 6757.217480] usb 1-1.1: New USB device found, idVendor=303a, idProduct=1001, bcdDevice= 1.01&lt;br /&gt;
[ 6757.217498] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[ 6757.217503] usb 1-1.1: Product: USB JTAG/serial debug unit&lt;br /&gt;
[ 6757.217508] usb 1-1.1: Manufacturer: Espressif&lt;br /&gt;
[ 6757.217512] usb 1-1.1: SerialNumber: AC:A7:04:83:55:70&lt;br /&gt;
[ 6757.226869] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;ai une interface en ttyACM0. J&#039;aurais pu avoir :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.226869] usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/syntaxhighlight&amp;gt;On choisit la carte en fonction de ça :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Type de carte&lt;br /&gt;
!dmesg&lt;br /&gt;
!carte&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitc-02&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitm-1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Doit y en avoir d&#039;autres&lt;br /&gt;
|...&lt;br /&gt;
|}&lt;br /&gt;
Donc pour moi :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio-board.png|sans_cadre|593x593px]]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps le framework Arduino c&#039;est plus simple.&lt;br /&gt;
&lt;br /&gt;
On clique sur Finish et on attends...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attention&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|44x44px]]&lt;br /&gt;
|Cette partie doit se faire &#039;&#039;connecté à internet&#039;&#039; la première fois puisque, comme vu plus haut, c&#039;est là que l&#039;on va chercher les éléments de la &#039;&#039;toolchain&#039;&#039; manquants.&lt;br /&gt;
|}&lt;br /&gt;
On a successivement les infos suivantes  :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32-rasp-02.png|sans_cadre|300x300px]] [[Fichier:ESP32-rasp-01.png|sans_cadre|296x296px]] [[Fichier:ESP32-rasp-03.png|sans_cadre]] [[Fichier:ESP32-rasp-04.png|sans_cadre|296x296px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A la fin (moi ca a pris 15 min mais je suis loin du Point D&#039;acces Wifi) on a un beau projet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Default-esp32-project.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le code de &amp;quot;main.cpp&amp;quot; est par défaut :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// put function declarations here:&lt;br /&gt;
int myFunction(int, int);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  int result = myFunction(2, 3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// put function definitions here:&lt;br /&gt;
int myFunction(int x, int y) {&lt;br /&gt;
  return x + y;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connectivité USB ==&lt;br /&gt;
En fonction de la carte (voir ci dessus) on a un &amp;quot;device&amp;quot; que le système crée au branchement :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
crw-rw----+ 1 root plugdev 166, 0 22 mars  18:49  /dev/ttyACM0  # C&#039;est mou cas&lt;br /&gt;
crw-rw----+ 1 root dialout 166, 0 22 mars  18:49  /dev/ttyUSB01 # Ca pourait être ça&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il faut vérifier que l&#039;utilisateur que vous utilisez pour le dev soit bien membre du groupe (&amp;lt;code&amp;gt;plugdev&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;dialout&amp;lt;/code&amp;gt;) &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
uid=.... gid=.... groupes=20(dialout),24(cdrom),29(audio),44(video),46(plugdev),60(games),100(users),102(netdev),986(gpio),992(render),996(input)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Moi je suis bien : &amp;lt;code&amp;gt;plugdev&amp;lt;/code&amp;gt; donc ça va marcher sinon un petit :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo usermod -aG dialout $USER&lt;br /&gt;
sudo usermod -aG plugdev $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et ça marche!&lt;br /&gt;
&lt;br /&gt;
== Compiler et flasher ==&lt;br /&gt;
On arrive au cœur du sujet!&lt;br /&gt;
&lt;br /&gt;
Moi j&#039;ai du modifier platformio.ini:&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
; PlatformIO Project Configuration File&lt;br /&gt;
;&lt;br /&gt;
;   Build options: build flags, source filter&lt;br /&gt;
;   Upload options: custom upload port, speed and extra flags&lt;br /&gt;
;   Library options: dependencies, extra library storages&lt;br /&gt;
;   Advanced options: extra scripting&lt;br /&gt;
;&lt;br /&gt;
; Please visit documentation for the other options and examples&lt;br /&gt;
; https://docs.platformio.org/page/projectconf.html&lt;br /&gt;
&lt;br /&gt;
[env:esp32-c3-devkitc-02]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = esp32-c3-devkitc-02&lt;br /&gt;
framework = arduino&lt;br /&gt;
upload_protocol = esptool&lt;br /&gt;
upload_port = /dev/ttyACM0&lt;br /&gt;
monitor_port = /dev/ttyACM0&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
debug_tool = custom&lt;br /&gt;
debug_server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On sauvegarde et ensuite, sur la petite barre du bas:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudio-lower-bar.png|sans_cadre|709x709px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur la coche pour compiler: Ce doit se terminer par un beau SUCCESS en vert.&lt;br /&gt;
&lt;br /&gt;
On clique ensuite sur le flèche (entre la coche et la poubelle) : On voit les logs de esptool :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Compressed 228800 bytes to 128556...&lt;br /&gt;
Writing at 0x00010000... (12 %)&lt;br /&gt;
Writing at 0x0001aa3d... (25 %)&lt;br /&gt;
Writing at 0x0002180e... (37 %)&lt;br /&gt;
Writing at 0x00027993... (50 %)&lt;br /&gt;
Writing at 0x0002df5c... (62 %)&lt;br /&gt;
Writing at 0x00033c3b... (75 %)&lt;br /&gt;
Writing at 0x0003b93d... (87 %)&lt;br /&gt;
Writing at 0x00042705... (100 %)&lt;br /&gt;
Wrote 228800 bytes (128556 compressed) at 0x00010000 in 0.8 seconds (effective 2163.5 kbit/s)...&lt;br /&gt;
Hash of data verified.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et aussi un beau SUCCESS en vert.&lt;br /&gt;
&lt;br /&gt;
C&#039;est fait on a flashé avec un beau programme... qui fait rien.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1937</id>
		<title>Poste de DEV ESP32 sur PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1937"/>
		<updated>2026-03-22T18:26:03Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ttyACM0: USB ACM deviceUne fois n&#039;est pas coutume je vais utiliser un Raspberry PI en mode graphique. Un bel écran HDMI branché sur HDMI N°1.&lt;br /&gt;
&lt;br /&gt;
Une installation simple avec toutes les valeurs de bases et seulement un ou deux delta:&lt;br /&gt;
&lt;br /&gt;
* [[PackageKit|Suppression de l&#039;outil graphique PackageKit]] qui empèche les sudo apt install normeaux.&lt;br /&gt;
* Mettre a jour avec &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt full-upgrade&lt;br /&gt;
sudo apt install gnome-screenshot #C&#039;est pas necessaire mais pour enrichier ce wiki je mets ca sur tous mes postes de dev&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Passer Chromium en français pour pouvoir éditer ce site tranquilement.&lt;br /&gt;
&lt;br /&gt;
== Préparer le Raspberry Pi ==&lt;br /&gt;
Normalement c&#039;est inutile sur une installation par défaut mais au cas ou...&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install python3 python3-pip python3-venv git build-essential&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer Visual Studio Code (version ARM64/ARMHF) ==&lt;br /&gt;
Visual studio code n&#039;est pas dans les repo par défaut. Il fout faire toute le sequence suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install wget gpg # Pour moi sur une insall par défaut ça n&#039;a rien fait&lt;br /&gt;
# On télécharge la clé gpg de microsoft&lt;br /&gt;
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor &amp;gt; microsoft.gpg&lt;br /&gt;
# On installe cette clé&lt;br /&gt;
sudo install -o root -g root -m 644 microsoft.gpg /usr/share/keyrings/&lt;br /&gt;
# On ajoute une source pour apt&lt;br /&gt;
sudo sh -c &#039;echo &amp;quot;deb [arch=arm64 signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/code stable main&amp;quot; &amp;gt; /etc/apt/sources.list.d/vscode.list&#039;&lt;br /&gt;
# On synchronise&lt;br /&gt;
sudo apt update&lt;br /&gt;
# On installe (c&#039;est que ca fait le boulot)&lt;br /&gt;
sudo apt install code&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer PlatformIO dans VS Code ==&lt;br /&gt;
On ouvre Visual Studio Code sagement avec le menu &amp;quot;Framboise | Programmation | Visual Studio Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Aller dans &amp;quot;extension&amp;quot; : Icone [[Fichier:Visualstudiocode-extensions.png|sans_cadre|25x25px]]&lt;br /&gt;
&lt;br /&gt;
On recherche platformIO&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Et on installe. (Si ça demande si on y crois &amp;quot;Trust&amp;quot; on dit oui)&lt;br /&gt;
&lt;br /&gt;
Ça prend quelques minutes et ça affiche la page de garde PlatformIO.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home.png|sans_cadre|871x871px]]&lt;br /&gt;
&lt;br /&gt;
== Installer les toolchains ESP32 (automatique) ==&lt;br /&gt;
Il n&#039;y a rien a installer en tant que tel. Ça se fait à la création du projet. On passe donc à la suite.&lt;br /&gt;
&lt;br /&gt;
== Créer un projet ESP32 avec PlatformIO ==&lt;br /&gt;
On clique sur l&#039;icône Platform IO dans la barre d&#039;icône de gauche: [[Fichier:Platform-io icon.png|sans_cadre|28x28px]]&lt;br /&gt;
&lt;br /&gt;
On attends un moment (surtout le première fois)...&lt;br /&gt;
&lt;br /&gt;
Et dans la fenêtre : PlatformIO:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io menu.png|sans_cadre|316x316px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur Create new Project.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home-2.png|sans_cadre|778x778px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur &amp;quot;+ New Project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Choisir la &amp;quot;carte&amp;quot;. ===&lt;br /&gt;
La il faut savoir quelle carte on a et surtout quelle est son interface.&lt;br /&gt;
&lt;br /&gt;
Si on branche la carte sur le PI et que l&#039;on examine dmesg.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.122196] usb 1-1.1: new full-speed USB device number 10 using xhci_hcd&lt;br /&gt;
[ 6757.217480] usb 1-1.1: New USB device found, idVendor=303a, idProduct=1001, bcdDevice= 1.01&lt;br /&gt;
[ 6757.217498] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[ 6757.217503] usb 1-1.1: Product: USB JTAG/serial debug unit&lt;br /&gt;
[ 6757.217508] usb 1-1.1: Manufacturer: Espressif&lt;br /&gt;
[ 6757.217512] usb 1-1.1: SerialNumber: AC:A7:04:83:55:70&lt;br /&gt;
[ 6757.226869] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;ai une interface en ttyACM0. J&#039;aurais pu avoir :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.226869] usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/syntaxhighlight&amp;gt;On choisit la carte en fonction de ça :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Type de carte&lt;br /&gt;
!dmesg&lt;br /&gt;
!carte&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitc-02&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitm-1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Doit y en avoir d&#039;autres&lt;br /&gt;
|...&lt;br /&gt;
|}&lt;br /&gt;
Donc pour moi :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio-board.png|sans_cadre|593x593px]]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps le framework Arduino c&#039;est plus simple.&lt;br /&gt;
&lt;br /&gt;
On clique sur Finish et on attends...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attention&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|44x44px]]&lt;br /&gt;
|Cette partie doit se faire &#039;&#039;connecté à internet&#039;&#039; la première fois puisque, comme vu plus haut, c&#039;est là que l&#039;on va chercher les éléments de la &#039;&#039;toolchain&#039;&#039; manquants.&lt;br /&gt;
|}&lt;br /&gt;
On a successivement les infos suivantes  :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32-rasp-02.png|sans_cadre|300x300px]] [[Fichier:ESP32-rasp-01.png|sans_cadre|296x296px]] [[Fichier:ESP32-rasp-03.png|sans_cadre]] [[Fichier:ESP32-rasp-04.png|sans_cadre|296x296px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A la fin (moi ca a pris 15 min mais je suis loin du Point D&#039;acces Wifi) on a un beau projet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Default-esp32-project.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le code de &amp;quot;main.cpp&amp;quot; est par défaut :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// put function declarations here:&lt;br /&gt;
int myFunction(int, int);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  int result = myFunction(2, 3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// put function definitions here:&lt;br /&gt;
int myFunction(int x, int y) {&lt;br /&gt;
  return x + y;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connectivité USB ==&lt;br /&gt;
En fonction de la carte (voir ci dessus) on a un &amp;quot;device&amp;quot; que le système crée au branchement :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
crw-rw----+ 1 root plugdev 166, 0 22 mars  18:49  /dev/ttyACM0  # C&#039;est mou cas&lt;br /&gt;
crw-rw----+ 1 root dialout 166, 0 22 mars  18:49  /dev/ttyUSB01 # Ca pourait être ça&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il faut vérifier que l&#039;utilisateur que vous utilisez pour le dev soit bien membre du groupe (&amp;lt;code&amp;gt;plugdev&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;dialout&amp;lt;/code&amp;gt;) &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
uid=.... gid=.... groupes=20(dialout),24(cdrom),29(audio),44(video),46(plugdev),60(games),100(users),102(netdev),986(gpio),992(render),996(input)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Moi je suis bien : &amp;lt;code&amp;gt;plugdev&amp;lt;/code&amp;gt; donc ça va marcher sinon un petit :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo usermod -aG dialout $USER&lt;br /&gt;
sudo usermod -aG plugdev $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et ça marche!&lt;br /&gt;
&lt;br /&gt;
== Compiler et flasher ==&lt;br /&gt;
On arrive au cœur du sujet!&lt;br /&gt;
&lt;br /&gt;
Moi j&#039;ai du modifier platformio.ini:&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
; PlatformIO Project Configuration File&lt;br /&gt;
;&lt;br /&gt;
;   Build options: build flags, source filter&lt;br /&gt;
;   Upload options: custom upload port, speed and extra flags&lt;br /&gt;
;   Library options: dependencies, extra library storages&lt;br /&gt;
;   Advanced options: extra scripting&lt;br /&gt;
;&lt;br /&gt;
; Please visit documentation for the other options and examples&lt;br /&gt;
; https://docs.platformio.org/page/projectconf.html&lt;br /&gt;
&lt;br /&gt;
[env:esp32-c3-devkitc-02]&lt;br /&gt;
platform = espressif32&lt;br /&gt;
board = esp32-c3-devkitc-02&lt;br /&gt;
framework = arduino&lt;br /&gt;
upload_protocol = esptool&lt;br /&gt;
upload_port = /dev/ttyACM0&lt;br /&gt;
monitor_port = /dev/ttyACM0&lt;br /&gt;
monitor_speed = 115200&lt;br /&gt;
debug_tool = custom&lt;br /&gt;
debug_server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On sauvegarde et ensuite, sur la petite barre du bas:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudio-lower-bar.png|sans_cadre|709x709px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur la coche pour compiler: Ce doit se terminer par un beau SUCCESS en vert.&lt;br /&gt;
&lt;br /&gt;
On clique ensuite sur le flèche (entre la coche et la poubelle) : On voit les logs de esptool :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Compressed 228800 bytes to 128556...&lt;br /&gt;
Writing at 0x00010000... (12 %)&lt;br /&gt;
Writing at 0x0001aa3d... (25 %)&lt;br /&gt;
Writing at 0x0002180e... (37 %)&lt;br /&gt;
Writing at 0x00027993... (50 %)&lt;br /&gt;
Writing at 0x0002df5c... (62 %)&lt;br /&gt;
Writing at 0x00033c3b... (75 %)&lt;br /&gt;
Writing at 0x0003b93d... (87 %)&lt;br /&gt;
Writing at 0x00042705... (100 %)&lt;br /&gt;
Wrote 228800 bytes (128556 compressed) at 0x00010000 in 0.8 seconds (effective 2163.5 kbit/s)...&lt;br /&gt;
Hash of data verified.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et aussi un beau SUCCESS en vert.&lt;br /&gt;
&lt;br /&gt;
C&#039;est fait on a flashé avec un beau programme... qui fait rien.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Visualstudio-lower-bar.png&amp;diff=1936</id>
		<title>Fichier:Visualstudio-lower-bar.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Visualstudio-lower-bar.png&amp;diff=1936"/>
		<updated>2026-03-22T18:22:45Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;bare du bas&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Default-esp32-project.png&amp;diff=1935</id>
		<title>Fichier:Default-esp32-project.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Default-esp32-project.png&amp;diff=1935"/>
		<updated>2026-03-22T17:50:23Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;projet&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ESP32-rasp-04.png&amp;diff=1934</id>
		<title>Fichier:ESP32-rasp-04.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ESP32-rasp-04.png&amp;diff=1934"/>
		<updated>2026-03-22T17:44:31Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;04&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ESP32-rasp-03.png&amp;diff=1933</id>
		<title>Fichier:ESP32-rasp-03.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ESP32-rasp-03.png&amp;diff=1933"/>
		<updated>2026-03-22T17:43:30Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;03&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ESP32-rasp-02.png&amp;diff=1932</id>
		<title>Fichier:ESP32-rasp-02.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ESP32-rasp-02.png&amp;diff=1932"/>
		<updated>2026-03-22T17:42:44Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;02&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ESP32-rasp-01.png&amp;diff=1931</id>
		<title>Fichier:ESP32-rasp-01.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ESP32-rasp-01.png&amp;diff=1931"/>
		<updated>2026-03-22T17:40:18Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;01&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1930</id>
		<title>Poste de DEV ESP32 sur PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1930"/>
		<updated>2026-03-22T17:37:48Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ttyACM0: USB ACM deviceUne fois n&#039;est pas coutume je vais utiliser un Raspberry PI en mode graphique. Un bel écran HDMI branché sur HDMI N°1.&lt;br /&gt;
&lt;br /&gt;
Une installation simple avec toutes les valeurs de bases et seulement un ou deux delta:&lt;br /&gt;
&lt;br /&gt;
* [[PackageKit|Suppression de l&#039;outil graphique PackageKit]] qui empèche les sudo apt install normeaux.&lt;br /&gt;
* Mettre a jour avec &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt full-upgrade&lt;br /&gt;
sudo apt install gnome-screenshot #C&#039;est pas necessaire mais pour enrichier ce wiki je mets ca sur tous mes postes de dev&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Passer Chromium en français pour pouvoir éditer ce site tranquilement.&lt;br /&gt;
&lt;br /&gt;
== Préparer le Raspberry Pi ==&lt;br /&gt;
Normalement c&#039;est inutile sur une installation par défaut mais au cas ou...&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install python3 python3-pip python3-venv git build-essential&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer Visual Studio Code (version ARM64/ARMHF) ==&lt;br /&gt;
Visual studio code n&#039;est pas dans les repo par défaut. Il fout faire toute le sequence suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install wget gpg # Pour moi sur une insall par défaut ça n&#039;a rien fait&lt;br /&gt;
# On télécharge la clé gpg de microsoft&lt;br /&gt;
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor &amp;gt; microsoft.gpg&lt;br /&gt;
# On installe cette clé&lt;br /&gt;
sudo install -o root -g root -m 644 microsoft.gpg /usr/share/keyrings/&lt;br /&gt;
# On ajoute une source pour apt&lt;br /&gt;
sudo sh -c &#039;echo &amp;quot;deb [arch=arm64 signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/code stable main&amp;quot; &amp;gt; /etc/apt/sources.list.d/vscode.list&#039;&lt;br /&gt;
# On synchronise&lt;br /&gt;
sudo apt update&lt;br /&gt;
# On installe (c&#039;est que ca fait le boulot)&lt;br /&gt;
sudo apt install code&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer PlatformIO dans VS Code ==&lt;br /&gt;
On ouvre Visual Studio Code sagement avec le menu &amp;quot;Framboise | Programmation | Visual Studio Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Aller dans &amp;quot;extension&amp;quot; : Icone [[Fichier:Visualstudiocode-extensions.png|sans_cadre|25x25px]]&lt;br /&gt;
&lt;br /&gt;
On recherche platformIO&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Et on installe. (Si ça demande si on y crois &amp;quot;Trust&amp;quot; on dit oui)&lt;br /&gt;
&lt;br /&gt;
Ça prend quelques minutes et ça affiche la page de garde PlatformIO.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home.png|sans_cadre|871x871px]]&lt;br /&gt;
&lt;br /&gt;
== Installer les toolchains ESP32 (automatique) ==&lt;br /&gt;
Il n&#039;y a rien a installer en tant que tel. Ça se fait à la création du projet. On passe donc à la suite.&lt;br /&gt;
&lt;br /&gt;
== Créer un projet ESP32 avec PlatformIO ==&lt;br /&gt;
On clique sur l&#039;icône Platform IO dans la barre d&#039;icône de gauche: [[Fichier:Platform-io icon.png|sans_cadre|28x28px]]&lt;br /&gt;
&lt;br /&gt;
On attends un moment (surtout le première fois)...&lt;br /&gt;
&lt;br /&gt;
Et dans la fenêtre : PlatformIO:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io menu.png|sans_cadre|316x316px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur Create new Project.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home-2.png|sans_cadre|778x778px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur &amp;quot;+ New Project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Choisir la &amp;quot;carte&amp;quot;. ===&lt;br /&gt;
La il faut savoir quelle carte on a et surtout quelle est son interface.&lt;br /&gt;
&lt;br /&gt;
Si on branche la carte sur le PI et que l&#039;on examine dmesg.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.122196] usb 1-1.1: new full-speed USB device number 10 using xhci_hcd&lt;br /&gt;
[ 6757.217480] usb 1-1.1: New USB device found, idVendor=303a, idProduct=1001, bcdDevice= 1.01&lt;br /&gt;
[ 6757.217498] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[ 6757.217503] usb 1-1.1: Product: USB JTAG/serial debug unit&lt;br /&gt;
[ 6757.217508] usb 1-1.1: Manufacturer: Espressif&lt;br /&gt;
[ 6757.217512] usb 1-1.1: SerialNumber: AC:A7:04:83:55:70&lt;br /&gt;
[ 6757.226869] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;ai une interface en ttyACM0. J&#039;aurais pu avoir :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.226869] usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/syntaxhighlight&amp;gt;On choisit la carte en fonction de ça :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Type de carte&lt;br /&gt;
!dmesg&lt;br /&gt;
!carte&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitc-02&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitm-1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Doit y en avoir d&#039;autres&lt;br /&gt;
|...&lt;br /&gt;
|}&lt;br /&gt;
Donc pour moi :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio-board.png|sans_cadre|593x593px]]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps le framework Arduino c&#039;est plus simple.&lt;br /&gt;
&lt;br /&gt;
On clique sur Finish et on attends...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attention&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|44x44px]]&lt;br /&gt;
|Cette partie doit se faire &#039;&#039;connecté à internet&#039;&#039; la première fois puisque, comme vu plus haut, c&#039;est là que l&#039;on va chercher les éléments de la &#039;&#039;toolchain&#039;&#039; manquants.&lt;br /&gt;
|}&lt;br /&gt;
On a successivement les infos suivantes sont :&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1929</id>
		<title>Poste de DEV ESP32 sur PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Poste_de_DEV_ESP32_sur_PI&amp;diff=1929"/>
		<updated>2026-03-22T17:25:22Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ttyACM0: USB ACM deviceUne fois n&#039;est pas coutume je vais utiliser un Raspberry PI en mode graphique. Un bel écran HDMI branché sur HDMI N°1.&lt;br /&gt;
&lt;br /&gt;
Une installation simple avec toutes les valeurs de bases et seulement un ou deux delta:&lt;br /&gt;
&lt;br /&gt;
* [[PackageKit|Suppression de l&#039;outil graphique PackageKit]] qui empèche les sudo apt install normeaux.&lt;br /&gt;
* Mettre a jour avec &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt full-upgrade&lt;br /&gt;
sudo apt install gnome-screenshot #C&#039;est pas necessaire mais pour enrichier ce wiki je mets ca sur tous mes postes de dev&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Passer Chromium en français pour pouvoir éditer ce site tranquilement.&lt;br /&gt;
&lt;br /&gt;
== Préparer le Raspberry Pi ==&lt;br /&gt;
Normalement c&#039;est inutile sur une installation par défaut mais au cas ou...&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install python3 python3-pip python3-venv git build-essential&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer Visual Studio Code (version ARM64/ARMHF) ==&lt;br /&gt;
Visual studio code n&#039;est pas dans les repo par défaut. Il fout faire toute le sequence suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install wget gpg # Pour moi sur une insall par défaut ça n&#039;a rien fait&lt;br /&gt;
# On télécharge la clé gpg de microsoft&lt;br /&gt;
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor &amp;gt; microsoft.gpg&lt;br /&gt;
# On installe cette clé&lt;br /&gt;
sudo install -o root -g root -m 644 microsoft.gpg /usr/share/keyrings/&lt;br /&gt;
# On ajoute une source pour apt&lt;br /&gt;
sudo sh -c &#039;echo &amp;quot;deb [arch=arm64 signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/code stable main&amp;quot; &amp;gt; /etc/apt/sources.list.d/vscode.list&#039;&lt;br /&gt;
# On synchronise&lt;br /&gt;
sudo apt update&lt;br /&gt;
# On installe (c&#039;est que ca fait le boulot)&lt;br /&gt;
sudo apt install code&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installer PlatformIO dans VS Code ==&lt;br /&gt;
On ouvre Visual Studio Code sagement avec le menu &amp;quot;Framboise | Programmation | Visual Studio Code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Aller dans &amp;quot;extension&amp;quot; : Icone [[Fichier:Visualstudiocode-extensions.png|sans_cadre|25x25px]]&lt;br /&gt;
&lt;br /&gt;
On recherche platformIO&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Et on installe. (Si ça demande si on y crois &amp;quot;Trust&amp;quot; on dit oui)&lt;br /&gt;
&lt;br /&gt;
Ça prend quelques minutes et ça affiche la page de garde PlatformIO.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home.png|sans_cadre|871x871px]]&lt;br /&gt;
&lt;br /&gt;
== Installer les toolchains ESP32 (automatique) ==&lt;br /&gt;
Il n&#039;y a rien a installer en tant que tel. Ça se fait à la création du projet. On passe donc à la suite.&lt;br /&gt;
&lt;br /&gt;
== Créer un projet ESP32 avec PlatformIO ==&lt;br /&gt;
On clique sur l&#039;icône Platform IO dans la barre d&#039;icône de gauche: [[Fichier:Platform-io icon.png|sans_cadre|28x28px]]&lt;br /&gt;
&lt;br /&gt;
On attends un moment (surtout le première fois)...&lt;br /&gt;
&lt;br /&gt;
Et dans la fenêtre : PlatformIO:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io menu.png|sans_cadre|316x316px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur Create new Project.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Platform-io home-2.png|sans_cadre|778x778px]]&lt;br /&gt;
&lt;br /&gt;
On clique sur &amp;quot;+ New Project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Choisir la &amp;quot;carte&amp;quot;. ===&lt;br /&gt;
La il faut savoir quelle carte on a et surtout quelle est son interface.&lt;br /&gt;
&lt;br /&gt;
Si on branche la carte sur le PI et que l&#039;on examine dmesg.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.122196] usb 1-1.1: new full-speed USB device number 10 using xhci_hcd&lt;br /&gt;
[ 6757.217480] usb 1-1.1: New USB device found, idVendor=303a, idProduct=1001, bcdDevice= 1.01&lt;br /&gt;
[ 6757.217498] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[ 6757.217503] usb 1-1.1: Product: USB JTAG/serial debug unit&lt;br /&gt;
[ 6757.217508] usb 1-1.1: Manufacturer: Espressif&lt;br /&gt;
[ 6757.217512] usb 1-1.1: SerialNumber: AC:A7:04:83:55:70&lt;br /&gt;
[ 6757.226869] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;ai une interface en ttyACM0. J&#039;aurais pu avoir :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;[ 6757.226869] usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/syntaxhighlight&amp;gt;On choisit la carte en fonction de ça :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Type de carte&lt;br /&gt;
!dmesg&lt;br /&gt;
!carte&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitc-02&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;usb 1-1.3: ch341-uart converter now attached to ttyUSB0&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;esp32-c3-devkitm-1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Doit y en avoir d&#039;autres&lt;br /&gt;
|...&lt;br /&gt;
|}&lt;br /&gt;
Donc pour moi :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Visualstudiocode-platformio-board.png|sans_cadre|593x593px]]&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps le framework Arduino c&#039;est plus simple.&lt;br /&gt;
&lt;br /&gt;
On clique sur Finish et on attends...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attention&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|44x44px]]&lt;br /&gt;
|Cette partie doit se faire &#039;&#039;connecté à internet&#039;&#039; la première fois puisque, comme vu plus haut, c&#039;est là que l&#039;on va chercher les éléments de la &#039;&#039;toolchain&#039;&#039; manquants.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Visualstudiocode-platformio-board.png&amp;diff=1928</id>
		<title>Fichier:Visualstudiocode-platformio-board.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Visualstudiocode-platformio-board.png&amp;diff=1928"/>
		<updated>2026-03-22T17:17:02Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;selection carte&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Platform-io_home-2.png&amp;diff=1927</id>
		<title>Fichier:Platform-io home-2.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Platform-io_home-2.png&amp;diff=1927"/>
		<updated>2026-03-22T16:57:03Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;project home&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
</feed>