Go Down

Topic: Validador de monedas (Read 733 times) previous topic - next topic

estefelipe

Nov 02, 2017, 04:59 am Last Edit: Nov 02, 2017, 08:14 pm by surbyte Reason: Titulo no reflejaba el motivo de la consulta
buenas compañeros soy nuevo y tengo problema al crear un código resulta que estoy en un validador de monedas por sensores reconoce 2 valores (boton) modena de 100 y (dboton) moneda de 200 que al ingresar activan un rele(RELAY1) y al presionar un pulsador(pulsador1) pasa  un tiempo antes de desactivar nuevamente el rele(RELAY1), la verdad tengo un código de novato con la función delay el problema es que en el valor de la otra moneda requiero que al utilizar el pulsador1 pase un tiempo mayor y desactive el (REALY1),  en si necesito quitar el delay para que no se me pause la placa y pueda el contador seguir contando monedas en caso tal de que este pasando el tiempo de desactivacion del REALY1 y se ingresen mas monedas.
aquí les muestro lo que tengo de código y les agradezco muchísimo al que me pueda colaborar ya que es buscado y ensayado muchos códigos millis y no encuentro el chiste.




Code: [Select]
#include <LiquidCrystal.h>
#define RELAY1 7


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int boton = 8;
int valor=0;
int contador=0;
int estadoanteriorboton=0;

const int dboton = 6;
int dvalor=0;
int dcontador=0;
int destadoanteriorboton=0;

const int pulsador1 = 9;
int value = 0;
int var;

void setup() {

 pinMode(RELAY1, OUTPUT);
 pinMode(boton,INPUT);
 digitalWrite(boton,HIGH);

 pinMode(dboton,INPUT);
 digitalWrite(dboton,HIGH);

  pinMode(pulsador1,INPUT);
  digitalWrite(pulsador1,HIGH);
 lcd.begin(16, 2);

   digitalWrite(RELAY1, LOW);
}

void loop() {



  
 lcd.setCursor(0, 0);
 lcd.print("coin 100=");
 valor=digitalRead(boton);
 if(valor!=estadoanteriorboton){
 if(valor==0){
 contador++;
 lcd.setCursor(10 , 0);
 lcd.print(contador);
  digitalWrite(RELAY1, HIGH);
 }
 }
 estadoanteriorboton=valor;



lcd.setCursor(0, 1);
 lcd.print("coin 200=");
 dvalor=digitalRead(dboton);
 if(dvalor!=destadoanteriorboton){
 if(dvalor==0){
 dcontador++;
 lcd.setCursor(10 , 1);
 lcd.print(dcontador);
  digitalWrite(RELAY1, HIGH);
 }
 }
 destadoanteriorboton=dvalor;
 
 value = digitalRead(pulsador1);  //lectura digital de boton
  
 if (value == LOW)  {
  delay(1000);
    digitalWrite(RELAY1, LOW);
 
}
}
  

estefelipe

#1
Nov 02, 2017, 07:20 am Last Edit: Nov 02, 2017, 08:15 pm by surbyte
He mejorado el código, logre temporizar con millis pero tengo otra situación y es que si inicio el temporizado con el pulsador y lo vuelvo a pulsar se reinicia la cuenta.
Cómo hago para que me cuente solo la primera vez y no si se pulsa varias veces,  también requiero colocar otro temporizador con la variable de àra dboton(moneda de 200) que me actúe con un tiempo de apagado del rele mayor.

Gracias al que me pueda ayudar

Code: [Select]

#include <LiquidCrystal.h>
#define RELAY1 7
#define RELAY2 10

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int boton = 8;
int valor=0;
int contador=0;
int estadoanteriorboton=0;

const int dboton = 6;
int dvalor=0;
int dcontador=0;
int destadoanteriorboton=0;

int periodo = 3000;  // tiempo para que el led se encienda
byte temp = 0; //estado del temporizador, 1= activo 0= inactivo
unsigned long tiempoAnterior = 0;  //guarda tiempo de referencia para comparar




