faire tourner en boucle la fonction listen de softwareSerial

Bonjour,
J’ai un programme qui communique avec un lcd Nextion avec touchscreen relié en série sur arduino nano.
Je veux pouvoir gérer le contrôle de l’arduino après appui d’un bouton sur le touchscreen (qui renvoie un message prédéfini).
Pour les tests, j’allume la led du pin 13. La fonction de base fonctionne très bien lorsque j’utilise ce code de base:

#include <SoftwareSerial.h>
#include <Nextion.h>
SoftwareSerial nextion(11, 12);   // Nextion's pins TX 2, RX 3
Nextion myNextion(nextion, 9600);

void setup() {
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}

void loop() {
  String message = myNextion.listen();
  Serial.println ( message );  
  if (message == "65 1 1 1 ffff ffff ffff"){
    digitalWrite(13,HIGH);
  }
  else if (message == "65 1 2 1 ffff ffff ffff"){
    digitalWrite(13,LOW);
  }  
}

Mais si dans mon loop j’ajoute un fonction de lecture de tension, de fréquence, de température, ça ne fonctionne plus.
J’imagine que c’est dû au fait que ma fonction cesse “d’écouter” le message reçu une fois le reste de mon code exécuté. Je pensais que softwareSerial fonctionnait en interruption ? Une idée pour contourner le problème ?

bonjour,
jètes un oeil sur ce tuto

Merci infobarquee, je ne connaissais pas ce tuto, il m'a éclairé sur certains points.
Toujours est-il qu'il n'aborde pas mon problème, je parviens sans souci à afficher mes variables sur l'écran.
Mais c'est quand j'intègre dans mon code la fonction de lectures de messages serial que ça ne fonctionne plus (ou en tout cas une fois sur ~30) d'où ma supposition que c'est dû à mon message qui n'est pas "écouté" sur toutes les fonctions de mon code (je ne suis pas sûr de bien m'être exprimé).

mets ton code qui bug

Je l’ai un peu épuré pour le rendre moins imbuvable. En gros c’est un tableau de bord moto.
Dans mon loop quand je laisse juste le compte tours et “LECTURE BOUTON CHOIX PILOTE POUR CHRONO” qui permet juste de tester via la led pin 13, ça fonctionne.
Des que j’active rien que la partie tension batterie en plus de ces 2 choses, ça merde.

#include <SoftwareSerial.h>
#include <Nextion.h>
#include "Sodaq_DS3231.h"
#include <OneWire.h>
#include <DallasTemperature.h>*/
//#include <PinChangeInt.h>//si utilisation capteur ILS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/!
//#include <StopWatch.h>//chrono//
#define PIN 4 //chrono
#define ONE_WIRE_BUS A3 //pin sonde digitale (retirer si sonde analogique)
/*************************VARIABLES COMPTE TOURS et KMH*********************************/
volatile byte rpmcount;
volatile unsigned int rpm;
volatile unsigned int rpmroue;
unsigned long timeold;
volatile byte kmhcount;
unsigned int kmh;
unsigned long kmhtimeold;
/******************************TENSION BATTERIE***********************************/
const int analogInPin = A0; // pin tension batterie
const float Vcc = 5; // µC Vcc (V)
const float R1 = 22000; // Voltage divider R1 (Ohm)
const float R2 = 10000; // Voltage divider R2 (Ohm)
float tension;
float v_pin;
int sensorValue;
/*******************************TEMPERATURE*********************************/
float temp;

