Carte test à 3 chiffres pour HC-SR04 par port série (RX, TX)

Bonjour,

Auriez-vous un exemple de code source Arduino qui communique les données du module ultrason HC-SR04 par la carte d'extension avec affichage 3 chiffres par port série (RX, TX) pour traiter ces données avec une carte un Arduino Uno ou Arduino Méga ou une carte ESP-WROOM-32 à 38 broche ?

En référence :

C'est pour récupérer les données du capteur sur port série (RX, TX) et les traiter sur véhicule robot autonome à deux roues motrices avec carte Arduino Mega ou ESP-WROOM-32 38 broches.

Merci !

Cordialement,

Bon, par pseudohasard et curiosité, et parce que cela était proposé, j’ai fait ma première expérience de programmation par IA, celle du moteur de recherche Duck.com « duck.ai ».

Et en voici sa version pour 3 capteurs HC-SR04 sur carte Test communicant par port série (RX1, TX1, RX2, TX2, RX3, TX3) sur carte Arduino Mega 2560 v3 :

// Arduino Mega — lecture ASCII de 3 modules HC-SR04 UART et affichage A:DDD B:DDD C:DDD
const unsigned long VITESSE_MODULE = 9600;
const unsigned long VITESSE_SERIE = 115200;
const unsigned long INTERVALLE_AFFICHAGE_MS = 200;

String ligneA = "", ligneB = "", ligneC = "";
int derniereA = -1, derniereB = -1, derniereC = -1;
unsigned long dernierCycle = 0;

void setup() {
  Serial.println();
  Serial.println();
  Serial.println();
  Serial.begin(VITESSE_SERIE);
  Serial1.begin(VITESSE_MODULE);
  Serial2.begin(VITESSE_MODULE);
  Serial3.begin(VITESSE_MODULE);
  delay(100);
  Serial.println("Démarrage lecteur ASCII 3 colonnes");
  Serial.println();
  Serial.println();
  Serial.println();
}

void loop() {
  lireLignes(Serial1, ligneA, derniereA);
  lireLignes(Serial2, ligneB, derniereB);
  lireLignes(Serial3, ligneC, derniereC);

  if (millis() - dernierCycle >= INTERVALLE_AFFICHAGE_MS) {
    dernierCycle = millis();
    afficherTrois(derniereA, derniereB, derniereC);
  }
}

// Lit les octets entrants dans le buffer String ; à la fin de ligne (LF) on parse et on met à jour la valeur
void lireLignes(HardwareSerial &ser, String &tampon, int &derniereValeur) {
  while (ser.available()) {
    char c = ser.read();
    tampon += c;
    if (c == '\n') {
      int val = parseEntierDepuisLigne(tampon);
      if (val >= 0) derniereValeur = val;
      tampon = "";
    }
  }
}

// Extrait le premier entier trouvé dans la ligne ASCII et le renvoie (cm).
// Retourne -1 si aucun entier trouvé.
int parseEntierDepuisLigne(const String &s) {
  int len = s.length();
  int i = 0;
  while (i < len && !(estChiffre(s[i]) || (s[i] == '-' && i+1 < len && estChiffre(s[i+1])))) i++;
  if (i >= len) return -1;
  if (s[i] == '-') i++; // on ignore les valeurs négatives attendues
  long val = 0;
  bool trouve = false;
  while (i < len && estChiffre(s[i])) {
    trouve = true;
    val = val * 10 + (s[i] - '0');
    i++;
  }
  if (!trouve) return -1;
  if (val < 0) return -1;
  if (val > 999) val = 999;
  return (int)val; // si vos modules renvoient des mm, convertir ici: return (val+5)/10;
}

// Affiche une ligne unique au format A:DDD B:DDD C:DDD (--- si inconnu)
void afficherTrois(int a, int b, int c) {
  afficherCellule('A', a); Serial.print(' ');
  afficherCellule('B', b); Serial.print(' ');
  afficherCellule('C', c); Serial.println();
}

void afficherCellule(char etiquette, int v) {
  Serial.print(etiquette);
  Serial.print(':');
  if (v < 0) { Serial.print("---"); return; }
  if (v > 999) v = 999;
  char d1 = '0' + ((v / 100) % 10);
  char d2 = '0' + ((v / 10) % 10);
  char d3 = '0' + (v % 10);
  Serial.print(d1); Serial.print(d2); Serial.print(d3);
}

bool estChiffre(char c) { return c >= '0' && c <= '9'; }

Je suis heureux de constater que ma demande de francisation de tout le code source donne ce genre de résultat !

Cordialement,

L’ami René