[Solucionado] Pantalla nextion interrumpe tren de pulsos de aceptador de monedas

Hola buenos días, tengo un problema que supongo es de software. Tengo un arduino mega conectado a una pantalla nextion, a un aceptador de monedas ch-926, a un modulo para grabar datos en una sd y a un modulo 8 relay el cual esta conectado a unas bombas de D.C.
El aceptador de monedas no lo estoy trabajando mediante interrupciones, ya que se vuelve muy sensible a ruidos y me da lecturas falsas al activar bombas, o electrovalvulas, he aplicado todo para disminuirlos sin éxito al 100%, por ende, decidí que el aceptador de monedas trabaje mediante un digital Input. Funciona bien.
El problema radica cuando inserto una moneda, el aceptador de monedas envía un tren de pulsos y si, justo en ese momento presiono un botón en la pantalla el arduino no logra leer todo el tren de pulsos.
He tratado de utilizar, detachPop() para que no los lea los botones, también he tratado de utilizar serial.end () para desactivar el puerto serial cuando empiece a contar pulsos, y tambien el tratado de desactivar nexLoop(nex_listen_list); para que no los escuche pero todo a terminado en fracaso.
Alguien puede darme luces por favor. a continuación posteo un poco del código. Gracias de antemano por tomarse el tiempo en revisarlo, estaré atento a sus inquietudes.

#include <Time.h>
#include "RTClib.h"
RTC_DS3231 rtc;

#include "Nextion.h"
#include "NexDualStateButton.h"
#include <Wire.h>
 #include <Servo.h>
 #include <SD.h>
 #include <SPI.h>
 const int chipSelect = 53;

void inicia_pedido(void *ptr);
void validar_pedido(void *ptr);
void lectura_estado();
/* 
pin 5 contador monedas
pin 3 sensor de flujo
pin 4 sirena / alarma / BUZZER
pin 7 No conectado / sensor STOCK botella 1lt / SSTOCKBOT1LT
pin 8 sensor botella 1lt / SBOT1LT
pin 9 VACIO / sensor STOCK botella 05lt / SSTOCKBOT05LT
pin 10 VACIO /sensor SALARMA
pin 11 VACIO / sensor dinero SDALARMA
pin 12 servo botella 1LT
pin 16 pantalla nextion
pin 17 pantalla nextion
pin 20 sda relog
pin 21 scl relog
pin 36 boton de carga de botellas/PCARGABOTELLA
pin 37 sensor de nivel / SNIVEL
pin 38 pulsante alarma/ BMANTEN
pin 39 boton / pulsante dispensador de agua / PPIE
pin 44 24 int8 VACIO / R BOMBA DOSIFICADOR2 / RDOSIFI2
pin 45 25 int7 R BOMBA DOSIFICADOR / RDOSIFI
pin 46 26 int6 R BOMBA BIDON / RBOMBABIDON
pin 47 27 int5 R DIST 05 LT / RDIST05LT
pin 48 28 int4 R DIST 1 LT / RDIST1LT
pin 49 29 int3 R VAL AMBIENTE / RVALAMB
pin 50 30 int2 R VAL FRIA / RVALFRIA
pin 51 31 int1 R BOMBA BOTELLAS / RBOMBA
*/
NexButton bsaldo1 = NexButton(0, 11, "bsaldo1");  //botones que interrumpen el conteo de monedas cuando se presionan 
NexNumber nmonedas1 = NexNumber(0, 14, "nmonedas1");
NexNumber nrecicladas1 = NexNumber(0, 13, "nrecicladas1");
NexText tclave1 = NexText(0, 12, "tclave1");

