Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Plataforma de sensores ambientales de modo múltiple con MKR1000

Componentes y suministros

Arduino MKR1000
× 1
Sensor de rayos MOD-1016
× 1
Sensor de gas DFRobot MQ-9
× 1
Sensor de temperatura y humedad Adafruit
× 1
Sensor de presión / altitud / temperatura de Adafruit
× 1
Sensor UV SparkFun ML8511
× 1
chronodot RTC
× 1
SparkFun Photon Weather Shield
× 1
Adafruit neopixels
× 1
Breadboard (genérico)
× 1
Cables de puente (genéricos)
× 1

Acerca de este proyecto

Me encanta ver el clima y quería intentar capturarlo y graficarlo. Las estaciones meteorológicas locales me permiten ver los detalles de "ahora" y, a veces, los recuentos de la última hora o día. Quería hacer más y usar un Arduino para el trabajo. Todo el mundo empieza con la temperatura y la humedad, a veces con la presión barométrica, ¡pero yo quería más! La medición de la velocidad del viento y la lluvia querían entradas de hardware. Una vez que dominé el uso de i2c, ¡encontré cosas como el detector de rayos AS3935! Y luego la tristeza se apoderó de mí ... No tenía suficientes interrupciones de hardware para hacer el trabajo con su Arduino básico. Sparkfun incluso tiene una placa de sensor meteorológico para Photon, pero aún es limitada. Tendría que elegir y prescindir de algunos de los sensores. :-(

Luego vi el MKR1000 , y encontré la MEJOR FUNCIÓN, ¡tiene 8 interrupciones de hardware! ¡Ahora podría tenerlo todo!

Elección de sus sensores

Los sensores vienen en tres sabores básicos;

  • Analógico :luz (incluidos IR y UV), dirección del viento, gases, células de carga ...
  • I2C :temperatura, humedad, presión atmosférica, acelerómetro, giroscopio ...
  • Interrupciones :volquetes de lluvia, velocidad del viento, relámpagos, temporizadores ... (funciones como serie, PWM, relojes, servos utilizan interrupciones de tiempo)

¡El MKR1000 tiene muchas E / S para todos estos!

¡TENGA EN CUENTA QUÉ VOLTAJE NECESITA PARA SU E / S en I2C e interrupciones! Por ejemplo, el MKR1000, el Photon y muchas versiones de Arduino usan E / S de 3.3v en lugar de 5v. Si su CPU y los sensores que desea usan diferentes voltajes, también necesitará usar cambiadores de nivel entre esos dispositivos.

Todos los sensores que he estado usando son lo suficientemente comunes, disponibles en Adafruit, SparkFun, Element-14 y otros, y generalmente cuestan entre $ 5 y $ 10 (EE. UU.). Los sensores de gas generalmente cuestan entre $ 10 y $ 20. Para el detector de rayos (chip AS3935), elegí el Embedded Adventures MOD-1016, que cuesta $ 26 (EE. UU.) Para colocar la antena en la placa también. También compré el Sparkfun Photon Weather Shield, ya que tengo un Photon, y probablemente compraré sus "medidores meteorológicos" (instrumentos de dirección y velocidad del viento). Tal vez agregue un sensor de humedad del suelo, una vez que averigüe dónde montaré el MKR1000. A algunos sensores no les gusta tener cables largos.

Asigne sus sensores a los pines

Una vez que sepa qué sensores desea, sabrá qué tipo de entradas necesitará, el siguiente paso es decidir qué sensores irán en qué pines. Empiezo en papel, pero también agregaré esta lista como un comentario de bloque en mi código, como recordatorio.

Aquí están las asignaciones de pines MKR1000 que hice para mi plataforma de sensores.

  • A0 (Estoy guardando A0 en caso de que necesite el DAC más adelante ...)
  • A1 Sensor UV ML8511
  • A2 sensor de luz visible
  • A3 Sensor de temperatura local TMP36
  • A4 Sensor de gas MQ-9
  • A5 sensor de humedad
  • A6 sensor de velocidad del viento?
  • 0 (HW INT) botón
  • 1 (HW INT) AS Detector de rayos
  • 2 (HW INT) anemómetro de velocidad del viento (interrupción por rotación)
  • 3 (HW INT) Volquete para lluvia ...
  • 4
  • 5
  • 6 (compartido con LED integrado)
  • 7 Salida de NeoPixel ...

Comenzando ...

Para los principiantes entre ustedes, sugiero comenzar con cada sensor que va a usar, uno a la vez, y comenzar cargando el código de ejemplo e instalando las bibliotecas necesarias. Recuerde cambiar el pin del sensor para que coincida con la asignación de pin de su elección y guarde una copia del código de demostración en la carpeta de su proyecto.

Cuando pueda ejecutar el código de prueba y leer los resultados del Serial Monitor, estará listo para intentar agregar otro. Y cuando haya terminado de probar cada sensor, ¡ahora están todos conectados y listos para comenzar a construir su boceto más grande!

Mi retoque original con los sensores incluía el uso de un reloj de tiempo de respuesta (RTC) basado en i2c, para poder iniciar sesión en una tarjeta de memoria SD. Aunque el MKR1000 tiene su propio RTC y una batería, no he podido hacer que el reloj marque el tiempo solo con la batería, por lo que también me quedaré con el ChronoDot v2.1 i2c RTC.

Al mirar la placa de pruebas en mi imagen a continuación, puede ver los diversos puentes en uso. Los naranjas son para la potencia de 3.3v para cada sensor, por lo que solo puedo enchufarlos cuando esté listo para trabajar con ellos. (Es fácil desactivar un sensor desconectando el puente naranja).

Una nota sobre las bibliotecas

Descubrí que algunas de las bibliotecas que puede instalar NO funcionan perfectamente con el MKR1000 y / o con Arduino.cc IDE versión 1.6.7, y es posible que deba realizar algunos ajustes, dependiendo de la antigüedad de su sensor es. Un ejemplo de esto son las macros ATOMIC_ * más antiguas en la AVR libc más antigua. biblioteca (se eliminaron en Arduino IDE 1.6.5), y hay un gran hilo sobre problemas y soluciones sugeridas en un hilo del foro en Arduino.cc. Hacer algunos de los cambios sugeridos es algo para un hacker Arduino intermedio, pero probablemente será intimidante para los hackers más nuevos. Y, para bibliotecas un poco más antiguas, es posible que el autor original no esté presente para actualizar la biblioteca y eliminar la dependencia.

Desafortunadamente, por lo general, no podrá saber qué bibliotecas deben ajustarse antes de comprar sus sensores y probarlos. En ese punto, te recomiendo que mires los mensajes de error que aparecen en naranja cuando intentas cargar tu boceto con cuidado, para ver si el problema está en tu código, o en una biblioteca, antes de comenzar a cambiar tu código. Si está en la biblioteca, haga una búsqueda en la web de "arduino" y el mensaje de error. Si no puede encontrar una solución, intente enviar un correo electrónico al autor y avísele sobre el error, y tal vez actualice la biblioteca.

He comprado fichas individuales para intentar ahorrar dinero. He decidido que, hasta que esté listo y pueda hacer mis propias placas de circuito (probablemente usando EagleCAD y OSHPark), es más fácil comprar módulos de sensores de Adafruit y SparkFun, ya que son excelentes para mantener sus bibliotecas parcheadas.

Un poco sobre WiFi y cifrado

También pensé en el wifi para hacer que mis sensores meteorológicos informaran en un sitio web. ¡Incluso tenemos un motor de cifrado en el MKR1000, para ayudar a mantener nuestros datos seguros en tránsito a través de Internet! Pero eso es más de lo que podré hacer en este primer proyecto. Está en mi lista de cosas por hacer, porque hacer que la seguridad de los datos sea parte de su diseño es importante para el Internet de las cosas, pero me estoy quedando sin tiempo para agregar mi entrada para el concurso MKR1000. Esté atento a mi "versión 2" de este proyecto. Aquí hay un diagrama de bloques del módulo SAMD que es el corazón de su placa.

Puedo ofrecerte un consejo para comenzar con el WiFi integrado: ¡Asegúrate de estar usando la versión más actual de la biblioteca WiFi101! Si no lo hace, su boceto no reconocerá el módulo wifi, y sus bocetos wifi solo informarán si hay un error al verificar las llamadas al módulo wifi.) Necesito agradecer a Charif Mahmoudi por señalar eso en su gran tutorial "Getting Started with MKR1000" aquí en Hackster! En el momento de mi piratería, puedes encontrar el WiFi101 Githuib aquí.

