Paso 3: Módulo de transmisor de Arduino
Vamos a empezar haciendo los transmisores. Todos son construidos y codificados de la misma manera, la única diferencia es el número de identificación que añadimos en el código. Vamos a comenzar por cableado para arriba.
Usé el pin 2 en el Arduino para pin de datos y el pin 3 pin de datos del transmisoral receptor. El receptor tiene 2 pines de datos idénticos, basta con utilizar uno. La fotocélula es conectada al pin A0 en el Arduino. Sin embargo, necesitará usar un resistor conectado a uno de los pernos de la fotocélula. Mayoría de las veces, una Resistencia Ω de 10 k es suficiente, pero si va a utilizar en una sala brillante, puede que necesite para sustituirla por una resistencia de 1 k Ω, ya que probablemente se saturarán.
Ahora pasemos al código. Utilizaremos una librería llamada RadioHead enviar y recibido el mensaje con los transmisores/receptores de RF. El necesita es el llamado RH_ASK, que significa RadioHead Amplitude S3.wedding Kpresiente. Usted puede encontrar en este sitio web. Usted también necesitará la librería SPI (Serial Peripheral nterface) que se utiliza para la comunicación entre dos microcontroladores. No es utilizado en el código pero es necesario compilarlo.
#include < RH_ASK.h > / / Biblioteca de Radiohead para módulos de RF#include <SPI.h > / / no se usa pero necesaria para compilar
El siguiente paso es crear el objeto RH_ASK que denominamos driver. Si no se especifica ningún parámetro, se creará con sus configuraciones por defecto que son:
- Velocidad = 2000bps
- Pin RX = 11 (Receive)
- Pin de TX = 12 (Transmit)
- Pin de PTT = 10 (Push to talk)
Como utilizo los pines 2 y 3, será especificar los parámetros. El tipo de módulos de RF que estamos utilizando no tienen la función de Ptt, por lo que pueden ignorar, a menos que conecte algo al pin 10, en cuyo caso es necesario establecer el Ptt del perno a un pin sin usar (o -1) como causar algún disturbio de lo contrario.
Controlador RH_ASK (2000, 2, 3); Ajuste el pin RX (receptor) a 2 y el pin de TX (transmisor) a 3Aquí están las variables globales utilizadas en el código:
La variable de ambiente es número de identificación de Arduino. Necesita incrementarlo para cada transmisor Arduino se utiliza.
La variable startRequest se compone de la letra "a" seguido del número de identificación. El transmisor Arduino comparará la solicitud que reciba de la "madre" Arduino en esta cadena. Si coinciden, enviará nuevamente los datos leídos desde el sensor.
La variable photocellPin es el pin que está conectada la fotocélula.
La variable photocellReading guarda el valor leído de la fotocélula.
String startRequest = "a"String(room); Cadena de petición enviado por la "madre" Arduino
constint photocellPin = A0; Pin de fotocélula
int photocellReading; Variable para almacenar lectura de fotocélula
La parte de configuración es bastante sencilla. Necesita configurar el pin de la fotocélula a modo de entrada y, si quiere, empezar la comunicación Serial para la depuración.
voidsetup(){
pinMode (photocellPin, entrada);
Serie.begin(9600); Para la depuración
Si (! driver.init()) / / si los módulos de RF se ha podido inicializar
Serie.println ("init error");
}
En la parte del bucle escribimos el código que se encarga de la recepción de las solicitudes y la transmisión de los datos. Empezaremos por crear un búfer largo de 2 bytes que almacenará la petición recibida. El formato de uint8_t es igual a un bytey significa entero sin signo de 8 bits de longitud. También tenemos que especificar su longitud en la variable buflen .
voidloop(){
uint8_t buf [2]; Buffer para guardar la solicitud recibida, su tamaño se establece en 2 bytes como la petición es: "a" + String(room) (eg. a0)
uint8_t buflen = sizeof(buf);
Una vez que el receptor de RF recibe un mensaje de tamaño buflen, almacena en buf. Como el formato del mensaje es una matriz de bytes, tenemos que guardarla en una variable de cadena para comparar a la solicitud prevista. Esto se hace asignando la variable buf , precedido por (char *). Tenga en cuenta que el * significa que los caracteres creado serán punteros en bytes, que no usa cualquier almacenamiento de información adicional.
Cuando he probado esto, algunas veces recibió la petición seguida por algunos caracteres extraños que hizo imposible la comparación. Por lo tanto, mantendrá sólo los dos primeros caracteres del mensaje mediante el uso de la cadena la función substring.
Si (driver.recv (buf & buflen)) / / tras la recepción de una solicitud{
Petición de la cadena = (char *) buf; Guardar la solicitud en una cadena de comparación
petición = request.substring (0, 2); Mensaje recibido a veces va seguido de caracteres extraños, manteniendo sólo los dos primeros
Serie.print ("Got petición:"); Imprimir la solicitud recibida para la depuración
Serie.println(request);
Ahora que tenemos nuestra petición almacenado en una variable de cadena, podemos compararlo a la solicitud de lo que esperábamos, que es startRequest que creamos al principio.
Si (solicitud == startRequest) / / si la petición coincide con la petición de inicio de este Arduino, medir los datos y enviarlo{
Serie.println ("iniciar solicitud recibida");
Serie.println("");
Delay(150);
Si la solicitud recibida coincide con la startRequest, el Arduino tiene que devolver algunos datos. Así que empezar por leer estos datos, en este caso de la fotocélula mediante la función analogRead y almacenarlo en la variable photocellReading . Esto nos da un valor entre 0 y 1023, pero esto no es práctico para analizar como varía la longitud del valor. Por lo tanto usaremos la función map para asignar el valor a un número entre 100 y 999, que es siempre 3 dígitos.
Envío de datosSerie.println ("enviar datos");
Serie.println("");
photocellReading = analogRead(photocellPin); Medición de luminosidad
Serie.print ("lectura de fotocélula:");
Serie.println(photocellReading); Para la depuración
Asignación de los datos a un número entre 100 y 999 para que sea siempre 3 dígitos, lo que facilita analizar la madre Arduino
int mapPhotocellReading = mapa (photocellReading, 0, 1023, 100, 999);
Una vez tengamos nuestros datos correctamente asignadas, tenemos que enviar a la "madre" Arduino. Para asegurarse de que no mezcla los datos, vamos a añadir número de identificación de la sala al principio del mensaje que enviaremos. Después de eso, crear una matriz de char (1 byte más largo que la longitud del mensaje) y usando la cadena función toCharArraycopiar nuestro mensaje.
String str = habitación + String(mapPhotocellReading); Creación de una cadena que contiene el número de habitación y de lectura para que la "madre" Arduino sepa dónde vienedatos Char [5]; Char array para almacenar la respuesta, tiene que ser 1 byte ya que la longitud de la cadena
str.toCharArray (datos, 5); Copia de cadena en matriz de char
Ahora todo lo que queda por hacer es enviar el mensaje. Esto se hace mediante el método de Enviar del objeto conductor en un mensaje en el formato de uint8_t . El método waitPacketSent se utiliza para asegurarse de que los datos se envían completamente antes de ejecutar el resto del código
driver.Send ((uint8_t *) datos, strlen(data)); Enviar respuestadriver.waitPacketSent(); Espera hasta que el paquete de respuesta se envía completamente
Serie.print ("datos enviados:"); Para la depuración
Serie.println(data);
Serie.println("");
}
}
}