NexText t13 = NexText(1, 21, "t13");
NexButton bvalidar = NexButton(1, 7, "bvalidar");  //botones que interrumpen el conteo de monedas cuando se presionan 
NexButton bregresar1 = NexButton(1, 6, "bregresar1"); //botones que interrumpen el conteo de monedas cuando se presionan 
NexButton bsaldo2 = NexButton(1, 5, "bsaldo2");  //botones que interrumpen el conteo de monedas cuando se presionan 
NexNumber nmonedas2 = NexNumber(1, 15, "nmonedas2");
NexNumber npagar = NexNumber(1, 16, "npagar");
NexNumber nrecicladas2 = NexNumber(1, 14, "nrecicladas2");
NexText tclave2 = NexText(1, 13, "tclave2");
NexDSButton btambiente = NexDSButton(1, 18, "btambiente");
NexDSButton btfria = NexDSButton(1, 17, "btfria");  //botones que interrumpen el conteo de monedas cuando se presionan 
NexDSButton bt2lt = NexDSButton(1, 24, "bt2lt");    //botones que interrumpen el conteo de monedas cuando se presionan 
NexDSButton bt5lt = NexDSButton(1, 22, "bt5lt");    //botones que interrumpen el conteo de monedas cuando se presionan 
NexDSButton bt1lt = NexDSButton(1, 23, "bt1lt");    //botones que interrumpen el conteo de monedas cuando se presionan 
NexButton bok = NexButton(1, 20, "bok"); //PEDIDO INCORRECTO
NexVariable va3 = NexVariable(1, 12, "va3");

NexPage page0 = NexPage(0, 0, "page0");
NexPage page1 = NexPage(1, 0, "page1");
NexPage page2 = NexPage(2, 0, "page2");
NexPage page3 = NexPage(3, 0, "page3");

NexTouch *nex_listen_list[] =
{
&t13,
&bsaldo1,
&nmonedas1,
&tclave1,
&nrecicladas1,
&bsaldo2,
&bvalidar,
&bregresar1,
&nmonedas2,
&nrecicladas2,
&npagar,
&tclave2,
&btambiente,
&btfria,
&bt2lt,
&bt5lt,
&bt1lt,
&bok,
&page1,
&page2,
&page3,
&va3,
NULL
};


//declaro variables
//pag 0
char valortclave1[6];
uint32_t valornmonedas1;
uint32_t valornrecicladas1;
uint32_t valorbinicio;
uint32_t valorb210;
//pag 1
uint32_t valorbvalidar;
uint32_t valornmonedas2;
uint32_t valornpagar;
char valortclave2[6];
uint32_t valorbtambiente;
uint32_t valorbtfria;
uint32_t valorbt2lt;
uint32_t valorbt5lt;
uint32_t valorbt1lt;
uint32_t valorcbotella05lt;
uint32_t valorva3;
// ******************ACEPTADOR monedas****
 int contandoMonedas = 0;
 int monedaVirtual = 0;
 int monedaTotal = 0;
const byte coinPin = 5;
int estadocoinPin = 0;
static int coinValue = 000;
long startCoinMillis = 0;

void setup() {
  Serial.begin(9600); 
pinMode(coinPin, INPUT);  // pin entrada de pulsos aceptador de monedas
 nexInit();
bvalidar.attachPop(validar_pedido); //botones que interrumpen el conteo de monedas
t13.attachPop(lectura_estado, &t13);
bt2lt.attachPop(lectura_estado, &bt2lt); //botones que interrumpen el conteo de monedas
bt1lt.attachPop(lectura_estado, &bt1lt);//botones que interrumpen el conteo de monedas
bt5lt.attachPop(lectura_estado, &bt5lt);//botones que interrumpen el conteo de monedas
dbSerialPrintln("setup done");
  }

void loop() {
  // if(contandoMonedas==0) {   // LO QUE HE TRATADO PERO NO HA SERVIDO
   nexLoop(nex_listen_list);
  //}
  estadocoinPin = digitalRead(coinPin); //lee si ingresa moneda y guarda en estadocoinPin
  acceptCoins();  
}

