USB analyzer MySensors

Bonsoir
Une demande de connaissance pour un afficheur LCD en liaison i2c

je cherche a visualisé sur un afficheur LCD les data de dialogue entre Domoticz et Mysensors.

le schéma de l’install

sur le site https://www.arduino.cc/en/Tutorial/LibraryExamples/LiquidCrystalSerialDisplay
un exemple de code “This example sketch accepts serial input from a host computer and displays it on the LCD”

une recopie de la partie gestion LCD (sans la partie GateWay de MySensors)

// include the library code:
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // initialize the serial communications:
  Serial.begin(9600);
}

void loop() {
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // wait a bit for the entire message to arrive
    delay(100);
    // clear the screen
    lcd.clear();
    // read all the available characters
    while (Serial.available() > 0) {
      // display each character to the LCD
      lcd.write(Serial.read());
    }
  }
}

l’afficheur me donne bien les data du bus Usb, mais toujours sur la même ligne >:(

Je cherche que chaque nouvelle trame de dialogue s’affiche sur la ligne suivante (incrémente)
et arriver a la 4eme ligne on retourne à la 1er ligne de l’afficheur.

j’ai testé aussi le croquis de https://gist.github.com/ravenlp/5794749
mais rien ne s’affiche.

//https://gist.github.com/ravenlp/5794749
Code Arduino simple utilisé pour afficher des données afficheur  LCD via une connexion série.
Idéal pour afficher la sortie d'un script (Node / Ruby / Pyhon etc) sur un joli écran lcd 

Modif pour LCD i2c


*/

  #include <Wire.h>   /* LCD i2c */
  #include <LiquidCrystal_I2C.h>

int counter = 0;

LiquidCrystal_I2C lcd(0x20,16,4); /*adresse i2c et type lcd */

void setup(){

  Serial.begin(115200);
  lcd.init(); /* init. lcd*/
  lcd.backlight();
  
}

void loop()
{
  if (Serial.available()) //only read when a character is available
  {
    char c = Serial.read();
    Serial.write(c);
    lcd.print(c);
    counter++;
  }
  if (counter == 16)
  {
    delay(100);
    lcd.setCursor(1, 2);
    lcd.print(" fin");
    counter = 0;
    lcd.setCursor(0, 0);
  }
}

un test aussi avec :

*/

  #include <Wire.h>   /* LCD i2c */
  #include <LiquidCrystal_I2C.h>

char c[33];

LiquidCrystal_I2C lcd(0x20,16,4); /*adresse i2c et type lcd */

void setup(){

  Serial.begin(115200);
  lcd.init(); /* init. lcd*/
  lcd.backlight();
  
}

void loop()
{
  // quand les caractères arrivent sur le port série ...
  if (Serial.available()) {
    
    delay(100); /*attendez un peu que tout le message arrive*/
   
    lcd.clear();   /* efface l'écran*/
   
    int i = 0;      /*lit tous les caractères disponibles*/
    while (Serial.available() > 0) {
      c[i++] = Serial.read();
      //lcd.write();
      //data  += Serial.read();
      
    }
    
   // Efface le reste
    for(; i < 33; i++){
      c[i] = ' ';
    }
    
    /// Imprimer la première ligne
    for( i = 0; i < 16; i++){
      lcd.write(c[i]);
    }
    
     // Imprimer la deuxième ligne
    lcd.setCursor(0,1);
    for( i = 16; i < 33; i++){
      lcd.write(byte(c[i]));
    }
  }
  delay(100);
}

bref je nage dans le potage.
un petit cours, une info, un lien sur de l’existant sur le sujet ???

Merci

la communication série est asynchrone.Quand vous faites cela

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // initialize the serial communications:
  Serial.begin(9600);
}

void loop() {
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // wait a bit for the entire message to arrive
    delay(100);
...

vous attendez 100ms après que le premier caractère soit dispo pour que le message arrive.

à 9600 bauds ça veut dire potentiellement attendre suffisamment pour recevoir 960 caractères. Le buffer d'entre n'en contient que 64... tout ce qui est en trop sera donc perdu.

ensuite quand vous faites

 while (Serial.available() > 0) {
      c[i++] = Serial.read();
      //lcd.write();
      //data  += Serial.read();
      
    }

vous videz le buffer super vite, plus vite que les caractères arrivent (s'il y en avait encore qui arrivaient) et donc available() va dire 0 et vous n'allez pas tout lire...

est-ce que les messages en question ont un marqueur de fin (genre '\n') ? si oui il suffit d'attendre patiemment en écoutant le port série jusqu'à ce marqueur de fin, puis d'afficher la ligne et de se préparer pour la suivante.

S'il n'y a pas de marqueur de fin c'est plus ennuyeux. Vous pouvez essayer de jouer sur un timeout -> vous jouez avec millis() et si vous ne recevez rien pendant x ms c'est que le message en cours est terminé et vous l'affichez

==> Si vous voulez étudier comment bien écouter le port série vous pouvez jeter un oeil à mon petit tuto sur le sujet

1 Like