void setup() {

 pinMode(RELAY1, OUTPUT);
 pinMode(RELAY2, OUTPUT);
 
 pinMode(boton,INPUT);
 digitalWrite(boton,HIGH);

 pinMode(dboton,INPUT);
 digitalWrite(dboton,HIGH);


pinMode(9,INPUT_PULLUP);  //configura la entrada con resistencia pull-up

 lcd.begin(16, 2);

   digitalWrite(RELAY1, LOW);
   digitalWrite(RELAY2, LOW);
}

void loop() {



 
 lcd.setCursor(0, 0);
 lcd.print("coin 100=");
 valor=digitalRead(boton);
 if(valor!=estadoanteriorboton){
 if(valor==0){
 contador++;
 lcd.setCursor(10 , 0);
 lcd.print(contador);
  digitalWrite(RELAY1, HIGH);
 }
 }
 estadoanteriorboton=valor;



lcd.setCursor(0, 1);
 lcd.print("coin 200=");
 dvalor=digitalRead(dboton);
 if(dvalor!=destadoanteriorboton){
 if(dvalor==0){
 dcontador++;
 lcd.setCursor(10 , 1);
 lcd.print(dcontador);

 }
 }
 destadoanteriorboton=dvalor;



if (digitalRead(9)==0) {  //si el pulsador fue presionado
      tiempoAnterior=millis();  //guarda el tiempo actual como referencia
      temp = 1;  //indica que esta activo el temporizador
      digitalWrite(RELAY1,HIGH);  //apaga el LED
      }
  if((millis()>tiempoAnterior+periodo)&&temp==1){  //si ha transcurrido el periodo programado
      digitalWrite(RELAY1,LOW);  //enciendo el LED
      temp = 0;  //y desactivo el temporizador
      }



 

surbyte

#2
Nov 02, 2017, 09:10 pm Last Edit: Nov 02, 2017, 09:14 pm by surbyte
Entiendo lo que quieres pero luego que te resolvamos eso dirás y ahora como hago para volver a dispararlo?

Cual es la función a cumplir por ese pulsador? No es posible que se dispare una sola vez y nunca mas actúe!

No he hecho muchos cambios asi que por ahora no le prestes atención pero antes de guardarlo en mi pc prefiero aca.

Code: [Select]
#include <LiquidCrystal.h>
#define RELAY1 7
#define RELAY2 10

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const byte boton = 8;
bool valor                = false;
int contador              = 0;
bool estadoanteriorboton  = false;

const byte dboton         = 6;
bool dvalor               = false;
int dcontador             = 0;
bool destadoanteriorboton = false;

int periodo = 3000;  // tiempo para que el led se encienda
byte temp = 0; //estado del temporizador, 1= activo 0= inactivo
unsigned long tiempoAnterior = 0;  //guarda tiempo de referencia para comparar




void setup() {

  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(boton,INPUT);
  digitalWrite(boton,HIGH);
  pinMode(dboton,INPUT);
  digitalWrite(dboton,HIGH);   // ?? para que?
  pinMode(9,INPUT_PULLUP);  //configura la entrada con resistencia pull-up

  lcd.begin(16, 2);

  digitalWrite(RELAY1, LOW);
  digitalWrite(RELAY2, LOW);
}

void loop() {
 
  lcd.setCursor(0, 0);
  lcd.print("coin 100=");
  valor = digitalRead(boton);
 
  if ( !valor &&estadoanteriorboton) {
        contador++;
        lcd.setCursor(10 , 0);
        lcd.print(contador);
        digitalWrite(RELAY1, HIGH);
  }
  estadoanteriorboton = valor;

  lcd.setCursor(0, 1);
  lcd.print("coin 200=");
  dvalor = digitalRead(dboton);
  if (!dvalor && destadoanteriorboton){
      dcontador++;
      lcd.setCursor(10 , 1);
      lcd.print(dcontador);
  }
  destadoanteriorboton = dvalor;

  if (!digitalRead(9)) {          // si el pulsador fue presionado
      tiempoAnterior = millis();    // guarda el tiempo actual como referencia
      temp = 1;                     // indica que esta activo el temporizador
      digitalWrite(RELAY1,HIGH);    // apaga el LED
  }

  //si ha transcurrido el periodo programado
  if ((millis() - tiempoAnterior > periodo) &&temp==1){ 
      digitalWrite(RELAY1,LOW);     // enciendo el LED
      temp = 0;                     // y desactivo el temporizador
  }
}

Go Up