void acceptCoins() {
  estadocoinPin = digitalRead(coinPin); 
  Serial.println(estadocoinPin);
  static long prevCoinMillis = 0;
    bool coinInserted = false;
    long currentMillis = millis();
    if((currentMillis - prevCoinMillis >= 30) && (estadocoinPin == HIGH)) { // filtra posibles ruidos, recibe pulsos mayores a 30ms
      Serial.println(currentMillis - prevCoinMillis);
       Serial.println("pulso detectado");
        prevCoinMillis = currentMillis;
        coinInserted = true;
        coinValue += 005;
        monedaTotal = (monedaVirtual + coinValue);
        
        if(contandoMonedas == 0 && startCoinMillis == 0){
        startCoinMillis = millis();
        Serial.println(startCoinMillis);
       // bt2lt.detachPop();
       // bt1lt.detachPop();
       // bt5lt.detachPop();
        contandoMonedas = 1;
       // Serial.end(); // LO QUE HE TRATADO PERO NO HA SERVIDO
      }
    }
    if(coinInserted == true)  {
      Serial.print("Credit: £");
      Serial.println(coinValue);   //imprime monedas insertadas
     nmonedas1.setValue(monedaTotal);
     nmonedas2.setValue(monedaTotal);  
     startCoinMillis = millis();
    }  
    if((currentMillis - startCoinMillis > 200) && (contandoMonedas == 1)) {  // Espera a terminar tren de pulsos
       Serial.println(startCoinMillis);
      Serial.println(currentMillis);
      Serial.println(currentMillis - startCoinMillis);
      Serial.println("termino tren de pulsos");  
        startCoinMillis = 0;
       // bt2lt.attachPop(lectura_estado, &bt1lt); // LO QUE HE TRATADO PERO NO HA SERVIDO
       // bt1lt.attachPop(lectura_estado);           
       // bt5lt.attachPop(lectura_estado);
        contandoMonedas = 0;
      //  Serial.begin(9600); // LO QUE HE TRATADO PERO NO HA SERVIDO
    }
}

 void lectura_estado()
{
 
  Serial.println("leee estado botones"); 
  delay(500);                             // espera que dual state button se haya soltado
  btambiente.getValue(&valorbtambiente);
  btfria.getValue(&valorbtfria);
  bt2lt.getValue(&valorbt2lt);
  bt5lt.getValue(&valorbt5lt);
  bt1lt.getValue(&valorbt1lt);
  nmonedas2.setValue(monedaTotal);
   
    if (valorbt2lt == 0 && valorbt1lt == 0 && valorbt5lt == 0 ) {
    valornpagar = 0;
    npagar.setValue(valornpagar);
   }
   if (valorbt2lt == 1) {
    valornpagar = 25;
    npagar.setValue(valornpagar);
   }
    if (valorbt5lt == 1) {
    valornpagar = 50;
    npagar.setValue(valornpagar);
   }
    if (valorbt1lt == 1) {
    valornpagar = 70;
    npagar.setValue(valornpagar);
   }
}

 void validar_pedido(void *ptr)
{
  Serial.println("INGRESA A BVALIDAR");
   va3.getValue(&valorva3);
   //Serial.println(valorva3);
  if (monedaTotal > 0 && monedaTotal >= valornpagar && valorva3 == 1){
    if (monedaTotal>valornpagar){
     // pedido_con_saldo();
        
    } else {
    //guarda_compra_sd();
   }
}
}

Bueno voy analizando el código y

  1. Me encuentro que en el loop lees el estado del pin
estadocoinPin = digitalRead(coinPin);

y al llamar a la rutina acceptCoins lo vuelves a hacer. Error menor pero esta duplicado, elimina el del loop.

  1. Elimina tantos Serial.print en la rutina crítica de leer las monedas.
    Levanta banderas o flags y presenta los valores mas tarde y si no se presiona algún boton.
    De esa manera le das prioridad a lo que realmente lo tiene la rutina de leer monedas.

Lo único no mal sino exagerado que veo son demasiadas Serial.print. El código luce bien.

Gracias surbyte por tu pronta respuesta, pues si tenias razón perdía pulsos por imprimir y establecer los valores de las monedas ingresadas instantáneamente, basto con comentar estas lineas y quedo perfecto.

      Serial.print("Credit: £");
      Serial.println(coinValue);   //imprime monedas insertadas
     nmonedas1.setValue(monedaTotal);
     nmonedas2.setValue(monedaTotal);

Es que como dije, puedes imprimir pero luego de cumplida la prioridad que es contar las monedas. Solo acumula lo que vas a imprimir y luego lo haces cuando no hay impedimiento.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.