Consejos para sensores analógicos

La mayoría de los módulos de sensor de "salida analógica" producirán una salida de voltaje analógica simple, y esto se puede leer fácilmente usando analogRead del pin del sensor. Pero entonces necesitas saber qué significa eso. Normalmente, necesitará utilizar el mapa comando, o puede que necesite realizar un poco de matemática. Los elementos resistivos generalmente necesitarán algunos circuitos adicionales. Es posible que desee agregar un potenciómetro para "ajustar" el voltaje.

En otros casos, necesitará ecuaciones para convertir el voltaje de salida en algo que los humanos comprendan. El TMP36 El sensor de temperatura es un ejemplo bien documentado de esto. Esta parte fue diseñada para leerse en grados Celsius, por lo que debe medir el voltaje y hacer algunos cálculos matemáticos para obtener C, y si desea Fahrenheit, deberá convertir C en F. explique cómo funciona la pieza, pero le resultará más fácil seguir los pasos de otra persona a medida que aumenta su experiencia.

Sin embargo, otros sensores necesitan un amplificador para hacer que los pequeños cambios de voltaje sean lo suficientemente grandes como para que su ADC obtenga un buen rango de alto a bajo. Este tipo de sensores (celdas de carga, humedad, acelerómetro) es donde encuentro que es mejor gastar algo de dinero y comprar un módulo que ya tiene un amplificador y una biblioteca para ayudar a comprender el rango de salida.

Consejos para usar dispositivos I2C

I2C a veces se denomina "interfaz de dos cables", porque necesita una señal de reloj, así como una señal de datos. (Solo necesita un cable de datos, porque el "maestro" y el "esclavo (s)" se turnarán para enviar datos). Por supuesto, sus sensores I2C también necesitarán una conexión a tierra y un cable de alimentación, y eso el cable de tierra debe estar conectado a su CPU.

