Hola buenos días,
Me presento por estos lares, Soy Andrés. No tengo ni idea de circuitos ni electrónica pero me manejo en el desarrollo de SW. Estoy intentando juntar lo que mas me gusta y a lo que me dedico con la eléctronica de la mano de Arduino. Para ello tengo pensado un proyecto en el que entre otras cosas manejará un sensor magnético que me dirá si mi puerta está cerrada o abierta. De tal manera que mientras el sensor esté tocando significará que la puerta está cerrada.
Lógicamente, para realizar esto, tendré que tirar cable desde el sensor magnético situado en la puerta hasta el controlador (que será una caja con todos los sin fines de sensores y cables para este proyecto). En el cual tendrá pines machos para conectar el sensor con cables hembra de salida.
Se me ha ocurrido que el sensor sea una especie de Plug & Play, es decir que si está enchufado funcione y si no pues que mi código no lo tenga en cuenta y continue controlando el resto de parámetros.
Para ello necesito saber si en el Setup puedo controlar que si está enchufado lo inicialice o por el contrario no lo haga. Hablo del setup porque el sensor magnético irá supongo a los pines digitales 0/1 (Cerrado/Abierto) el cual tendría que inicializar en el setup como entrada a mi arduino y no me gustaría inicializarlo si no está conectado.
No se si estoy loco por intentar realizar este proyecto personal para la poca experiencia que tengo y además que lo veo todo muy fácil (por mi ignorancia)...
No obstante, tened paciencia conmigo porque voy semana a semana marcándome objetivos para llegar a conseguir mi meta.
Mi estimado andyparla.
Lo que necesitas con urgencia antes de seguir haciendo 20 preguntas como las que vienes haciendo es hacer un STOP e ir a DOCUMENTACION y leer y ver las clases de Arduino en Youtube que estan apenas entras a esa sección.
Sin creerme nada, haces consultas básicas que serán muy fácilmente respondidas cuando mejores tu nivel de comprensión de Arduino y electronica. Esas clases son solo deprogramación pero te van introduciendo levemente en el tema. Debes verlas o bien conseguirte uno o mas libros.
Cuando cumplas con esas clases o bien a medida que vayas avanzando mira de nuevo tu proyecto y nos cuentas si estas con mejores herramientas para entenderlo.
Mira el ejemplo del IDE que lee el estado de un boton/pulsador eso es exactamente lo mismo que tu sensor de puerta abire
Respondo tu consulta: no existe plug&Play en Arduino. Defines un pin (cosa que veras en los cursos de youtube), defines ese pin como entrada en el setup(). Luego en el loop() lees el estado del pin y tomas la acción correspondiente. Tal vez quieras encender un LED simulando una sirena por ejemplo (lo que requiere mas electrónica sea RELE o sea un transistor que comando un rele).
Las alternativas son múltiples
surbyte:
Mi estimado andyparla.
Lo que necesitas con urgencia antes de seguir haciendo 20 preguntas como las que vienes haciendo es hacer un STOP e ir a DOCUMENTACION y leer y ver las clases de Arduino en Youtube que estan apenas entras a esa sección.
Sin creerme nada, haces consultas básicas que serán muy fácilmente respondidas cuando mejores tu nivel de comprensión de Arduino y electronica. Esas clases son solo deprogramación pero te van introduciendo levemente en el tema. Debes verlas o bien conseguirte uno o mas libros.
Cuando cumplas con esas clases o bien a medida que vayas avanzando mira de nuevo tu proyecto y nos cuentas si estas con mejores herramientas para entenderlo.
Mira el ejemplo del IDE que lee el estado de un boton/pulsador eso es exactamente lo mismo que tu sensor de puerta abire
Respondo tu consulta: no existe plug&Play en Arduino. Defines un pin (cosa que veras en los cursos de youtube), defines ese pin como entrada en el setup(). Luego en el loop() lees el estado del pin y tomas la acción correspondiente. Tal vez quieras encender un LED simulando una sirena por ejemplo (lo que requiere mas electrónica sea RELE o sea un transistor que comando un rele).
Las alternativas son múltiples
Hola Gracias por tu comentario. Pero me he debido expresar mal... Se como se define un pin y como funciona la estructura de Arduino su setup y si loop. así cómo definir cada uno de los pines que utilizo tanto de entrada como de salida y que también no es necesario definir los pines analógicos. Como dije anteriormente, mi sensor es un pin digital y como tal se ha de configurar como pin de entrada (para que mi arduino sepa si está siendo pulsado (imantado) o no.
Ahora intento explicarme algo mejor.
Lo que quiero es no definir ese pin digital (que si requiere definirse en el setup) si no está conectado a mi arduino para que mi loop no lo tenga en cuenta y por tanto no pete mi desarrollo esperando una respuesta de un pin inexistente porque no está conectado..
Por cierto, gracias. miraré los manuales que me indicas que mal no me vienen
Si tu loop que no se que hará porque no dices que hace tu loop no espera respuesa de un pin inexistente es como si lo hiciera y solo gasta unos microsegundos en hacerlo.
Dime vale la pena suponiendo que se pudiera hacer lo que pretendes escribir algun tipo de rutina inteligente para que se diera cuenta de un pin que puede o no usarse?
No recuerdo cuanto demora algo como digitalRead(Pin); en microsegundos pero el costo de escribir algo que haga lo que tu quieres no me parece significativo.
Dime cual es la ventaja? Porque tu idea surge porque algo te molesta o no?
surbyte:
Si tu loop que no se que hará porque no dices que hace tu loop no espera respuesa de un pin inexistente es como si lo hiciera y solo gasta unos microsegundos en hacerlo.
Dime vale la pena suponiendo que se pudiera hacer lo que pretendes escribir algun tipo de rutina inteligente para que se diera cuenta de un pin que puede o no usarse?
No recuerdo cuanto demora algo como digitalRead(Pin); en microsegundos pero el costo de escribir algo que haga lo que tu quieres no me parece significativo.
Dime cual es la ventaja? Porque tu idea surge porque algo te molesta o no?
Claro mi ordenador o centro de datos, le he incorporado tiene un check de sensores y además puedes configurar cada uno de los sensores por ejemplo el de LDR me mide la luz actual de la habitación dando al usuario un %. Con ese porcentaje, el usuario puede configurar si quiere que se encienda la luz principal con más o menos luz ambiental.
En el caso del sensor magnético, lo tengo planteado como externo al centro debido a que tiene que estar en la puerta. Si el usuario me lo conecta perfecto (Porque el check lo leera y me dirá el estado del sensor) pero si no me lo conecta no hay dato de entrada por lo que si yo le digo al setup pinMode(XX, INPUT); supongo que el controlador arduino petará porque no hay nada conectado o en su defecto no pete, pero si hago digitalRead(XX); seguramente si que falle o que me devuelva 0 lo que para mi es que está cerrado y no es así.
hola, un pin digital solo puede tener dos estados, 1 o 0 como bien sabes, si necesitas tres estados 1, 0 u NO_CONECTADO puedes usar dos pines digitales, el del sensor en si y otro que tenga activada la PULLUP interna y al final de tu cable donde el sensor, lo cortocircuitas con VCC, asi a tu sensor tendrian que llegar 4 hilos VCC, GND, VALOR, PRESENCIA
Tambien lo podrias hacer (y de hecho se hace mucho) es usar un pin analogico, si es un final de carrera o un reed:
Una resistencia a +5V en el arduino, una igual en el sensor a 0V y el contacto NA del final de carrea directamente a 0V
asi tendras no conectado: lectura 5V
conectado y abiero: 2.5V (divisor de tensión entre las resistencias del arduino y la del sensor)
conectado y cerrado: 0 V
Tambien puedes usar una comunicacion 4-20ma, pero requiere mas Hard. es como se hace industrialmente para saber si la comunicacion con un sensor ha fallado, por que la corriente se vuelve 0
siendo experto en soft creia que no haria falta, y a ti tampoco me hubiera imaginad que te hiciera falta un ejemplo
enum ternary {
unknown,
true,
false
};
const int pin = 2, pin2 =3; //por ejemplo
void setup()
{
pinMode(pin, INPUT); //Valor del sensor (es posible que tubieras que definirla como INPUT_PULLUP)
pinMode(pin2, INPUT_PULLUP); //detectar el sensor
}
ternary variable = unknown;
void loop{
if (!digitalRead(pin2)){ // recuerda en el sensor poner a GND esta linea
if (digitalRead(pin)) variable =true;
else variable =false;
}
else variable =unknown;
}
Opción analógica:
enum ternary {
unknown,
true,
false
};
const int pin = A0; //por ejemplo
void setup()
{
}
ternary variable = unknown;
void loop{
if (analogRead(pin)<800){ // tendria que ser =1024, pero como es analógico ponemos 800 para asegurar
if (analogRead(pin)<10) variable =true; //tendria que ser =0 pero como es analogico
else variable =false; // aqui entra aproximadamente los 2.5V que serian =512
}
else variable =unknown;
}
GO_zalo:
hola, un pin digital solo puede tener dos estados, 1 o 0 como bien sabes, si necesitas tres estados 1, 0 u NO_CONECTADO puedes usar dos pines digitales, el del sensor en si y otro que tenga activada la PULLUP interna y al final de tu cable donde el sensor, lo cortocircuitas con VCC, asi a tu sensor tendrian que llegar 4 hilos VCC, GND, VALOR, PRESENCIA
Tambien lo podrias hacer (y de hecho se hace mucho) es usar un pin analogico, si es un final de carrera o un reed:
Una resistencia a +5V en el arduino, una igual en el sensor a 0V y el contacto NA del final de carrea directamente a 0V
asi tendras no conectado: lectura 5V
conectado y abiero: 2.5V (divisor de tensión entre las resistencias del arduino y la del sensor)
conectado y cerrado: 0 V
Tambien puedes usar una comunicacion 4-20ma, pero requiere mas Hard. es como se hace industrialmente para saber si la comunicacion con un sensor ha fallado, por que la corriente se vuelve 0
Hummm.. La opción del analógico no la había pensado...
Pensé que el sensor magnético era únicamente digital por no tener término medio, o está cerrando el circuito o está abierto.
Aunque para mi tiene sentido porque al no estar conectado devolverá 0 siempre, si está conectado y cerrando el circuito devolverá los 1024 y si no está cerrando devolverá devolverá los 1024 - la resistencia que ejerza el sensor, ¿no?
Hola,
Respondo a este tema para ponerlo como solucionado.
Tal como decía nuestro compañero @GO_zalo He puesto el sensor en un pin Analogico (Concretamente en el A2)
lo que hago es en el loop leerlo siempre mediante un metodo dedicado a ello (Ya que me da la info de si mi puerta está abierta o no)
/**
* Indica si la puerta esta:
* 0 (Cerrada), 1 (Abierta), -1 (No detectado Sensor)
*/
int lecturaSensor(){
long lectura = analogRead(A2);
int retorno = -1;
if(lectura > 500){
//Sensor magnetico estado abierto
retorno = 0;
}
else if(lectura < 20){
//Sensor magnetico estado Cerrado
retorno = 1;
}
//1-Si el sensor esta en estado cerrado los valores retornados por el analogRead oscilan entre 13 - 15
//2-Si el sensor esta en estado abierto los valores retornados por el analogRead oscilan entre 745 - 750
//3-Si el sensor no esta conectado los valores retornados por el analogRead oscilan entre 45 y 50
}
De esta manera al hacer un checkeo de los componentes sabría indicarle al usuario que no ha enchufado su sensor magnético
Tengo una pregunta sobre los valores que retorna el analogRead. Sobre la base que he ido cogiendo,
siempre he entendido que si el AnalogRead retorna hasta 1024 lo cual es 100% del voltaje circulando por el componente.
Para el caso del Sensor magnético, (No se como funciona un sensor magnético pero para mi es como un switch abierto, cerrado)
Se supone que en estado abierto No debería circular corriente (sin embargo me retorna 745 que es el máximo menos la resistencia que tenga el sensor)
Si está cerrado me retorna 15.
y no conectado 45.
No entiendo muy bien el por qué de estos valores. que para mi deberían ser al contrario al menos que anlogRead retorne la resistencia ejercida lo que si tendría sentido según esos valores que retorna pero no tendría sentido el funcionamiento que pensaba que tenía el analogRead en mi cabeza..
Tienes que poner que sensor usas exactamente por que lo hay que se comportan como un interruptor y los hay que tienen una salida digital, también pon un esquema de como lo tienes conectado.
Analogread lee el voltaje que hay en un punto, sin alterarlo. tendrías que estudiar la ley de ohm para ver como las resistencias provocan caídas de tensión proporcionalmente a la corriente que circula por ella, y como la corriente es a su fe función de la tensión y del total de resistencias
GO_zalo:
Tienes que poner que sensor usas exactamente por que lo hay que se comportan como un interruptor y los hay que tienen una salida digital, también pon un esquema de como lo tienes conectado.
Analogread lee el voltaje que hay en un punto, sin alterarlo. tendrías que estudiar la ley de ohm para ver como las resistencias provocan caídas de tensión proporcionalmente a la corriente que circula por ella, y como la corriente es a su fe función de la tensión y del total de resistencias
No se pone ya esta solucionado y no aportas nada mas.
El compromiso de cada forero que pide ayuda es ser explícito para el que venga y vea tu problema tenga planteo, desarrollo y solución de un problema.
andyparla:
Hola,
Respondo a este tema para ponerlo como solucionado.
Tal como decía nuestro compañero @GO_zalo He puesto el sensor en un pin Analogico (Concretamente en el A2)
lo que hago es en el loop leerlo siempre mediante un metodo dedicado a ello (Ya que me da la info de si mi puerta está abierta o no)
/**
Indica si la puerta esta:
0 (Cerrada), 1 (Abierta), -1 (No detectado Sensor)
*/
int lecturaSensor(){
long lectura = analogRead(A2);
int retorno = -1;
if(lectura > 500){
//Sensor magnetico estado abierto
retorno = 0;
}
else if(lectura < 20){
//Sensor magnetico estado Cerrado
retorno = 1;
}
//1-Si el sensor esta en estado cerrado los valores retornados por el analogRead oscilan entre 13 - 15
//2-Si el sensor esta en estado abierto los valores retornados por el analogRead oscilan entre 745 - 750
//3-Si el sensor no esta conectado los valores retornados por el analogRead oscilan entre 45 y 50
}
De esta manera al hacer un checkeo de los componentes sabría indicarle al usuario que no ha enchufado su sensor magnético
Tengo una pregunta sobre los valores que retorna el analogRead. Sobre la base que he ido cogiendo,
siempre he entendido que si el AnalogRead retorna hasta 1024 lo cual es 100% del voltaje circulando por el componente.
Para el caso del Sensor magnético, (No se como funciona un sensor magnético pero para mi es como un switch abierto, cerrado)
Se supone que en estado abierto No debería circular corriente (sin embargo me retorna 745 que es el máximo menos la resistencia que tenga el sensor)
Si está cerrado me retorna 15.
y no conectado 45.
No entiendo muy bien el por qué de estos valores. que para mi deberían ser al contrario al menos que anlogRead retorne la resistencia ejercida lo que si tendría sentido según esos valores que retorna pero no tendría sentido el funcionamiento que pensaba que tenía el analogRead en mi cabeza..
Quiza lo que no te cuadra es que la señal de ese sensor es normalmente cerrada,es decir sin el iman delante ,da señal (el voltaje al que lo hayas conectado) y con el iman delante no da señal.por lo menos asi funciona el que yo tengo ,que es igual que ese.
Eso no es lo que el pidió en tu título o yo mal entendí la idea de este tema.
El habló de Plug & play.
Go_zalo le planteó una forma muy interesante de hacerlo.
Y el sale con otra cosa o a mi me lo parece?