class=»mobile-photo» He estado buscando una manera de mostrar de forma automática en el blog cuando camino Ripon está abierta.
El proyecto más adelante hace esto por Twitter abierta o cerrada según la luz de ser encendido o apagado
El Arduino tiene una resistencia dependiente de la luz y un sensor de temperatura que envía datos a Google App Engine. Appengine luego tuitea el tiempo, la temperatura y la abierta o cerrada.
La temperatura es también continuamente grafican aquí
class=»mobile-photo» El blog tiene los tweets incrustados en la parte superior derecha, y al seguir @ makerspaceFY1, usted verá cuando camino Ripon se abre y se cierra.
class=»mobile-photo» Este mostrará todos los días, en lugar de sólo la reunión del sábado.
class=»mobile-photo»
class=»mobile-photo»
El código de Arduino.
/ / Este croquis enviará la temperatura y los valores de luz a un servidor.
/ / Un LDR y una DS18B20 (o similar) se requiere el sensor de temperatura
/ / Se requiere también un escudo de Ethernet para la conectividad a Internet.
/ / En este tutorial se muestra cómo conectar el DS18B20 a tu Arduino: http://www.hobbytronics.co.uk/ds18b20-arduino
/ / Este tutorial le muestra cómo conectar el LDR a tu arduino: http://bildr.org/2012/11/photoresistor-arduino/
# include
# include
# include / / No incluido por defecto, debe ser descargado manualmente.
# include
byte mac [] = {
0x90, 0xA2, 0xDA, 0x00, 0x72, 0xA2} / / dirección Ethernet Shield MAC (debe ser único para cada dispositivo de la red)
/ / Dirección IP ip (192,168,2,130) / / Si necesita una dirección IP estática, descomentar esta línea y cambiar la dirección IP a algo disponible
cliente EthernetClient / / Para la conexión principal de Internet
celsius float / / La temperatura más reciente lectura del sensor de temperatura
int luz; / / El valor de la última luz de la LDR
void setup () {
pinMode (9, INPUT); / / sensor de temperatura DS18B20
pinMode (A1, INPUT); / / LDR
Serial.begin (9600) / / Abrir la serie con una transmisión 9600 , esto le permite ver la información de depuración mientras el Arduino se conecta a su computadora
Serial.println («Starting ..»);
Serial.println («»);
; Serial.print («Conexión a la red ..»);
Ethernet.begin (mac) / / conectarse a Internet a través de DHCP
/ / Ethernet.begin (mac, ip) / / Si desea conectarse a través de la dirección IP estática, descomentar esta línea de código
Serial.println (Ethernet.localIP ()) / / Imprimir la dirección IP de la Arduino. Si el código se queda atascado en este punto, no se puede conectar con el servidor DHCP y se debe considerar el uso de una dirección IP estática
}
void loop () {
getTemperature (9) / / Función para obtener la temperatura de la DS18B20 en el pin 9
/ / getTemperature ( ) devolverá ‘true’ o ‘false’. Verdadero si la temperatura es válido, false en caso contrario. Es posible que desee bucle de la función, mientras false
getLight (); / / Obtener el nivel de luz de la LDR en el pin A0 (El pasador debe ser cambiado desde el interior del función)
sendData (); / / Enviar los datos al servidor (el servidor se puede cambiar desde dentro de la función)
delay (60000);
}
vacío getLight () {
luz = analogRead (A0);
Serial.print («Nivel de luz:»);
Serial.println (luz);
/ / Obtener la lectura de la luz, guárdelo en la» luz «(entero) y luego imprimirlo en serie para la depuración
}
/>
vacío sendData () {
/ / Los datos se envían utilizando los parámetros de URL en una solicitud GET HTTP. (Por ejemplo, www.my_url.com/myscript?temperature=22.53C).
/ / Cambiar la URL de su servidor para que pueda procesar los datos entrantes.
/ / El servidor tiene que tener un guión de funcionamiento que puede procesar los datos enviados a través de parámetros de URL
;
/ / Esto imprime simplemente el URL que será solicitado para fines de depuración, no se requiere;
Serial.print («GET www.YOUR_URL_HERE.com/myscript?work =»);
Serial.print (celsius);
Serial.print («& luz =»);
Serial.println (luz);
/>
cliente. stop (); / / Asegúrese de que no hay conexiones abiertas
Serial.print («Conectando con el servidor ..»);.
/ / Si está enviando datos a appengine, este debe estar ajustado a google.com a continuación. Reemplazar «Host: myapp.appspot.com» (abajo) con su URL de la aplicación de Google App Engine (o en su propio servidor)
/ / Si desea enviar sus datos a otro servidor, sustituya «google.com» con el servidor (no se incluyen los subdominios o páginas, que se especifican a continuación)
if (client.connect («google . com «, 80)) {
Serial.println (» OPEN «);. / / La conexión con el servidor trabajó
client.print («GET myapp.appspot.com / miscript? temperatura =») / / La url dónde se envían los datos a. (Incluir subdominios, y la página / script los datos serán enviados a)
/ / Añade los valores (temperatura y luz) como parámetros de URL;
client.print (celsius) / / Envía el valor de la temperatura en el servidor
client.print («& uptime =»);
client.print (millis ()) / / Esto envía la cantidad de tiempo que el Arduino tiene estado funcionando durante (en milisegundos) para el servidor
client.print («& luz =»);
client.print (luz) / / Enviar el valor de la luz en el servidor
client.println (» HTTP/1.1 «); / / Necesario para todas las conexiones HTTP
client.println (» Host: myapp.appspot.com «); / / Requerido .. cambiar esto a la url del servidor, incluyendo subdominios (no mencionan páginas o secuencias de comandos aquí, sólo mencionarlos arriba)
client.println («Connection: close») / / Indica al servidor que cierre la conexión una vez que los datos han sido enviado
client.println («User-Agent: Makerspace Arduino Sketch de Joe». .) / / El agente de usuario de su dibujo, esto puede ser cualquier cosa
client.println («Cache-Control: max-age = 0» ) / / Esto le dice al servidor no hagan caché de páginas, esto no es necesario, pero algunos servidores no funcionan como se esperaba cuando este se retira
client.println («Content-Type: application / urlencoded x-www-form-«); / / Necesario para algunos servidores, pero no para todos
client.println («Accept-Language: en-US, es; q = 0,8») / / Necesario para algunos servidores, pero no para todos
client.println ();
Serial.println («datos enviados! «);
} else {
client.println («ERROR»); / / La conexión al servidor ha fallado
Serial.print (. «Renovar la concesión DHCP, la respuesta cruda:»);
Serial.println (Ethernet.maintain ()) / / Debido a la conexión al servidor ha fallado, lo haremos tratar de obtener una nueva dirección IP desde el servidor DHCP en el caso de que es el problema.
}
; client.stop (); / / Cerrar la conexión con el servidor
Serial.println («conexión appengine: CERRADO»);
Serial.println («»);
}
getTemperature boolean (pin byte) {
celsius = 0;
trabajo boolean = true;
ds OneWire (pin) / / Dile a la biblioteca OneWire que pin que estamos utilizando para el sensor de temperatura
byte i;
byte presente = 0;
type_s byte;
[12];
addr byte [9];
if (! ds.search (dirección )) {
/ / Serial.println («»);
ds . reset_search (); / / Estructura de un sensor de temperatura conectado y es ID
/ / Delay (250);
}
if (OneWire :: CRC8 ( ! addr, 7) = addr [7]) {
Serial.println («CRC no es válido»); / / El sensor de temperatura no podía se encuentra, compruebe los cables
trabajo = false;.
/ / celsius = 0;
ds.depower ();
return false; / / Error. Return false
}
interruptor (addr [0]) {/ / La biblioteca encontró un sensor de trabajo, esto comprueba el sensor es compatible con la biblioteca.
caso 0x10:
type_s = 1;
romper;
caso 0x28:
type_s = 0;
romper;
caso 0x22:
type_s = 0;
romper;
defecto:
Serial.println («El dispositivo no es un dispositivo de la familia DS18x20.»); / / sensor de temperatura Desconocido (esto puede ser causado por un sensor defectuoso o un mal Conexión / cableado)
/ / celsius = 0;
trabajo = false;
ds.depower (); / / Desactivar el sensor (si es posible) para evitar el desperdicio de energía
return false; / / Error. Return false
}
ds.reset () / / Obtiene el sensor listo para una lectura de temperatura
ds.select (dirección);
ds.write (0x44, 1); / / Dile al sensor de temperatura para obtener la temperatura
delay (750);. / / Tenemos que esperar por lo menos 700 ms, mientras que el sensor de temperatura determina la temperatura
presente = ds.reset ();
ds.select (dirección);
ds.write (0xBE); / / Leer Bloc
for (i = 0; i <9; i + +) {/ / necesitamos 9 bytes
datos [i] = ds . read ();
/ / Serial.print (data [i], HEX);
/ / Serial.print («»);
}
int prima = (datos [1] <<8) | data [0];
if (type_s) {
prima = prima <<3, la resolución por defecto / / 9 bits
if (data [7] == 0x10) {
/ / cuenta permanecen da plena resolución de 12 bits
prima = (cruda y 0xFFF0) + 12 – datos [6];
}
}
else {
cfg byte = (datos [4] y 0x60);
if (cfg == 0x00) prima = prima <<3;
else if (cfg == 0x20) = prima cruda <<2;
else if (cfg == 0x40) = prima cruda <<1;
}
celsius = (float) en bruto / 16,0 / / Ponga la temperatura actual en el «celsius» variable (valor float)
ds.depower (); / / Desactivar el sensor de temperatura para ahorrar energía
Serial.print (» temperatura conseguida: «); / / Imprime el valor actual del sensor de temperatura (para depuración; no es necesario)
; Serial.print (celsius);
Serial.println («C»).;
trabajo volver; / / Devuelve true si se ha recibido la temperatura, de lo contrario devuelve false
. ; delay (100);
}
El código appengine
# / usr / bin / env python />
# Este es un script de Google App Engine Python;! sólo funcionará correctamente sucesivamente. Google App Engine
# Este código procesa los datos enviados desde un Arduino (sólo lecturas de temperatura y luz)
# Se enviará un tweet cuando la luz está encendida, y luego otra vez cuando la luz se apaga . No está diseñado para la luz del día
# Este código también envía los datos de la placa Arduino a Xively por lo que se puede graficar
# NOTA:.. Esta página no está protegido con contraseña, así que si alguien se entera de que su URL pueden enviar lecturas falsas al servidor. . Mantenga su URL privada
# Para que este código funcione correctamente, también necesita un archivo llamado «app.yaml» en la misma carpeta que el guión «, app.yaml» debe contener el código;
«» «aplicación /> appID versión: 1
runtime: python27
API_version: 1
-hilo: no
manipuladores:
– url: / miscript
script: myscript.app
«» «
# no incluyen el» «» en la parte superior y la parte inferior
# Reemplace «appID» con el nombre de la aplicación, puede crear uno en appengine.google.com
# Reemplace «myscript.app» con el nombre de este script (salir. aplicación en el extremo)
webapp2 importada # Requerido por Google App Engine
de google.appengine.api urlfetch importada # Necesario para enviar solicitudes de Internet para Xively />
de google.appengine.api importación memcache # Esto es necesario para acceder memcache />
consumer_key = «Su clave de»
consumer_secret = «Tu secreto»
señal_acceso = «Su token de acceso»
access_token_secret = «Su token de acceso secreto» />
def get (self): # Esta función se llama cada vez que hay una solicitud GET HTTP a esta URL (/ miscript)
temperatura = self.request.get (‘temperatura’) # Esto se pone todos los datos almacenados en el parámetro URL «temperatura»
; si la temperatura:
# Este código se ejecuta cuando se encuentra el paramter URL ‘temperatura’ (enviado por el Arduino)
; memcache.set (‘temperatura’, la temperatura) # Si la temperatura se incluye en la solicitud HTTP, guardarlo en
Memcache # Memcache es el almacenamiento temporal similar a la RAM
luz = self.request.get («light») # Obtener el valor de luz actual del parámetro de URL ‘light’ (enviado desde el Arduino)
lastlight = memcache.get (‘lastlight’) # Obtener el valor de la luz desde la última solicitud (si existe)
# Esto se establece más adelante en el código para que podamos comparar el valor entre cada solicitud
;
# Este código envía tanto la luz y la temperatura para Xively (Un sitio web gratuito, que representa gráficamente los datos)
; urlfetch.set_default_fetch_deadline (40) # Si la conexión con Xively tarda más de 40 segundos, cancelarlo (timeout)
Tosend = ‘temperatura’ + temperatura + «» «
» ‘light’ «,» + + luz # Construir los datos (el valor de la temperatura y de la luz) para que pueda ser enviado.
;
probar:
url = ‘ https://api.xively.com/v2/feeds/FEEDID.csv ‘# Reemplace’ FEEDID «con el ID de su página Xively
resultado =» resultado />
method = urlfetch.PUT, # Esto le dice appengine para hacer una solicitud PUT para Xively (que es el método recomendado para enviarlo)
; payload = Tosend, # Esto le dice appengine para poner el valor de «Tosend ‘en la solicitud PUT
; headers = {‘Pragma’: ‘no-cache’,
‘X-ApiKey’:}) # ‘YOUR_API_KEY’ Reemplazar ‘YOUR_API_KEY’ con su clave de API Xively
excepto:
; logging.warning (‘No se puede llegar a xively’) # Si no podemos conectar con Xively, imprimir un mensaje de advertencia en los registros appengine
si str (lastlight) ==» o str (lastlight) == ‘Ninguno’: # Esto comprueba si el valor de ‘lastlight’ es
válida lastlight = 0 # Si los datos no son válidos, ajústelo a ‘0 ‘
si str (luz) ==» o str (luz) == ‘Ninguno’: # Esto comprueba el valor de la «luz» para asegurarse de que es válido
; luz = 0 # Si no es válida, que sea ‘0 ‘
; luz = int (luz) # Asegúrese de que las variables son ambos enteros
lastlight = int (lastlight)
memcache.set (‘lastlight’, claro) # Guardar el valor de ‘lastlight’ en memcache. Esto nos permite comparar con los valores futuros
lighton = False # Crear variables booleanas llamadas ‘lighton’ y ‘confirmado’
; confirmada = False
si la luz> 525: # Si la lectura de la luz es más de 525, la luz se enciende
; # (Lo más probable es que tenga que cambiar esto para su entorno) logging.debug />
# Este código se ejecuta cuando la luz es ACTUALMENTE mayor que 525 (por ejemplo, la luz está encendida)
; si lastlight> 525:
# Este código se ejecuta cuando la luz esté actualmente y que estaba en la última vez que nos registramos logging.debug />
; lighton = True # La luz estaba encendida las 2 últimas veces que nos registramos, así que eso significa que podemos estar seguros de que la luz es realmente
confirmada = True
demás:
; logging.debug (‘La luz es OFF’)
si lastlight <525:
# La luz no está disponible actualmente, y fue la última vez que nos registramos, podemos estar seguros de que la luz es realmente fuera
logging.debug (‘Confirmado’)
lighton = False
confirmado = True
si confirmó == Falso:
# La luz tiene cambiado (por ejemplo, la luz se enciende o se apaga), pero vamos a esperar hasta que tengamos otro mensaje del Arduino ..
# .. así podemos estar seguros sobre el cambio. (Esto evita que el tweet se dispare cada vez que alguien pasa por delante del sensor de luz)
logging.debug («Estado de la luz cambió, pero la espera de otro mensaje de la Arduino») return />
lasttweet = memcache.get (‘lasttweet’) # Cuando hacemos un tweet diciendo ‘luz’ establecemos esta en True, y nos pusimos ..
# .. a false cada vez que encendemos tweet ‘off’
; auth = tweepy.OAuthHandler (consumer_key, consumer_secret) # Estos son necesarios para la biblioteca Twitter trabajar
auth.set_access_token (señal_acceso, access_token_secret )
api = tweepy.API (auth)
; logging.info (‘iniciado sesión como’ + str (api.me () nombre).) # Mostrar el usuario actualmente conectado (a Twitter) en los registros appengine
;
si lasttweet == Verdadero: # El último tweet enviado que decía ‘luces’
si lighton == Verdadero: # En la actualidad, las luces están encendidas
# Debido a que el último tweet fue enviado diciendo ‘luces’ y las luces siguen adelante, no necesitamos a Twitter de nuevo
logging.debug («La luz está encendida y un tweet fue enviado antes»)
memcache.set (‘lasttweet’, Verdadero )
regreso si lighton == Falso: # El último tweet enviado era «luces encendidas» pero las luces son ahora apagado, enviar un tweet
logging.debug. («La luz se ha apagado, enviará un tweet diciendo CERRADO»)
memcache.set (‘lasttweet’, False )
api.update_status (‘Apagamos las luces en «+ str (datetime.datetime.now (). tiempo ( )) [: 5])
# Este mensajes «Apagamos las luces a las 14:32» (o sea la hora que es) a su cuenta de Twitter />
si lighton == Verdadero: # En la actualidad las luces están encendidas, y el último tweet dijeron que estaban fuera ..
# Esto significa que tenemos que mandar un tweet diciendo que las luces están ahora en
logging.debug («La luz se ha encendido, enviará un tweet diciendo OPEN «)
memcache.set (‘lasttweet», True)
api.update_status (‘encendimos nuestras luces en’ + str (datetime.datetime.now () time ()). [5] + ‘y la temperatura era de ‘+ temperatura +’. C ‘)
# Este mensajes «Encendimos las luces a las 08:47 y la temperatura era 23.42.C «, por ejemplo
retorno si lighton == Falso:
# El último tweet fue enviado diciendo ‘luces apagadas’ y ellos son todavía apagado, no necesitamos a tweet de nuevo.
logging.debug («La luz está apagada y un tweet fue enviado a principios de «)
memcache.set (‘lasttweet’, False)
volver
si lasttweet == None :
# Si el valor de ‘lasttweet’ no está, establézcalo en False y luego no hacer nada hasta el próximo mensaje del Arduino
logging.warning («No value lasttweet, en el supuesto falso.»)
; memcache.set (‘lasttweet’, False) ‘lasttweet’ # Establece en False en Memcache
retorno />