Cada dispositivo I2C tendrá una dirección hexadecimal en el bus. Es mejor evitar el uso de varios dispositivos con la misma dirección. (Si desea tener múltiples, debe administrarlos con circuitos adicionales, para "habilitar" el que desea comunicarse, y luego deshabilitarlo cuando haya terminado, antes de habilitar otro para la comunicación). debería decirle qué dirección (es) puede tener un dispositivo. ( NOTA : Si tiene dos dispositivos en el bus I2C con la misma dirección, y ambos tienen un pin "Activar" o "Apagar", podrá desactivar uno mientras el otro está activo. Sin embargo, no puede simplemente apagar la clavija vdd, ya que los sensores pueden tomar algo de energía de las clavijas SDA y SCL, y darán como resultado malas lecturas para esa dirección. La comprobación de errores de I2C no es lo suficientemente buena para detectar / corregir en este caso. )

Las especificaciones I2C nos dicen que deberíamos tener una resistencia pull-up "fuerte" tanto en el reloj como en los cables de datos, en el sensor que está más alejado del cable. Debido a esto, algunos módulos de sensores ya tienen resistencias a bordo, y es posible que solo necesite agregar un par de puentes, así que asegúrese de leer la documentación de los módulos.

Además de las "resistencias de terminación de bus", también encontré una sugerencia de un pirata informático hace mucho tiempo, para agregar una resistencia en línea tanto en los cables de datos (SDA) como de reloj (SCL). Esto mejoró enormemente la confiabilidad de las lecturas de datos de un par de sensores. Con el MKR1000, usando señalización de 3.3v, estoy usando resistencias de 220 ohmios. En una CPU de 5 v, es posible que desee probar con 330 ohmios. Consulte el esquema a continuación para ver la diferencia en las ubicaciones.

¿Qué vas a hacer con los datos?

En este momento, solo lo estoy enviando al Monitor en serie. Podría agregar una pantalla LCD. Iba a agregar una tarjeta SD, pero ahora que tengo wifi incorporado, quiero subir los datos a una nube ... imagina tener algunas de estas plataformas de sensores, conocer su latitud y longitud, y poder para triangular un rayo comparando las lecturas de potencia de cada estación para un rayo dado.

A UN LADO :2017-11-29; No he podido hacer funcionar las interrupciones de hardware en el MKR1000. Estoy haciendo notas y experimentos con sensores para una clase de 9. ° grado (13-14 años), y tal vez encuentres los bocetos interesantes. La clase se basa en la placa Adalogger M0 y guarda los datos en una tarjeta SD, y todavía hay muchos pines para un módulo WiFi. http://arduinoclass.pbworks.com

Mientras trabajaba en los sensores, también vi la lámpara SODERSVIK en IKEA (vea la imagen a continuación). Imagine reemplazar los LED blancos dentro de esta lámpara con 20 Neopixels y agregar un receptor remoto de infrarrojos. El viento que sopla podría verse como nubes rodando, y el color podría indicar la temperatura. El control remoto también podría optar por mostrar momentáneamente otra información, como el cambio de temperatura durante las últimas 12 horas.

¿Qué desea monitorear y mostrar?

Código

  • El esquema de monitoreo completo
  • Realización de una lectura analógica promedio
  • Escáner de bus I2C
  • Código de demostración ML8511
