Bonsoir à tous, j'ai bien essayé ton code Kamill, alors il fonctionne très bien. Je tape le chiffre dans le moniteur, et il arrive illico sur les écrans. Seulement un char ne prend que 255 il me semble, et mes nombres doivent être des int ou au mieux, des float car j'aurai aimé connaitre jusqu'à la virgule de filament passés dans mon compteur.
Après maintes comprehension sur le port serie, j'ai connecté ma nano sur ma uno (RX, TX et inverse) . Pour rappel, la nano gère le rotary encodeur, et la uno les écrans.
Je demande donc à la nano d'envoyer en format long sa valeur recue du rotary via le port serie et a la uno de la lire et l'ecrire..... ben ca ne se passe pas comme prévu.
Oui j'ai bien des valeurs, mais elles sont aléatoires, parfois l'ecran ecrit -257 et un petit coup l'envoie a 10025 qui defile doucement puis zero, j'ai beau divisé la valeur envoyé par 10, ou modifier en long, int ou float.....mettre du delay pour contrecarré la latence... je ne sais plus quoi faire
code de la nano :
volatile long temp, compteur = 0; //Cette variable augmentera ou diminuera en fonction de la rotation de l'encodeur
void setup() {
Serial.begin (9600);
pinMode(2, INPUT_PULLUP); // entrée pullup interne 2
pinMode(3, INPUT_PULLUP); // entrée pullup interne 3
//Une impulsion montante d'encoder active interrupt0(). AttachInterrupt 0 est sur DigitalPin 2.
attachInterrupt(0, interrupt0, RISING);
//Une impulsion montante d'encoder active interrupt1(). AttachInterrupt 1 est sur DigitalPin 3.
attachInterrupt(1, interrupt1, RISING);
}
void sendLong(long resultat) {
Serial.write(resultat & 0xFF); // Envoi l'octet de poids faible
Serial.write((resultat >> 8) & 0xFF);
Serial.write((resultat >> 16) & 0xFF);
Serial.write((resultat >> 24) & 0xFF); // puis l'octet de poids fort
}
void loop() {
// Envoyer la valeur du compteur
if( compteur != temp ){
temp = compteur;
long resultat = temp /10;
sendLong(resultat);
delay(50);
/*Serial.println (resultat);
Serial.write(resultat);*/
}
}
void interrupt0() {
if(digitalRead(3)==LOW) {
compteur++;
}else{
compteur--;
}
}
void interrupt1() {
if(digitalRead(2)==LOW) {
compteur--;
}else{
compteur++;
}
}
code de la UNO :
#include <Adafruit_GFX.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
/*#include <SSD1306Ascii.h>
#include <SSD1306AsciiAvrI2c.h>
#include <SSD1306AsciiSoftSpi.h>
#include <SSD1306AsciiSpi.h>
#include <SSD1306AsciiWire.h>
#include <SSD1306init.h>
*/
#define OLED_RESET 4
Adafruit_SSD1306 ecran(OLED_RESET);
long voila = 335;
void TCA9548A(uint8_t bus) {
Wire.beginTransmission(0x70);
Wire.write(1 << bus );
Wire.endTransmission();
}
void displayd() {
ecran.clearDisplay();
ecran.setTextColor(WHITE);
ecran.setTextSize(2);
ecran.setCursor(20, 0);
}
void setup() {
Wire.begin();
Serial.begin(9600);
TCA9548A(1);
ecran.begin(SSD1306_SWITCHCAPVCC, 0x3C);
TCA9548A(2);
ecran.begin(SSD1306_SWITCHCAPVCC, 0x3C);
TCA9548A(3);
ecran.begin(SSD1306_SWITCHCAPVCC, 0x3C);
TCA9548A(4);
ecran.begin(SSD1306_SWITCHCAPVCC, 0x3C);
TCA9548A(5);
ecran.begin(SSD1306_SWITCHCAPVCC, 0x3C);
TCA9548A(6);
ecran.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}
void loop() {
/*if (Serial.available()) // si il y a des caractères à lire
{
char buf[10];
int n=Serial.readBytesUntil('\n',buf, sizeof buf-1);
buf[n]=0; // fin de la chaine
voila = atof(buf);
}*/
voila = Serial.read() + (Serial.read() << 8) + (Serial.read() << 16) + (Serial.read() << 24);
TCA9548A(1);
displayd();
ecran.print("ecran 6");
ecran.setCursor(10, 18);
ecran.print(voila);
ecran.display();
TCA9548A(2);
displayd();
ecran.print("ecran 5");
ecran.setCursor(10, 18);
ecran.print("voila");
ecran.display();
TCA9548A(3);
displayd();
ecran.print("ecran 4");
ecran.setCursor(10, 18);
ecran.print("voila");
ecran.display();
TCA9548A(4);
displayd();
ecran.print("ecran 3");
ecran.setCursor(10, 18);
ecran.print("voila");
ecran.display();
TCA9548A(5);
displayd();
ecran.print("ecran 2");
ecran.setCursor(10, 18);
ecran.print("voila");
ecran.display();
TCA9548A(6);
displayd();
ecran.print("ecran 1");
ecran.setCursor(10, 18);
ecran.print("voila");
ecran.display();