Arduino - Problema con librería HX711 y millis()

 
Vista:

Problema con librería HX711 y millis()

Publicado por Ftsskating (1 intervención) el 25/06/2019 23:54:20
Ante todo ¡¡¡Saludos a tod@s!!!. Espero explicarme bien y no saltarme ninguna norma del foro y que esté todo correcto ya que soy noob en esto de los foros.
Explico mi caso a ver si alguien puede arrojarme un poco de luz sobre este problemilla que tengo...

Estoy usando la libreria HX711 y la libreria DFRobotDFPlayerMini con un Arduino Nano. Estoy construyendo un decorado que simula un caldero al cual tras echar los ingredientes correctos (es decir el peso correcto de la celda de carga) se active un efecto de fuego, humo, sonido y se abra una trampilla(electroimán controlado por Relé).

El problema que intento solucionar sin éxito, es que al intentar implementar un tiempo de espera mediante millis() para que solo funcione tras dos segundos de espera desde que detecte el peso correcto, no funciona.

Ese periodo de tiempo es necesario ya que al manipular el caldero(celda de carga) se suele activar solo.
ya que al tocarlo es relativamente fácil que justo pongamos dicho peso correcto aunque solo sea por un instante.

Aquí el Código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "HX711.h"
#define DOUT  A1
#define CLK  A0
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
HX711 balanza(DOUT, CLK);
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
 
DFRobotDFPlayerMini myDFPlayer;              //Modulo de reproduccion de mp3
void printDetail(uint8_t type, int value);
 
int const ReleApert = 12;  //Pin del rele que comanda el electroiman
int const Leds = 3;        //Tira de leds para crear el efecto llama
int const ReleHumo = 13;   //Pin del rele que comanda la maquina de humo
 
 
bool PesoCorrecto = 0;    //Variable de comprobacion de peso correcto en celda de carga
bool CorrectoEspera = 0;
int EstadoResuelto = 0;
 
float MargenSup = 124500.00; //Margen superior para comprobacion de peso correcto
float MargenInf = 122000.00; //Margen inferior para comprobacion de peso correcto
 
int val=0;                //Variable que almacena los numeros random para crear el efecto llama en los leds
int delayval = 0;         //Variable que almacena el delay random para crear el efecto llama en los leds
int efectoFuego = 0;      //Variable de comprobacion para activar el efecto llama de los leds
int volumen = 20;          //Variable de comprobacion para poder bajar el volumen del modulo dfplayer
 
int espera = 2000;                //Espera para comprobar si el peso es correcto transcurrido el tiempo indicado
unsigned long tiempoActual = 0;   //Variable para almacenar cuando sea necesario el tiempo de millis
 
void setup() {
 
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  randomSeed(0);
  pinMode(ReleApert, OUTPUT);
  pinMode(Leds, OUTPUT);
  pinMode(ReleHumo, OUTPUT);
  //pinMode(ComandoApertura, INPUT);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 if (!myDFPlayer.begin(mySoftwareSerial, false)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(20);  //Set volume value. From 0 to 30
  delay(1000);
 
  Serial.print("Lectura del valor del ADC:  ");
  Serial.println(balanza.read());
  Serial.println("No ponga ningun  objeto sobre la balanza");
  Serial.println("Destarando...");
  Serial.println("...");
  balanza.set_scale(); //Establecemos la escala
  balanza.tare(20);  //El peso actual es considerado Tara. No es necesario que saque el peso real...
  Serial.println("Listo para pesar");
}
 
void loop() {
 
float Peso;                    //Variable para poder ver por puerto serie el valor que devuelve la celda de carga
Peso = (balanza.read());
Serial.println(Peso);
 
 
if(Peso > MargenInf && Peso < MargenSup)  //Si el valor de la celda de carga se encuentra entre el margen superior e inferior...
  {
   PesoCorrecto = 1;                      //establecemos la Variable que indica que el peso es correcto en 1
   tiempoActual = millis();               //establecemos esta variable con el tiempo en este momento(momento en el que el peso es correcto)
   }
  else{
        PesoCorrecto = 0;
       }
 
if(PesoCorrecto == 1)
  {
    if(millis() >= tiempoActual+espera)  //Comprobamos si el peso es correcto durante 2 segundos
      {
        EstadoResuelto = 1;              //Y si tras dos segundos sigue siendo correcto cambiamos esta variable a 1
      }else{
            EstadoResuelto = 0;
           }
  }
 
   if(EstadoResuelto == 1)              //Comprobamos el estado de la variable para activar reles, efectos de humo, y sonido
  {
 
   digitalWrite(ReleApert, HIGH);
   digitalWrite(ReleHumo, HIGH);
   myDFPlayer.play(1);
   while(efectoFuego < 200)           //Efecto de llamas
      {
       val = random(10,255);
       analogWrite(Leds, val);
       delayval= random(50,100);
       delay(delayval);
       efectoFuego ++;
      }
   digitalWrite(ReleHumo, LOW);
   while(volumen >= 20)               //Bajar volumen del sonido
      {
       myDFPlayer.volume(volumen);
       delay(100);
       volumen --;
      }
   myDFPlayer.stop();
   digitalWrite(ReleApert, LOW);
  }
}

¡¡¡Gracias de antemano por la ayuda!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder