Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
|
wiki:tutoriels:arduino:evoyer_float_via_port_serie [2020/11/04 18:20] damien.muti [ARDUINO : COMMENT ENVOYER DES DONNÉES DE TYPE FLOAT, DOUBLE OU INT SUPÉRIEUR 255 VIA LE PORT SÉRIE] |
wiki:tutoriels:arduino:evoyer_float_via_port_serie [2021/06/16 08:50] (Version actuelle) damien.muti [Solution 2 : envoi des différents octets] |
||
|---|---|---|---|
| Ligne 25: | Ligne 25: | ||
| Ceci contraint fortement le dialogue entre la carte Arduino et le logiciel Processing car, dès lors, il n'est possible | Ceci contraint fortement le dialogue entre la carte Arduino et le logiciel Processing car, dès lors, il n'est possible | ||
| - | ==== Solution ==== | + | ==== Solution |
| Pour contourner ce problème, une des solution est de convertir le nombre (//float, int, long, double//, etc.) en une chaîne de caractère (// | Pour contourner ce problème, une des solution est de convertir le nombre (//float, int, long, double//, etc.) en une chaîne de caractère (// | ||
| Du coté de la réception sur l' | Du coté de la réception sur l' | ||
| - | ===== Mise en œuvre | + | Référence : |
| + | * [[https:// | ||
| + | |||
| + | ==== Solution 2 : envoi des différents octets | ||
| + | Une autre solution est d' | ||
| + | |||
| + | Du coté de la réception sur l' | ||
| + | |||
| + | ===== Application | ||
| ==== Montage ==== | ==== Montage ==== | ||
| On utilise un [[wiki: | On utilise un [[wiki: | ||
| Ligne 36: | Ligne 44: | ||
| {{ : | {{ : | ||
| - | + | ==== Solution 1 : envoi d'une String ==== | |
| - | ==== code Arduino | + | === code Arduino === |
| Le code Arduino est le suivant : | Le code Arduino est le suivant : | ||
| < | < | ||
| Ligne 58: | Ligne 66: | ||
| Le code est disponible sur le lien suivant : {{ : | Le code est disponible sur le lien suivant : {{ : | ||
| - | ==== code Processing | + | === code Processing === |
| Le code Processing est le suivant : | Le code Processing est le suivant : | ||
| Ligne 112: | Ligne 120: | ||
| Le code est disponible sur le lien suivant : {{ : | Le code est disponible sur le lien suivant : {{ : | ||
| + | |||
| + | ==== Solution 2 : envoi des différents octets ==== | ||
| + | |||
| + | Le projet global consiste à lancer un événement (vidéo, son, animation) lorsque la distance détectée est inférieure à un seuil, ou sur une certaine plage de distance. Ce programme est inspiré de celui effectué sur pour les [[wiki: | ||
| + | |||
| + | === code Arduino === | ||
| + | Le code Arduino est le suivant : {{ : | ||
| + | |||
| + | < | ||
| + | #include " | ||
| + | |||
| + | Ultrasonic ultrasonic(7); | ||
| + | int distance =354; | ||
| + | int inByte = 0; // incoming serial byte | ||
| + | // debug | ||
| + | boolean debug = false; | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(9600); | ||
| + | while (!Serial) { | ||
| + | ; // wait for serial port to connect. Needed for native USB port only | ||
| + | } | ||
| + | establishContact(); | ||
| + | |||
| + | // création du tableau d' | ||
| + | } | ||
| + | void loop() { | ||
| + | if (Serial.available() > 0) { | ||
| + | // get incoming byte: vider le port série | ||
| + | inByte = Serial.read(); | ||
| + | // lire la valeur de la distance | ||
| + | distance = ultrasonic.MeasureInCentimeters(); | ||
| + | // envoyer la distance sur la port série sous la forme d'une chaine de caractères | ||
| + | if (debug) { | ||
| + | Serial.print(" | ||
| + | Serial.print(distance);// | ||
| + | Serial.println(" | ||
| + | } | ||
| + | else { // envoie des données brutes : un int est sur 2 octets | ||
| + | Serial.write(0xFF & distance >> 8);// octet de poids fort | ||
| + | Serial.write(0xFF & distance);// | ||
| + | | ||
| + | | ||
| + | } | ||
| + | // | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void establishContact() { | ||
| + | while (Serial.available() <= 0) { | ||
| + | Serial.print(' | ||
| + | delay(300); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | === code Processing === | ||
| + | Le programme global correspondant à un [[wiki: | ||
| + | |||
| + | |||
| + | Nous ne présentons ici que la partie de réception des données par la méthode // | ||
| + | |||
| + | < | ||
| + | void serialEvent(Serial myPort) { | ||
| + | // read a byte from the serial port: | ||
| + | int inByte = myPort.read(); | ||
| + | // if this is the first byte received, and it's an A, | ||
| + | // clear the serial buffer and note that you've | ||
| + | // had first contact from the microcontroller. | ||
| + | // Otherwise, add the incoming byte to the array: | ||
| + | if (firstContact == false) { | ||
| + | if (inByte == ' | ||
| + | myPort.clear(); | ||
| + | firstContact = true; // you've had first contact from the microcontroller | ||
| + | myPort.write(' | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | // Add the latest byte from the serial port to array: | ||
| + | serialInArray[serialCount] = inByte; | ||
| + | serialCount++; | ||
| + | |||
| + | // If we have nbBytes=2 bytes: | ||
| + | if (serialCount > nbBytes-1 ) { | ||
| + | // concaténer les deux octets reçus | ||
| + | donneePortSerie = int(serialInArray[0] << 8) + int(serialInArray[1]) ; | ||
| + | | ||
| + | // print the values (for debugging purposes only): | ||
| + | // | ||
| + | println(" | ||
| + | |||
| + | // Send a capital A to request new sensor readings: | ||
| + | myPort.write(' | ||
| + | // Reset serialCount: | ||
| + | serialCount = 0; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||