/*********Variables montre*****************************************************/
unsigned int heure;
unsigned int minutes;
/*********Variables anti rebond***********************************************/
long debouncing_time = 15; //Debouncing Time in Milliseconds
volatile unsigned long last_micros;
/********Variables vitesse*****************************************************/
float start, finished;
float elapsed, time;
float circMetric = 1.7; // circonference roue en metres
float speedk = 0;
/********Variables chrono*******************************************************/
long debouncing_timechrono = 500; //Debouncing Time in Milliseconds
//StopWatch sw_millis;    // MILLIS (default)
byte TempsHr = 0;
byte TempsMn = 0;
byte TempsSec = 0;
byte TempsDix = 0;
byte TempsMil = 0;
byte bestTempsHr = 0;
byte bestTempsMn = 0;
byte bestTempsSec = 0;
byte bestTempsDix = 0;
byte bestTempsMil = 0;
unsigned long bestMillis = 9999999;
volatile unsigned long lap;
volatile unsigned long bestlap;
boolean premiertour = true;
String pilote;
String ben = "Ben";
String thom = "Thom";
String pat = "Pat";
int bp;
/*****************************************************************************/
/*OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);*/
/****************************nextion******************************************/
SoftwareSerial nextion(11, 12
Nextion myNextion(nextion, 9600);

void setup()
{
  Serial.begin(9600);  
  myNextion.init();
  start = millis();
  attachInterrupt(1, rpm_pulse, FALLING);//compte tours
  attachInterrupt(0, debounceInterrupt, FALLING);//vitesse
  //start=micros();
  digitalWrite(2, HIGH); /*pullup interne*/
  digitalWrite(3, HIGH); /*pullup interne*/
  pinMode(PIN, INPUT_PULLUP);
//  PCintPort::attachInterrupt(PIN, debounceChrono, FALLING);//si utilisation capteur ILS
  pinMode(A7, INPUT_PULLUP);//choix pilote
  pinMode(13,OUTPUT);
  
 }

void loop()
{
  /*********************************************LECTURE BOUTON CHOIX PILOTE POUR CHRONO*************************/  
  String message = myNextion.listen(); //check for message  
  
  if (message == "65 1 1 1 ffff ffff ffff") {
    digitalWrite(13,HIGH);
  }
   
  if (message == "65 1 2 1 ffff ffff ffff") {   
    digitalWrite(13,LOW);    
  }
  
  
  
  /*********************************************COMPTE-TOURS********************************************/
  noInterrupts(); // interdit les interruptions / la modification des compteurs
  uint32_t t_now = micros();  // lit l'heure
  // lit et réinitialise les compteurs
  uint32_t rpmc = rpmcount;
  rpmcount = 0;
  interrupts(); // autorise les interruptions / la modification des compteurs
  uint32_t delta_t = t_now - timeold; // calcule la durée du comptage effectué
  timeold = t_now; // mémorise l'heure de départ du nouveau comptage
  rpm = rpmc * 6.0e7 / delta_t;
  myNextion.setComponentText("t4", String(rpm));
  delay(150);

  /*********************************************LECTURE TENSION BATTERIE***********************************/
/*
  sensorValue = analogRead(analogInPin); 
  v_pin = Vcc * sensorValue / 1023;
  tension = v_pin / (R2 / (R1 + R2));
  myNextion.setComponentText("t0", String(tension));
*/
  /*********************************************LECTURE TEMPERATURE DIGITALE*******************************/
  /*sensors.requestTemperatures();
  float temp = sensors.getTempCByIndex(0);
  myNextion.setComponentText("t1", String(temp));*/
  /*********************************************CALCUL GLISSEMENT******************************************/
/*  
   myNextion.setComponentText("t2", String(glissement));
 */ 
  /*********************************************LECTURE DATE RTC********************************************/
/*  DateTime now = rtc.now(); //get the current date-time
  heure = (now.hour());
  minutes = (now.minute());
  String horloge = String(heure + ":" + minutes);
  myNextion.setComponentText("t5", String(horloge));*/

/*  myNextion.setComponentText("t3", String(speedk));*/
}

void debounceInterrupt() {
  if ((long)(micros() - last_micros) >= debouncing_time * 1000UL) {
    kmh_pulse();
    last_micros = micros();
    
  }
}

void rpm_pulse()
{
  rpmcount++;
}

void kmh_pulse()
{
  elapsed = millis() - start;
  start = millis();
  speedk = (3600UL * circMetric) / elapsed; // km/h
  rpmroue = speedk / (0.0017 * 60UL); //rpm de roue
  String message = myNextion.listen();
  
}

/*void debounceChrono() {
  if ((long)(micros() - last_micros) >= debouncing_timechrono * 1000) {
    chrono();
    last_micros = micros();
    TempsHr = (lap / 3600000) % 60;
    TempsMn = (lap / 60000) % 60;
    TempsSec = (lap / 1000) % 60;
    TempsMil = (lap % 1000 );
    TempsDix = TempsMil / 10;

 
    if (lap < bestMillis && premiertour != true ) {
      bestMillis = lap;
      bestlap = lap;
      bestTempsHr = (bestlap / 3600000) % 60;
      bestTempsMn = (bestlap / 60000) % 60;
      bestTempsSec = (bestlap / 1000) % 60;
      bestTempsMil = (bestlap % 1000 );
      bestTempsDix = bestTempsMil / 10;

    }
  }
  premiertour = false;
}
1 Like

toujours personne pour m'aider ?
est une histoire de buffer qui doit stocker mon message ?