El esquema de monitoreo completo Arduino
Hay muchos sensores que informan en este esquema y las bibliotecas funcionan bien juntas. Sin embargo, los métodos clásicos de bloqueo de interrupciones en AVR-libc se han eliminado en las versiones recientes del IDE de Arduino, que ha desactivado las bibliotecas para NeoPixel y para el sensor Lightning. Espero que esto se resuelva este año en algún momento, pero significa que los he dejado fuera del boceto final.
 / * RTC-Weather-Sensors_v6_MKR1000 por Zonker Harris Primavera 2016 * ¡Hurra! ¡Una placa pequeña, con más de 2 interrupciones de hardware! * Más WiFi, * y * criptografía (¡MUY necesario para aplicaciones de IoT!) * * Nota para los hackers más nuevos:puse MUCHOS comentarios en mi código, como pueden ver. * Cuando haces clic en cargar, * los comentarios se IGNORAN *, ¡y no se comen la memoria! * Te recomiendo que también agregues muchos comentarios cuando realices cambios * y adiciones, para ayudarte a recordar POR QUÉ hiciste lo que hiciste hace meses. * También ayudarán a aquellos que vengan después de ti, a aprender un par de cosas. * * Ahora, las bibliotecas * SÍ * cuentan para la memoria de su programa ... * / # include  #include  #include  #include  // Incluyendo neopixels como marcador de posición, pero el vector de interrupción de la biblioteca debe actualizarse .// Incluya la biblioteca Adafruit_NeoPixel https://github.com/adafruit/Adafruit_NeoPixel//#include  // const int numLeds =1; // ¿Cuántos neopíxeles hay en la cadena? utilizado para configurar la biblioteca de NeoPixel // Parámetro 1 =número de píxeles en la tira // Parámetro 2 =número de pin (la mayoría son válidos) // Parámetro 3 =banderas de tipo de píxel, sume según sea necesario:// NEO_RGB Los píxeles están conectados para RGB bitstream // NEO_GRB Los píxeles están conectados para GRB bitstream // NEO_KHZ400 400 KHz bitstream (por ejemplo, FLORA píxeles) // NEO_KHZ800 800 KHz bitstream (por ejemplo, tira de LED de alta densidad) // Adafruit_NeoPixel strip =Adafruit_NeoPixel (numLeds, 6, NEO_GRB + NEO_KHZ800); / * El controlador BMP085_U utiliza la biblioteca de sensores unificada Adafruit (Adafruit_Sensor), que proporciona un 'tipo' común para los datos del sensor y algunas funciones auxiliares. (El BMP180 es compatible con esta biblioteca y ofrece el mismo resultado, pero la biblioteca identificará el BMP180 como BMP085). Para usar este controlador, también deberá descargar la biblioteca Adafruit_Sensor e incluirla en la carpeta de bibliotecas. También debe asignar una ID única a este sensor para usar con la API de Adafruit Sensor para que pueda identificar este sensor en particular en cualquier registro de datos, etc. Para asignar una ID única, simplemente proporcione un valor apropiado en el constructor a continuación (12345 es utilizado por defecto en este ejemplo). * / Adafruit_BMP085_Unified bmp =Adafruit_BMP085_Unified (10180); / * Este boceto también está diseñado para funcionar con el sensor HTU21D-F de Adafruit ----> https://www.adafruit.com/products/1899 * / Adafruit_HTU21DF htu =Adafruit_HTU21DF (); / * Macetech Chronodot v2.1 Reloj en tiempo real (RTC) respaldado por batería ... http://docs.macetech.com/doku.php/chronodot (porque la batería de mi MKR1000 no parece mantener vivo el RTC integrado) Información de la biblioteca Adafruit Real-Time Clock (RTC) https://learn.adafruit.com/adafruit-data-logger-shield/using-the-real-time-clock Dispositivos analógicos TMP36 analógico sensor de temperatura calibrado. Esto requiere algunas matemáticas https://learn.adafruit.com/tmp36-temperature-sensor http://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf ML8511 Sensor UV ... Este sensor detecta la luz de 280-390 nm con mayor eficacia. Esto se clasifica como parte del espectro UVB (rayos ardientes) y la mayor parte del espectro UVA (rayos bronceadores). MOD-1016 (Sensor de rayos AS3935) dirección i2c 0x03 - Sensor de rayos AS3935 Adafruit tiene un anemómetro que proporciona una salida de voltaje de CC (0.4-2.0v) https://www.adafruit.com/products/1733 http:// www. instructables.com/id/Breezefinder-Citizen-Science-Windpower-Tool/step2/Build-the-housing/ El detector de humedad del suelo (sensor YL-69 o similar) requiere entrada analógica ... http://www.instructables.com / id / Arduino-LCD-Soil-Moisture-Sensor / step3 / Conectar-sensor-de-humedad / Conexiones My MKR1000 (¡Todos los sensores deben ser de señalización de 3.3v!) ===========* / int UVOUT =A1; // Salida del sensor UV MV8511int lightOut =A2; // Salida del sensor de luz visible TEMT6000int tmp36out =A3; // Salida del sensor de temperatura local TMP36int mq9out =A4; // Salida de DFrobot MQ-9 CO / Sensor Gs combustible / * Sensor de humedad A5 A6 Sensor de velocidad del viento? 0 (HW INT) pulsador 1 (HW INT) AS Detector de rayos 2 (HW INT) ¿anemómetro de velocidad del viento? (interrupción por rotación) 3 (HW INT) Volquete para lluvia… 4 5 * / int sirenaPin =6; // Salida de la sonda piezoeléctrica (compartida con el LED integrado) // (Puede usar un puente para desactivar la sirena, pero el LED integrado parpadeará) int neopixelPin =7; // Salida de NeoPixel, para visualización usando LED basados ​​en registro de desplazamiento / * 11 i2c SDA 12 i2c SCL * / // Variables de descalcificación para el Chronodot i2c RTC ... int addrRTC =(0x68); // RTC i2c addressint segundos; // BCD combinado del RTC (00h) int seconds1; // 0-9int segundos10; // 0-5int minutos; // BCD combinado del RTC (01h) int minutes1; // 0-9int minutes10; // 0-6int horas; // BCD combinado del RTC (02h) int hours1; // 0-9 int horas10; // 0-2int día; // 1-7 (03h) int fecha; // 01-31 (04h) int mes; // 01-12 (05h) int años; // 0-99; (06h) int a1secs; // (07h) obtiene la alarma 1 secondsint a1mins; // (08h) obtiene la alarma 1 minutesint a1hrs; // (09h) obtiene la alarma 1 hoursint a1daydate; // (0Ah) obtiene el día y la fecha de la alarma 1 bitsint a2mins; // (0Bh) obtiene la alarma 2 minutesint a2hrs; // (0Ch) obtiene la alarma 2 hoursint a2daydate; // (0Dh) obtiene el día y la fecha de la alarma 2 bitsint rtcstatus; // (0Eh) obtiene bits de estado de RTCint ageinginfo; // (0Fh) obtiene información de compensación de envejecimiento // ¿Qué es 10h? Int temprtc; // BCD combinado del RTC (11h) int tempfrtc; // BCD combinado del RTC (12h) / ************************************* ********************************** /// Función de configuración de Arduino (llamada automáticamente al inicio) / ** *********************************************** ********************** / void setup (void) {Serial.begin (9600); retraso (1000); Serial.println ("i2c Sensor Deck"); // ¡Recuerde configurar sus pines de entrada y salida! pinMode (UVOUT, ENTRADA); // el pinMode del sensor UV ML8511 (lightOut, INPUT); // el sensor de luz visible TEMT6000 pinMode (tmp36out, INPUT); // el pinMode del sensor de temperatura Analog Devices TMP36 (sounderPin, OUTPUT); // HIGH hará que la sirena emita ruido pinMode (neopixelPin, OUTPUT); // Use una resistencia de 220 ohmios en línea con la tira / * Inicialice el sensor BMP085 / BMP180 * / if (! Bmp.begin ()) {/ * Hubo un problema al detectar el BMP085 / 180 ... revise su conexiones * / Serial.print ("Ooops, no se detectó BMP085 / 180 ... ¡Verifique su cableado o I2C ADDR!"); mientras (1); } / * Muestra información básica sobre este sensor, BMP180 informa como BMP085 * / displaySensorDetails (); / * Inicializa el sensor HTU21D * / if (! Htu.begin ()) {Serial.println ("No se pudo encontrar el HTU21 -¡Sensor de DF! "); mientras (1); } // Inicializar el reloj Chronodot RTC // (cambiar los valores, descomentar, luego cargar para establecer la hora, luego comentarlo nuevamente) / * segundos =0; minutos =41; horas =20; día =7; fecha =3; mes =1; años =16; initChrono (); * /} bucle vacío (vacío) {bip (50, 2); // anuncia el inicio del bucle en la sonda // Establece el neopixel en Teal ... // int red =0; int verde =45; int azul =30; //strip.setPixelColor(0, (rojo, verde, azul)); //strip.show();/*************************************** **************************** // * Extraiga la dirección i2c de información de Chronot 0x68 - DS1307 RTC * // * Información de placa:http ://docs.macetech.com/doku.php/chronodot * // * Hoja de datos de DS3231:http://datasheets.maxim-ic.com/en/ds/DS3231.pdf * // ******* *********************************************** ************* / int temprtc; / * Obtener una nueva marca de tiempo * / Wire.beginTransmission (0x68); // 0x68 es la dirección del dispositivo DS3231 Wire.write ((byte) 0); // comienza en el registro 0 Wire.endTransmission (); Wire.requestFrom (0x68, 13); // solicita 19 bytes (¿es el número de bytes DEC o HEX?) // (segundos, minutos, horas, día, fecha, mes, horas, // a1secs, a1mins, a1hrs // a1secs, a1mins, a1hrs // Envejecimiento offset, Temp entero, fracción de temperatura) while (Wire.available ()) {segundos =Wire.read (); // (00h) obtener segundos minutos =Wire.read (); // (01h) obtener minutos horas =Wire.read (); // (02h) obtener las horas del día =Wire.read (); // (03h) obtener el día de la semana date =Wire.read (); // (04h) obtener la fecha del mes mes =Wire.read (); // (05h) obtiene el mes y el bit de siglo años =Wire.read (); // (06h) obtiene el año int a1secs =Wire.read (); // (07h) obtiene la alarma 1 segundos int a1mins =Wire.read (); // (08h) obtiene la alarma 1 minutos int a1hrs =Wire.read (); // (09h) obtiene la alarma 1 hora int a1daydate =Wire.read (); // (0Ah) obtiene los bits de fecha y día de la alarma 1 int a2mins =Wire.read (); // (0Bh) obtiene alarma 2 minutos int a2hrs =Wire.read (); // (0Ch) obtiene alarma 2 horas int a2daydate =Wire.read (); // (0Dh) obtiene los bits de fecha y día de la alarma 2 int rtcstatus =Wire.read (); // (0Eh) obtiene los bits de estado de RTC int ageinginfo =Wire.read (); // (0Fh) obtiene información de compensación de envejecimiento temprtc =Wire.read (); // (11h) obtiene una parte entera de la temperatura y firma tempfrtc =Wire.read (); // (12h) obtén la porción fraccionaria de la temperatura // Lee nuestros bits y normaliza los datos con un relleno de ceros a la izquierda // NOTA:El Chronodot no sabe sobre el horario de verano, ¿deberías tu código? segundos10 =((segundos &0b11110000)>> 4); segundos1 =((segundos &0b00001111)); // convierte BCD en minutos decimales10 =((minutos &0b11110000)>> 4); minutes1 =(minutos &0b00001111); // convierte BCD en horas decimales10 =(((horas &0b00100000)>> 5) * 2 + ((horas &0b00010000)>> 4) * 1); hours1 =(horas &0b00001111); // convertir BCD a decimal (asumir el modo de 24 horas) años =(años + 2000); temprtc =((temprtc &0b01111111) + (((tempfrtc &0b11000000)>> 6) * 0.25)); } obtener la fecha(); // Este es un lugar donde puede agregar decisiones de Dayligh Savings Time para modificar las horas ... Serial.print ("ChronoDot -"); Serial.print (horas10); Serial.print (horas1); Serial.print (":"); Serial.print (minutes10); Serial.print (minutos1); Serial.print (":"); Serial.print (segundos10); Serial.print (segundos1); Serial.print ("20"); Serial.print (años); Serial.print (""); Serial.print (mes); Serial.print (""); Serial.print (fecha); Serial.print ("\ t"); Serial.print (temprtc); Serial.println ("C"); retraso (100); // para que esto termine de imprimirse, en caso de que el siguiente sensor se detenga / ******************************** ************************************//* Get BMP180 data i2c address 0x77 - BMP180 Baro Pres and Temp *//* data:http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf *//******************* ************************************************** */ sensors_event_t event; bmp.getEvent(&event); /* First we get the current temperature from the BMP085/BMP180 */ float BMPtemperature; bmp.getTemperature(&BMPtemperature); float BMPtempF =(BMPtemperature * 1.8 + 32); Serial.print("Temp:"); Serial.print(BMPtemperature); Serial.print(" C ("); Serial.print(BMPtempF); Serial.print(" F) \t"); /* Display the results (barometric pressure is measure in hPa) */ if (event.pressure) { /* Display atmospheric pressue in hPa */ Serial.print("BMP180 - Pres:"); Serial.print(event.pressure); Serial.print(" hPa\t"); /* Calculating altitude with reasonable accuracy requires pressure * * sea level pressure for your position at the moment the data is * * converted, as well as the ambient temperature in degress * * celcius. If you don't have these values, a 'generic' value of * * 1013.25 hPa can be used (defined as SENSORS_PRESSURE_SEALEVELHPA * * in sensors.h), but this isn't ideal and will give variable * * results from one day to the next. * * * * You can usually find the current SLP value by looking at weather * * websites or from environmental information centers near any major * * airport. * * * * convert inches-mercury http://www.csgnetwork.com/pressinmbcvt.html * * * For example, for Paris, France you can check the current mean * * pressure and sea level at:http://bit.ly/16Au8ol */ /* Then convert the atmospheric pressure, and SLP to altitude */ /* Update this next line with the current SLP for better results */ float seaLevelPressure =SENSORS_PRESSURE_SEALEVELHPA; Serial.print("Alt:"); Serial.print(bmp.pressureToAltitude(seaLevelPressure, event.pressure)); Serial.println(" m"); retraso (100); // so this will finish printing, in case the next sensor is stalled } else { Serial.println("Sensor error"); } /**********************************************************************/* Get HTU21-DF data i2c address 0x40 - Humidity and Temp Sensor */* Then convert the atmospheric pressure, and SLP to altitude */* Update this next line with the current SLP for better results */* https://learn.adafruit.com/adafruit-htu21d-f-temperature-humidity-sensor/overview/**********************************************************************/ float HTUtemperature =htu.readTemperature(); float HTUtempF =(HTUtemperature * 1.8 + 32); Serial.print("HTU21-DF - Temp:"); Serial.print(HTUtemperature); Serial.print(" C ("); Serial.print(HTUtempF); Serial.print(" F)\tHum:"); Serial.print(htu.readHumidity()); Serial.println("%"); retraso (100); // so this will finish printing, in case the next sensor is stalled/**********************************************************************/* Analog Devices venerable TMP36 precision temperature sensor/* this requires a bit of math after reading the output.../* https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor/**********************************************************************/ //getting the voltage reading from the temperature sensor int reading =averageAnalogRead(tmp36out); // 0.0032258064516129 are the DAC unit for 3.3v float tmp36voltage =0.0032258064516129 * reading; // print out the voltage Serial.print("TMP36 - temp:"); float tmp36temperatureC =(tmp36voltage - 0.5) * 100; //converting from 10 mv per degree with 500 mV offset to degrees ((voltage - 500mV) times 100) Serial.print(tmp36temperatureC); Serial.print(" C \t"); // now convert to Fahrenheit float tmp36temperatureF =(tmp36temperatureC * 9.0 / 5.0) + 32.0; Serial.print(tmp36temperatureF); Serial.print(" F, out:"); Serial.print(tmp36voltage); Serial.println("v"); retraso (100); // so this will finish printing, in case the next sensor is stalled/********************************************************************** * Vishay TEMT6000 Visible Light sensor - analog reading * https://www.sparkfun.com/products/8688/**********************************************************************/ int vLevel =averageAnalogRead(lightOut); // 0.0032258064516129 is (3.3v (the DAC ref voltage) \ 1023 * uvLevel) float newVOutVolts =0.0032258064516129 * vLevel; Serial.print("TEMT6000 out:"); Serial.println(vLevel); retraso (100); // so this will finish printing, in case the next sensor is stalled /********************************************************************** * ML8511 UV Sensor - analog reading * https://learn.sparkfun.com/tutorials/ml8511-uv-sensor-hookup-guide */**********************************************************************/ int uvLevel =averageAnalogRead(UVOUT); // 0.0032258064516129 is (3.3v (the DAC ref voltage) \ 1023 * uvLevel) float newOutVolts =0.0032258064516129 * uvLevel; //Convert the voltage to a UV intensity level float uvIntensity =mapfloat(newOutVolts, 0.99, 2.8, 0.0, 15.0); Serial.print("ML8511 UV out:"); Serial.print(uvLevel); Serial.print(" / UV Intensity (mW/cm^2):"); Serial.println(uvIntensity); retraso (100); // so this will finish printing, in case the next sensor is stalled/********************************************************************** * DFrobot MQ-9 CO/Combustable Gas sensor - analog reading * http://www.dfrobot.com/wiki/index.php/Analog_Gas_Sensor(MQ9)_(SKU:SEN0134) * https://www.pololu.com/category/83/gas-sensors There are many available * But, deciphering what the output levels mean is an exercise for the buyer. :-(/**********************************************************************/ int MQ9volts =analogRead(mq9out); // Read Gas value from the MQ-9 sensor Serial.print("MQ-9 Gas:"); Serial.println(MQ9volts,DEC); delay(100); // so this will finish printing, in case the next sensor is stalled Serial.println(""); delay(3500); // looking to time the loop at about 5 seconds... // End of the main loop...}/**************************************************************************//* The code below are supporting subroutines */**************************************************************************//* Chronodot-related subroutines * * initChrono, set_date, get_date, set_time, get_time, get_temp, * * setHour, SetMinutes, decToBcd, bcdToDec *//**************************************************************************/void initChrono(){ set_time(); set_date();}void set_date(){ Wire.beginTransmission(104); Wire.write(4); Wire.write(decToBcd(day)); Wire.write(decToBcd(date)); Wire.write(decToBcd(mont h)); Wire.write(decToBcd(years)); Wire.endTransmission();}void get_date(){ Wire.beginTransmission(104); Wire.write(3);//set register to 3 (day) Wire.endTransmission(); Wire.requestFrom(104, 4); //get 4 bytes(day,date,month,year); day =bcdToDec(Wire.read()); date =bcdToDec(Wire.read()); month =bcdToDec(Wire.read()); years =bcdToDec(Wire.read());}void set_time(){ Wire.beginTransmission(104); Wire.write((byte)0); Wire.write(decToBcd(seconds)); Wire.write(decToBcd(minutes)); Wire.write(decToBcd(hours)); Wire.endTransmission();}void get_time(){ Wire.beginTransmission(104); Wire.write((byte)0);//set register to 0 Wire.endTransmission(); Wire.requestFrom(104, 3);//get 3 bytes (seconds,minutes,hours); seconds =bcdToDec(Wire.read() &0x7f); minutes =bcdToDec(Wire.read()); hours =bcdToDec(Wire.read() &0x3f);}void get_temp(){ Wire.beginTransmission(104); Wire.write((byte)0); //set register to 0 Wire.endTransmission(); Wire.requestFrom(104, 3);//get 3 bytes (seconds,minutes,hours); seconds =bcdToDec(Wire.read() &0x7f); minutes =bcdToDec(Wire.read()); hours =bcdToDec(Wire.read() &0x3f);}void setHour(){ hours++; if (hours> 23) { hours =0; seconds =0; minutes =0; } set_time();}void setMinutes(){ minutes++; if (minutes> 59) { minutes =0; } seconds =0; set_time();}byte decToBcd(byte val){ return ( (val / 10 * 16) + (val % 10) );}byte bcdToDec(byte val){ return ( (val / 16 * 10) + (val % 16) );}/**************************************************************************//* Displays some basic information on this sensor from the unified sensor API sensor_t type (see Adafruit_Sensor for more information) *//**************************************************************************/void displaySensorDetails(void){ sensor_t sensor;// bmp.getSensor(&sensor); Serial.println("------------------------------------"); Serial.print ("Sensor:"); Serial.println(sensor.name); Serial.print ("Driver Ver:"); Serial.println(sensor.version); Serial.print ("Unique ID:"); Serial.println(sensor.sensor_id); Serial.print ("Max Value:"); Serial.print(sensor.max_value); Serial.println(" hPa"); Serial.print ("Min Value:"); Serial.print(sensor.min_value); Serial.println(" hPa"); Serial.print ("Resolution:"); Serial.print(sensor.resolution); Serial.println(" hPa"); Serial.println("------------------------------------"); Serial.println (""); delay(500);}/**************************************************************************//* Takes an average of readings on a given pin, Returns the average */* used for the TMP36 and ML8511 UV Sensor readings./**************************************************************************/int averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  
