Je lis les données de 9 capteurs différents pour mon robot et je dois les afficher toutes de manière stable dans la même fenêtre afin de pouvoir comparer les valeurs et voir si l'une des lectures est éteinte.
Le problème que je rencontre à la fois avec Serial.print et lcd.print est que les valeurs changent constamment et que je ne peux pas vraiment les regarder lorsque je déplace le robot.
Je pensais appeler quelque chose comme Serial.clear () avant d'afficher quoi que ce soit d'autre et cela ne ferait que maintenir les choses stables et au même endroit, ne modifiant que les valeurs.
D'après ce que j'ai trouvé jusqu'à présent, Serial.print (17, BYTE), par exemple, n'est plus pris en charge (appel de la touche Échap).
Alors ... pour ceux qui ont un peu plus d'expérience Arduino ... quelle est la bonne façon de faire cela?
Le moniteur série Arduino n'est pas un terminal standard, il n'est donc pas possible d'effacer l'écran à l'aide des commandes de terminal standard. Je suggère d'utiliser un émulateur de terminal réel, comme PuTTY .
La commande pour effacer l’écran d’un terminal est ESC [2J
Pour accomplir en code Arduino:
Serial.write(27); // ESC command
Serial.print("[2J"); // clear screen command
Serial.write(27);
Serial.print("[H"); // cursor to home command
Il n’ya aucun moyen d’effacer l’écran, mais un moyen très simple de simuler l’impression peut être d’imprimer autant de Serial.println();
que nécessaire pour conserver toutes les anciennes données en dehors de l’écran.
J'ai trouvé que ASCII 12 crée un Form Feed, c'est-à-dire une nouvelle page. voici une définition de wikipedia
"Le saut de page est un caractère de contrôle ASCII révolutionnaire. Il oblige l'imprimante À éjecter la page en cours et à continuer à imprimer en haut D'un autre"
Le code est
Serial.write(12);
Arduino Terminate ne prend pas en charge le caractère mais PuTTY un client telnet open source léger peut le faire.
Un exemple du code
void setup() {
Serial.begin(9600);//Initializase the serial transmiter speed
}
void loop() {
//Code tested with PuTTY terminal
Serial.write(12);//ASCII for a Form feed
Serial.println("This is the title of a new page");// your code
delay(500);//delay for visual
}
Tu pourrais essayer:
Serial.write(13);
Qui fournira un retour chariot, revenant au début de la ligne à chaque itération - qui devrait faire ce que vous cherchez? (Surtout si tout est largeur fixe).
Trouvé un moyen bêtement simple pour résoudre ce problème. Redimensionnez simplement la fenêtre du terminal sur une seule ligne et il sera beaucoup plus facile à lire!
ESC est le caractère _ 2 _ 7, pas _ 1 _ 7. Vous pouvez également essayer le nombre décimal 12 (alias. FF, formulaire de flux).
Notez que tous ces caractères spéciaux ne sont pas gérés par Arduino mais par le programme du côté récepteur. Ainsi, un terminal Unix standard (xterm, gnome-terminal, kterm, ...) gère un ensemble différent de séquences de contrôle, puis un programme de terminal Windows comme HTerm.
Par conséquent, vous devez spécifier le programme que vous utilisez exactement pour l'affichage. Après cela, il est possible de vous dire quels caractères de contrôle et quelles séquences de contrôle sont utilisables.
le meilleur moyen auquel je puisse penser est d’utiliser processing il y a quelques introductions sur le réseau comme afficher des données série , arduino graph et arduino radar
Depuis Arduino est basé sur le traitement de ce n'est pas si difficile à apprendre
Il n'est pas possible d'effacer la fenêtre Serial Monitor en fonction des données série entrantes.
Je peux penser à quelques options, la plus simple (et la plus délicate) consiste à utiliser println()
avec une chaîne de largeur fixe générée contenant les données de votre capteur.
La case à cocher Autoscroll
de Serial Monitor de l'IDE Arduino signifie que si vous envoyez de façon persistante la chaîne de largeur fixe (avec un délai de 500 ms peut-être), cela donnera l'impression qu'il est mis à jour une fois qu'il est arrivé au bas et commence à défiler. Vous pouvez également réduire la hauteur de la fenêtre pour donner l’impression qu’elle ne comporte qu’une seule ligne.
Pour réaliser une chaîne de largeur fixe adaptée à la fonction println()
de série__, vous aurez besoin de fonctions permettant de convertir les valeurs de vos capteurs en chaînes, ainsi que de les ajuster/réduire à une taille persistante. Puis concaténez les valeurs ensemble (y compris les séparateurs si cela facilite la lecture des données)
Une sortie de quelque chose de similaire à ceci est ce à quoi je fais allusion:
| 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 |
Tout bien considéré, ce n'est pas une bonne solution, mais cela vous donnerait un résultat.
Une idée beaucoup plus intelligente consiste à créer un autre programme en dehors d’Arduino et c’est IDE qui écoute le port com pour connaître les valeurs des capteurs envoyées par l’Arduino. Votre programme Arduino devra envoyer un message que votre programme externe pourra interpréter sans ambiguïté, quelque chose comme 1=0.5;
où 1 = ID du capteur et 0.5 = valeur du capteur. Le programme externe conserverait alors ces valeurs (1 pour chaque capteur). Le programme externe peut alors afficher ces informations de la manière que vous souhaitez, une sortie de console de Nice serait relativement facile à réaliser :-)
C#
a la classe serialport
de .NET
qui est un plaisir à utiliser. (la plupart du temps!)
Python a un module appelé pyserial
, qui est aussi très facile.
Si vous choisissez de procéder de cette manière, l’une ou l’autre langue vous permettra de mieux contrôler la sortie de la console.
Si vous changez par exemple le débit en bauds, la fenêtre Serial Monitor de la version 1.5.3 de Arduino IDE pour le développement Intel Galileo est effacée.
Un autre coup de pied à la canette:
void setup(){ /*123456789 123456789 123456789 123456789 123*/
String newRow="\n|________________________________________";
String scrSiz="\n|\n|\n|\n|\n|\n|\n|\n|\n|\t";
Serial.begin(115200);
// this baudrate should not have flicker but it does as seen when
// the persistence of vision threshold is insufficiently exceeded
// 115200 baud should display ~10000 cps or a char every 0.1 msec
// each 'for' loop iteration 'should' print 65 chars. in < 7 msec
// Serial.print() artifact inefficiencies are the flicker culprit
// unfortunately '\r' does not render in the IDE's Serial Monitor
Serial.print( scrSiz+"\n|_____ size screen vertically to fit _____" );
for(int i=0;i<30;i++){
delay(1000);
Serial.print((String)scrSiz +i +"\t" + (10*i) +newRow);}
}
void loop(){}
il y a longtemps que les données sont un peu déterminées, en tant que colonnes de données de variable variable et de modification
Imprimez toutes les données en ligne, de sorte que vous ayez des lignes avec les données dont vous avez besoin, je résous simplement le même problème, assurez-vous simplement que vous aviez une taille et un espacement de données constants entre les deux.
Serial.print("cuenta q2: ");
Serial.print( cuenta_pulsos_encoder_1,3);
Serial.print("\t");
Serial.print(q2_real,4);
Serial.print("\t");
Serial.print("cuenta q3: ");
Serial.print( cuenta_pulsos_encoder_2,3);
Serial.print("\t");
Serial.print(q3_real,4);
Serial.print("\t");
Serial.print("cuenta q4: ");
Serial.print( cuenta_pulsos_encoder_3,3);
Serial.print("\t");
Serial.println(q4_real,4);
J'ai fait ce simple function
pour y parvenir:
void clearscreen() {
for(int i=0;i<10;i++) {
Serial.println(\n\n\n\n\n\n\n\n\n\n\n\n\n);
}
}
Cela fonctionne bien pour moi dans le default terminal
Vous pouvez juste faire:
Serial.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
ou si vous voulez:
for (int i=0; i<100; i++) {
Serial.print("\n");
}