#include <Ultrasonic.h> //Libreria. Permite usar sensores ultrasonicos.
Ultrasonic ultraleft (11,10,11600); // (Trig PIN,Echo PIN)
Ultrasonic ultraright(7,6,11600); // (Trig PIN,Echo PIN)
void setup() {
Serial.begin(9600); //habilita comunicación serial a 9600 baudios.}
pinMode(13,OUTPUT);
pinMode (12,OUTPUT);
}
void loop()
{
Serial.print("Left: ");
Serial.print(ultraleft.Ranging(CM)); // CM or INC
Serial.print(" cm " );
delay(50);
Serial.print("Right: ");
Serial.print(ultraright.Ranging(CM)); // CM or INC
Serial.println(" cm" );
delay(50);
if (ultraleft.Ranging(CM)<= 10 && ultraright.Ranging(CM)<= 10){ // si ambos sensores cumplen con la distancia minima, se enciende la salida.
digitalWrite(13,1);
delay(5000); //Tiempo posterior a la retirada del vehículo.
}
else{digitalWrite(13,0); // si la distancia es mayor al minimo seteado, no hay cambios en la salida.
}
}
Ahora quiero ver la posibilidad de poner un tercer sensor como seguro, es decir, que los sensores anteriores sólo funcionen si mi nuevo sensor fue activado previamente.
Quiero que cuando mi tercer sensor sea activado, exista un tiempo para que los otros dos puedan activarse.
Sólo he conseguido que funcionen si permanezco frente al tercer sensor, pero al sacar la mano, no funcina.
Estoy seguro que la respuesta debe ser muy sencilla, pero no sé mucho y estoy enredado.
Les agradecería cualquier ayuda.
Gracias de antemano.
Te ayudo pero uso otra librería <NewPing.h> en el código dejo sitio para descargarla
Funciona hasta con 15 sensores ultrasónicos.
// ---------------------------------------------------------
// This example code was used to successfully communicate
// with 15 ultrasonic sensors. You can adjust the number of
// sensors in your project by changing SONAR_NUM and the
// number of NewPing objects in the "sonar" array. You also
// need to change the pins for each sensor for the NewPing
// objects. Each sensor is pinged at 33ms intervals. So, one
// cycle of all sensors takes 495ms (33 * 15 = 495ms). The
// results are sent to the "oneSensorCycle" function which
// currently just displays the distance data. Your project
// would normally process the sensor results in this
// function (for example, decide if a robot needs to turn
// and call the turn function). Keep in mind this example is
// event-driven. Your complete sketch needs to be written so
// there's no "delay" commands and the loop() cycles at
// faster than a 33ms rate. If other processes take longer
// than 33ms, you'll need to increase PING_INTERVAL so it
// doesn't get behind.
// ---------------------------------------------------------
#include <NewPing.h> // Descargas de este sitio
// Version NewPing_v1.7.zip 2015-10-01
// https://bitbucket.org/teckel12/arduino-new-ping/downloads
#define SONAR_NUM 3 // Number or sensors.
#define MAX_DISTANCE 200 // Max distance in cm.
#define PING_INTERVAL 33 // Milliseconds between pings.
#define PinLed 13 // Pin del Led
unsigned long pingTimer[SONAR_NUM]; // When each pings.
unsigned int cm[SONAR_NUM]; // Store ping distances.
uint8_t currentSensor = 0; // Which sensor is active.
// Ultrasonic ultraleft (11,10,11600); // (Trig PIN,Echo PIN)
// Ultrasonic ultraright(7,6,11600);
NewPing sonar[SONAR_NUM] = { // Sensor object array.
NewPing(11, 10, MAX_DISTANCE),
NewPing(7, 6, MAX_DISTANCE),
NewPing(5, 4, MAX_DISTANCE),
};
void setup() {
Serial.begin(9600);
pinMode(PinLed,OUTPUT);
pingTimer[0] = millis() + 75; // First ping start in ms.
for (uint8_t i = 1; i < SONAR_NUM; i++)
pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
}
void loop() {
for (uint8_t i = 0; i < SONAR_NUM; i++) {
if (millis() >= pingTimer[i]) {
pingTimer[i] += PING_INTERVAL * SONAR_NUM;
if (i == 0 && currentSensor == SONAR_NUM - 1)
oneSensorCycle(); // Do something with results.
sonar[currentSensor].timer_stop();
currentSensor = i;
cm[currentSensor] = 0;
sonar[currentSensor].ping_timer(echoCheck);
}
}
// The rest of your code would go here.
// cm[X] tiene los datos de los sensores
if (cm[0] < 0 && cm[1] < 10 && cm[2] < 10)
digitalWrite(PinLed, HIGH);
else
digitalWrite(PinLed, LOW);
}
void echoCheck() { // If ping echo, set distance to array.
if (sonar[currentSensor].check_timer())
cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}
void oneSensorCycle() { // Do something with the results.
for (uint8_t i = 0; i < SONAR_NUM; i++) {
Serial.print(i);
Serial.print("=");
Serial.print(cm[i]);
Serial.print("cm ");
}
Serial.println();
}
Te dije que es una librería nueva, te pongo dentro del código donde descargas la librería. Mas fácil imposible.
ahi la librería. Se llama NewPing y casi todos aquí usan esta librería.
include <NewPing.h> // Descargas de este sitio [color=#222222][/color]
// Version NewPing_v1.7.zip 2015-10-01[color=#222222][/color]
// https://bitbucket.org/teckel12/arduino-new-ping/downloads[color=#222222][/color]
Te resuelvo el problema usando una librería que esta actualizada a pocos meses y que usa toda la comunidad Arduino.
Que no te gusta de la solución?
Ese código que te puse que ni siquiera probaste, es la solución a TODO tu problema. Es código y librería. Te puse que yo no uso TU LIBRERIA.
Al menos ten la dignidad de probarlo ya que invertí tiempo en tu problema.
Te diré porque no funciona tu solución o al menos hasta donde llegaste. Porque usa PULSEIN para detectar el eco y si no lo detecta demora 11600 miliseg o sea 11.6 seg x 3 son 34.8 seg
Y todo luce como una tortuga que no quiere moverse.
La librería que yo uso, usa un timer y no requiere TIMEOUT para cuando no detecta eco.
A tu código le falta agregar un sensor mas, nada mas.
Hola.!
Claro que agradezco tu respuesta y ahora que lo sé..te agradezco mucho más por tu tiempo.
Si sonó feo , perdón.
Lo que pasa es que yo no quería la solución total del problema, quería que alguien me explicara (como luego lo hiciste) qué estaba mal y que me dieran ideas de como llevar a cabo lo que faltaba.
Porque de esa forma yo aprendería en vez de copiar. No sé si me explico.
No sé practicamente nada de programar. A lo que llegué, me costó llegar y mucho. Entonces cuando vi tu código, era como leer chino.
Lo que pasa es que el ejemplo que yo use es para 15 sensores, asi que mucho mucho para aprender no hay.
Te repito una vez mas que esta librería NewPing es la mas usada aunque no tengo el ranking de uso, siempre leo consultas que la usan y la tuya es la primera vez que la veo.
Luego todo se resumía a la linea de código que compara los 3 sensores.
Tal vez no lo sepas pero medir el eco con PULSEIN tiene como problema el hecho que el sistema se queda esperando un eco hasta alcanzar el timeout indicado... imagina 10 sensores con 11.6 segundos por sensor. Son 116 segundos pero es un caso hipotético.
En el caso de esta librería NewPing, el límite esta dado por el alcance máximo.
Gracias por tu ayuda.
Creo que continuaré usando lo que ya tengo y seguir tratando de implementar lo que falta.
No entiendo muy bien lo que me explicas del PULSEIN. Lo que entiendo es que se suman los valores de timeout.
Lo que yo quiero hacer no es encadenar los sensores, sino que actuen como interruptores.
cuando los dos interruptores A y B esten accionados, se encienda la chicharra. Esto ya lo hice.
Ahora, para que A y B funcionen primero quiero que C estè accionado, sino, que no sea posible accionarlos.
Como no lo entiendes? No entiendes que si los 3 sensores no detectan nada consumen mas de 30 segundos para contestar algo? Eso es el timeout, time tiempo out fuera, tiempo fuera, cuanto tiempo espera para respoder algo cuando no tiene pulso ECO.
La otra rutina no usa este sistema y no consume tiempo.