Taking an Average Analog ReadingArduino
This was a clever hack I found in the SparkFun library for the ML8511 UV Sensor, but I'm calling it out specifically, since you can use it for any analog read! If you ever meet Nathan Seidl, please buy him a beer (it's a Beerware license.)
//Takes an average of readings on a given pin//Returns the averageint averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  
I2C bus scannerArduino
If you don't know the base address for your i2c devices, use this to scan the range of valid addresses. It knows about the sensors that I've been working with. You can add sections for your other sensors.
// --------------------------------------// i2c_scanner//// Found at http://playground.arduino.cc/Main/I2cScanner?action=sourceblock&num=1// 26 OCT 2015//// Version 1// This program (or code that looks like it)// can be found in many places.// For example on the Arduino.cc forum.// The original author is not know.// Version 2, Juni 2012, Using Arduino 1.0.1// Adapted to be as simple as possible by Arduino.cc user Krodal// Version 3, Feb 26 2013// V3 by louarnold// Version 4, March 3, 2013, Using Arduino 1.0.3// by Arduino.cc user Krodal.// Changes by louarnold removed.// Scanning addresses changed from 0...127 to 1...119,// according to the i2c scanner by Nick Gammon// http://www.gammon.com.au/forum/?id=10896// Version 5, March 28, 2013// As version 4, but address scans now to 127.// A sensor seems to use address 120.//// This sketch tests the standard 7-bit addresses// Devices with higher bit address might not be seen properly.//// Zonk er Harris added device descriptions, comments. OCT 10 2015// #include void setup(){ Wire.begin(); Serial.begin (9600); Serial.println("\nI2C Scanner");}void loop(){ byte error, address; int nDevices; Serial.println("Scanning..."); nDevices =0; for(address =1; address <127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error =Wire.endTransmission(); if (error ==0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); // Serial.print(address); If needed, print the address in decimal // // Now, detail sensors that we know about or expect... if (address ==3) { // DEC 3 =0x03 HEX =AS3935 Lightning Sensor Serial.print(" - AS3935 Lightning Sensor"); } if (address ==64) { // DEC 64 =0x40 HEX =HTU21D Humidity and Temp Sensor Serial.print(" - HTU21D Humidity and Temp Sensor"); } if (address ==104) { // DEC 104 =0x68 HEX =DS1307 (Chrono-Dot?) RTC Serial.print(" - DS1307 RTC (Chrono-Dot?)"); } if (address ==119) { // DEC 119 =0x77 HEX =BMP180 Barometric Pressure and Tem Sensor Serial.print(" - BMP180 Barometric Pressure and Tem Sensor"); } Serial.println(" "); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); if (address ==3) { // DEC 3 =0x03 HEX =AS3935 Lightning Sensor Serial.print(" - AS3935 Lightning Sensor"); } if (address ==64) { // DEC 64 =0x40 HEX =HTU21D Humidity and Temp Sensor Serial.print(" - HTU21D Humidity and Temp Sensor"); } if (address ==104) { // DEC 104 =0x68 HEX =DS1307 (Chrono-Dot?) RTC Serial.print(" - DS1307 RTC (Chrono-Dot?)"); } if (address ==119) { // DEC 119 =0x77 HEX =BMP180 Barometric Pressure and Tem Sensor Serial.print(" - BMP180 Barometric Pressure and Tem Sensor"); } } } if (nDevices ==0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); retraso (5000); // wait 5 seconds for next scan}/* The output looks like this... * * Scanning... * I2C device found at address 0x03 - AS3935 Lightning Sensor * I2C device found at address 0x40 - HTU21D Humidity and Temp Sensor * I2C device found at address 0x68 - DS1307 RTC (Chrono-Dot?) * I2C device found at address 0x77 - BMP180 Barometric Pressure and Tem Sensor * done * */
ML8511 Demo CodeArduino
Modified for use with a 3.3v-native CPU (for DAC reference units).
/* * From https://learn.sparkfun.com/tutorials/ml8511-uv-sensor-hookup-guide 19 MAR 2016 * (Adapted for MKR1000 by Zonker Harris, MAR 2016) ML8511 UV Sensor Read Example By:Nathan Seidle SparkFun Electronics Date:January 15th, 2014 License:This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license). The ML8511 UV Sensor outputs an analog signal in relation to the amount of UV light it detects. Connect the following ML8511 breakout board to Arduino:3.3V =3.3V OUT =A1 GND =GND EN =3.3V * The Sparkfun demo presumes 5v VCC, but the MKR1000 is 3.3v native. * Because of this, the second reference voltage value will always be "1023". * As a result of testing, I cut that part out... -Z- Test your sensor by shining daylight or a UV LED:https://www.sparkfun.com/products/8662 This sensor detects 280-390nm light most effectively. This is categorized as part of the UVB (burning rays) spectrum and most of the UVA (tanning rays) spectrum. There's lots of good UV radiation reading out there:http://www.ccohs.ca/oshanswers/phys_agents/ultravioletradiation.html https://www.iuva.org/uv-faqs *///Hardware pin definitionsint UVOUT =A1; //Output from the sensorvoid setup(){ Serial.begin(9600); pinMode(UVOUT, INPUT); Serial.println("ML8511 example");}void loop(){ int uvLevel =averageAnalogRead(UVOUT); float newOutVolts =0.0032258064516129 * uvLevel; // This is 3.3v \ 1023 * uvLevel float uvIntensity =mapfloat(newOutVolts, 0.99, 2.8, 0.0, 15.0); //Convert the voltage to a UV intensity level Serial.print("ML8511 out:"); Serial.print(uvLevel); Serial.print(" / UV Intensity (mW/cm^2):"); Serial.print(uvIntensity); Serial.println (); delay(100);}//Takes an average of readings on a given pin//Returns the averageint averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x   

Esquemas

I'm too new to Fritzing, and couldn't find many parts in the library, so I made this mock-up instead.

Proceso de manufactura

  1. La fusión de sensores brinda múltiples beneficios
  2. La integración de los datos del sensor con el microprocesador Raspberry Pi
  3. Sensor de seguimiento de línea con RPi
  4. API de sensor ambiental con un RPi
  5. Aeroponía con Raspberry Pi y sensor de humedad
  6. Raspberry Pi GPIO con sensor de movimiento PIR:el mejor tutorial
  7. Uso del sensor de radar pulsado A111 con una Raspberry Pi
  8. Interfaz del sensor de movimiento PIR HC-SR501 con Raspberry Pi
  9. Python / MicroPython Sensor Logger con Google Sheets
  10. Windows 10 IoT Core en Raspberry Pi 2 - Datos del sensor Adafruit
  11. Circuito de apagado de Raspberry Pi con modo de suspensión