[SOLUCIONADO] Actualizar un float [Arduino]

Iniciado por DoSser, Septiembre 20, 2016, 10:13:45 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Septiembre 20, 2016, 10:13:45 PM Ultima modificación: Septiembre 21, 2016, 03:24:00 AM por Stiuvert
Buenas tardes :D, recientemente estoy trabajando  en algo nuevo para mi, la tecnología RFID mediante Arduino, para aplicarla en una pluma de control de acceso en la universidad donde estudio. Es un proyecto simple que consiste en el lector de tarjetas y un servo-motor (apenas es una maqueta) y ahora quiero agregarle un sensor ultrasónico para que si el carro tarda mas del tiempo establecido  en pasar, la pluma no baje y lo golpee. A continuación les podre el código y tratare de explicarlo breve mente:
Código: c

#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h>
Servo myservo;
#define RST_PIN         9         
#define SS_PIN          10         
MFRC522 mfrc522(SS_PIN, RST_PIN);   
String read_rfid;
String ok_rfid_1="b74fefc5";
float distancia,tiempo;

La ultima linea son las variables tipo float que necesito para los valores del sensor ultrasónico, la primera es la  variable que necesito actualizar.
Código: c

void open_lock() {
  Serial.println("Acceso correcto");
  myservo.write(90);
  delay(5000);
  do
  {
    myservo.write(90);
  }
  while(distancia<10);
  myservo.write(0);
}

Mando a llamar este método cuando la clave leída es igual a la establecida para que abra la pluma. el "do{}while()"sirve para que la pluma o el servo motor no se cierre mientras que la variable distancia sea menor a 10 cm (hablamos de una maqueta). E aquí esta el problema. Terminare de explicar las partes del código que tienen que ver con este problema y lo dejare completo abajo por si algo se me escapa..
Código: c

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(7,LOW);
delayMicroseconds(5);   //4 renglones para hacer el tren
digitalWrite(7,HIGH);   // de pulsos que manda 48KHZ
delayMicroseconds(10);
tiempo=pulseIn(6,HIGH);   // entrada que lee el momento que recibe la onda lee HIGH
distancia=(0.017*tiempo); //formula 0.017 mitad de tiempo

        // Look for new cards
      if ( ! mfrc522.PICC_IsNewCardPresent())
          return;
      // Select one of the cards
      if ( ! mfrc522.PICC_ReadCardSerial())
          return;
      dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
      Serial.println(read_rfid);
      if (read_rfid==ok_rfid_1) {
        open_lock();  //llama al metodo que abre el servo y lo mantiene abierto mientras que la distancia sea menor a 10 (debería de funcionar asi.. :/)
Serial.print("Distancia:  ");
Serial.print(distancia);
Serial.println(" cm");
delay(1000);}
else{
Serial.println("No estas calificado para accesar a la institución");
delay(10000);}
}

las primeras lineas son los pines con los que trabaja el sensor (debidamente declarados en el setup), luego asigna valores a tiempo y distancia (que es la variable que deseo cambiar el valor). Busca nuevas tarjetas, selecciona una y si la tarjeta tiene la clave entonces llama al método, regresando al método, justamente en la parte del do/while necesito actualizar la variable "distancia" hasta que sea mayor a 10 y salga del ciclo, pero no se como hacerlo, ya intente copiando las lineas que dan valor a "distancia" dentro del do pero a la hora de verificar que funciona correctamente, el servo cierra aun cuando hay un obstáculo a menos de 10 cm del sensor..   
Espero que puedan orientarme y darme sugerencias, Gracias :)
Les dejo el código completo, no es de mi autoría ya que tome fragmentos de aquí y de allá XD  Saludos  les dejo mi voto en Bitácoras
Código: c

#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h>

Servo myservo;
#define RST_PIN         9         
#define SS_PIN          10         

MFRC522 mfrc522(SS_PIN, RST_PIN);   

String read_rfid;
String ok_rfid_1="b74fefc5";

float distancia,tiempo;

void dump_byte_array(byte *buffer, byte bufferSize) {
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) {
        read_rfid=read_rfid + String(buffer[i], HEX);
    }
}

void open_lock() {
  Serial.println("Acceso correcto");
  myservo.write(90);
  delay(5000);
  do
  {
    myservo.write(90);
  }
  while(distancia<10);
 
  myservo.write(0);
}

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(7,OUTPUT);
pinMode(6,INPUT);
    while (!Serial);            // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();                // Inicia SPI bus
    mfrc522.PCD_Init();         // Inicia el lector MFRC522
    myservo.attach(3);
    myservo.write(0);

}

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(7,LOW);
delayMicroseconds(5);   //4 renglones para hacer el tren
digitalWrite(7,HIGH);   // de pulsos que manda 48KHZ
delayMicroseconds(10);

tiempo=pulseIn(6,HIGH);   // entrada que lee el momento que recive la onda lee HIGH
distancia=(0.017*tiempo); //formula 0.017 mitad de tiempo


        // Look for new cards
      if ( ! mfrc522.PICC_IsNewCardPresent())
          return;
 
      // Select one of the cards
      if ( ! mfrc522.PICC_ReadCardSerial())
          return;
 
      dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
      Serial.println(read_rfid);
      if (read_rfid==ok_rfid_1) {
        open_lock();  //llama al metodo que abre el servo y lo mantiene abierto mientras que la distancia sea menor a 10 (deberia de funcionar asi.. :/)

        Serial.print("Distancia:  ");
Serial.print(distancia);
Serial.println(" cm");
delay(1000);
      }
      else
    {
      Serial.println("No estas calificado para accesar a la institución");
      delay(10000);
    }

}

y dime por que usaste un sensor ultrasonico en lugar de un sensor de presencia?, o cual es la diferencia, lo pregunto por que no lo se!.

Saludos!
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


No se cual es la diferencia! ^^ pero lo que se es que no tenia otro sensor a la mano jeje y ademas ya lo había utilizado de la misma manera, solo necesitaba saber la distancia entre la pata de la pluma y la pared del otro lado.. como mide la distancia a través de eco, si un objeto obstruye las ondas  la distancia cambiara y se puede utilizar un condicional para realizar ciertas funciones, el sensor de presencia no tengo ni la mas mínima idea de como funciona..
Gracias por leer :D

Ya encontré como actualizar! hice un método para leer la distancia y almacenarla en la variable y lo mande a llamar dentro del do{}while()
en el método para abrir el servo! Gracias por leer y comentar XD SALUDOS