Bonsoir à tous,
Heureusement pour moi, la journée se termine sur une note beaucoup plus positive que la presque totalité de ma journée. J'ai en effet passé de nombreuses heures à tenter de faire fonctionner la réception sur un ESP32 sans jamais parvenir à quelque chose de fiable. L'ESP me renvoyant de nombreuses erreurs de lecture sur les interruptions renvoyant donc des valeurs erronées.
Jusqu'à ce que je me décide à passer sur un Raspberry Pi Pico. Et là, oh merveille, tout c'est mis à fonctionner parfaitement du premier coup !!!

Jusqu'ici je n'avais réalisé que quelques projets avec le Raspberry. Ayant un peu la flemme de changer ma façon de coder. Mais là, je vais revoir mon approche et chercher à systématiser le Raspberry, plus puissant, moins cher, disposant de plus de broches qu'un ESP32 et au final plus fiable.
Voici le code (de test) du récepteur qui ne cherche qu'à afficher la valeur transmise au travers de la led et du TSOP.
#include <Arduino.h>
#include "pico/multicore.h"
#include "pico/util/queue.h"
volatile uint32_t duration = 0;
constexpr byte pinIn = 15; // Broche du TSOP
bool receiving = false;
uint8_t currentByte = 0;
int8_t bitIndex = 7;
// File pour les bits détectés
queue_t durationQueue;
enum DecodeState {
IDLE,
RECEIVING
};
DecodeState currentState = IDLE;
void handleIR() {
static uint32_t lastTime = 0;
uint32_t now = micros();
uint32_t duration = now - lastTime;
lastTime = now;
queue_try_add(&durationQueue, &duration);
}
void setup() {
Serial.begin(115200);
pinMode(pinIn, INPUT);
// Initialisation de la queue pour 16 durées
queue_init(&durationQueue, sizeof(duration), 16);
attachInterrupt(digitalPinToInterrupt(pinIn), handleIR, RISING);
}
void loop() {
uint32_t duration = 0;
if (queue_try_remove(&durationQueue, &duration)) {
switch (currentState) {
case IDLE:
if (duration > 1600 && duration < 2400) {
// Début de trame détecté
currentByte = 0;
bitIndex = 7;
currentState = RECEIVING;
}
break;
case RECEIVING:
if (duration >= 400 && duration <= 700) {
// Bit 1
currentByte |= (1 << bitIndex);
bitIndex--;
} else if (duration >= 800 && duration <= 1200) {
// Bit 0
currentByte &= ~(1 << bitIndex);
bitIndex--;
} else {
// Durée invalide
currentState = IDLE;
break;
}
if (bitIndex < 0) {
Serial.printf("Octet reçu : 0x%02X\n", currentByte);
currentState = IDLE;
}
break;
}
}
}
Je n'ai aucune erreur et donc je ne pense pas nécessaire de mettre en place un mécanisme de contrôle. (checksum)
Je vais maintenant passer le code de l'emetteur sur un ATTiny (25/45/85) et dessiner des PCB pour toute la partie emission et réception. Je communiquerai les schémas dès que je les aurai réalisés.
Christophe