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é