Paso 7: Programación Arduino
Abajo es el sketch de Arduino para mi última versión de este proyecto. Para su conveniencia, es comprimido en una carpeta con el mismo nombre que el bosquejo. Esto es necesario para su uso con el software Arduino IDE. *** bosquejo puede verse con cualquier editor de texto ***
Tenga cuidado con la colocación de abrir y cerrar llaves {y} porque el código de trabajo las llaves tienen que equilibrarse. Si te pierdes tratando de mantenerse al día con los refuerzos, debería notar que usando el IDE de Arduino (he estado usando IDE 1.0 en Linux y previamente 1.0.5 en Windows) si pones el cursor justo después de una llave de apertura o cierre, el IDE rodearán su soporte correspondiente dentro de un rectángulo. Puede que necesite desplazarse arriba o abajo dentro de su código para encontrar la llave que empareja, como gran parte de su código puede contener llaves con muchos otros pares de llaves entre ellos. Puede utilizar esta característica del IDE para encontrar la llave que está fuera de balance o extra, o tal vez debería combinarse con una llave que falta.
Va sobre el código de alto nivel, principalmente quiero señalar la parte del código que hace la página web. Comienza con client.println(""); Esto dice el Arduino para imprimir una línea con el navegador web al servidor de la conexión con la conexión establecida. Si usted está algo familiarizado con HTML, puede modificar el contenido de la página y enlaces a continuación para satisfacer sus necesidades. Sólo tener en cuenta se necesita esas declaraciones de client.print al principio de cada línea que contiene el contenido de la página web; o salto de línea al final, o un client.print que imprime lo que sigue client.println que imprime una línea con el efecto de un retorno de carro, pero tendrá que terminar con el código html
para salto de línea conseguir el mismo efecto. Para imprimir varias cosas en la misma línea, usar algo como:
Client.Print ("I");
Client.Print ("como");
Client.Print ("Arduino");
Client.println ("proyectos de automatización del hogar");
Lo anterior imprimirá
Me gusta Arduino domótica proyectos
a la página web con un retorno de carro-avance de línea luego.
He añadido una vuelta de tuerca a la página de CDCosma cuando decidí agregar PC y MT interruptor de control, así que usted ' ll ver una pequeña cantidad de código entre partes del HTML que sólo es utilizado por Arduino para decidir lo que mostrará el código HTML en el navegador. Por ejemplo:
Si (digitalRead(8) > 0) {}
Client.Print ("MV está activada");
Client.println("");
Client.println ("apagado MV");
} else {}
Client.Print ("MV está apagado");
Client.println("");
Client.println ("MV encendido");
}
Esto significa que el Arduino Lee pin digital 8 para determinar si es alta o baja. Pin digital 8 se conecta en el riel de alimentación + 5 v potencia de la MV para que el Arduino puede detectar el estado de energía. Si el pin 8 se lee como una alta digital, llevará a cabo las siguientes 3 líneas de código, impresión 'Media Vault está encendido' (ON estará en texto negrita, de color verde), línea 2 rompe así el texto no ' t sobreponer el botón de abajo, que se lee 'Media bóveda apagado' y la dirección url vinculada de ese botón es? mvoff o http://192.168.1.97/?mvoff. (Ver imagen arriba de la página web). Esto significa que enviará? mvoff como la cabecera a Arduino, y cuando el Arduino Lee esa cadena, llevará a cabo código casi al final del bosquejo a partir de las
if(readString.IndexOf("?mvoff") > 0) //checks cadena de encabezado de solicitud
Otra cosa, lo que se lleva a cabo si el pin 8 es baja, se imprimirá el código a la página web del cliente 'Media Vault es OFF' (OFF estará en texto negrita, rojo), 2 línea rompe así el texto no ' t sobreponer el botón de abajo, que va a leer Media bóveda encendido y la dirección url vinculada de ese botón es? mvon y Arduino llevará a cabo el código casi al final del bosquejo correspondiente a? mvon.
Me gustó la manera que esto trabajado lo suficiente como para volver atrás y modificar la luz y piezas de control de ventilador de techo de la página web para incluir este comportamiento condicional. Lo único que no me gusta acerca del uso de esto es que la página no es verdaderamente dinámica, lo que significa que no se actualiza después de hacer clic en un botón. Creo que sería necesario agregar AJAX o JSON que no he aprendido todavía. Me experimentar ampliamente con JavaScript normal y no era capaz de tener éxito. Entonces agregué botones de 'Actualizar' para cada sección que realmente no actualizar como haría el botón de refrescar del navegador, pero sólo enlazan a http://192.168.1.97/ para el Arduino devolver una página fresca sin el navegador envía cualquier cadena de encabezado adicional al final de la URL. Mis botones de pseudo-actualización no hará que el Arduino cambiar el estado de las patas. Si el explorador muestra http://192.168.1.97/?pcon, usando el botón de refrescar del navegador provocaría el navegador para volver a enviar que solicitar y hacer que mi PC a suspender. Esto es desde que estoy usando el interruptor de alimentación para interfaz con el Arduino y la misma acción se requiere para el interruptor Encender como apagar. Es una buena idea para evitar el uso de cualquiera de los botones de navegación del navegador en casos como este.
Después de ese código casi al final del bosquejo, podrás ver las acciones causadas por cada una de las cadenas de encabezado, incluyendo las peticiones de luz de torneado o ventilador encendido y apagado. Los pins que he conectado a la placa de relé de Sainsmart se inicializan como alto en la función de configuración del bosquejo empezando por void setup() para que cuando el Arduino enciende en primer lugar y el bosquejo se ejecuta, los relés están desactivados. Esto debe tenerse en cuenta. Porque entonces ¿qué sucede cuando el Arduino pierde poder, recupera energía? Inicia y ejecuta el dibujo desde el principio. La función de configuración donde se inicializan pines de Arduino se ejecuta sólo una vez cada vez que se ejecuta el bosquejo. Que probablemente algo de vez en cuando dejar en la oscuridad durante unos segundos si su casero de la energía ciclos brevemente mientras son el hogar, que vienen de trabajo o de vacaciones para encontrar todas las luces en porque el poder se fue y volvió nuevo mientras estabas lejos.
También tengo el Arduino escribir al puerto serie qué acción se está realizando. Esto ayuda a resolver problemas con el monitor serial de la Arduino IDE.
Aviso que el código en el bosquejo para el encendido de la PC funciona muy diferente que para el MV. Esto es debido a las diferencias en los tipos de interruptores del panel frontal. La PC necesita sólo un corto momentáneo de su interruptor del panel frontal (o de cualquier interruptor exterior mímico el interruptor frontal). Debido a esto, pin 9 debe causar el relé cerrar momentáneamente y a continuación, abra otra vez. Para ello, puse pin 9 a la baja, que se activa el relé de Sainsmart (recordemos que estoy usando la placa de relé en lugar de un relé de láminas externas), el bosquejo espera 1/4 de segundo antes de instalación pin 9 en alto otra vez, desactivando el relé, este mímico el efecto de pulsar el interruptor de alimentación frontal brevemente y soltarlo. La exacta misma acción del bosquejo es necesaria para causar la PC para despertar de su estado suspendido como para suspenderlo. También escribí en la capacidad para reiniciar la PC imitando un 4 segundos se presiona el interruptor de encendido en caso de que el PC se bloquea en mí. Don t esperar a necesitar utilizar este uno, pero pensado en agregar mientras iba a través de las entradas de interruptor de panel frontal posible en mi mente.
En la parte inferior de la página web, he añadido algunas líneas para recordarme que bosquejo fue cargado, cuando lo subido y desde que ordenador. Recientemente pasó una laptop y una PC de Windows a Linux y no estaba seguro si habría diferencias en el comportamiento de mis bocetos subidos basado en el sistema operativo utiliza para ejecutar el IDE. Lo único que noté que debido a mi mudanza OS es que con Linux, cuando abres el monitor serial en el IDE, restablece su bosquejo. Así que en mi caso, mi relés de alta potencia interruptor para apagado. No ha habido ninguna diferencia en el comportamiento de mis bocetos relacionados con mi movimiento de OS.
Actualización agosto de 2014:
Además de agregar la placa de circuito con interruptores de tacto, he añadido algunos trucos que he recogido de buceo profundo en Arduino intermedio de amandaghassaei: entradas y salidas. Con el fin de imprimir al puerto serial del estado de cada pin cuando lo quiero, he añadido una sección a mi bosquejo antes el setup() que declara una variable de estado de cada pin, como:
int pinState1 = digitalRead(4); Lo hice para cada pin en mi proyecto, pernos 4-9, 11 y 22-25, todas las entradas y salidas.
y usar su ejemplo para contra rebotes un interruptor antes de determinar su estado, declaró variables Booleanas para currentState, lastState, debouncedState para cada botón (como currentState1, currentState2), timeOfLastButtonEvent largo sin signo para cada botón y un debounceInterval estándar para ser utilizado por todos como esto:
boolean currentState1 = bajo; almacenamiento para el actual estado de button1 medido,... etc. para 2, 3 y 4
boolean lastState1 = bajo; almacenamiento para última medida estado de button1,... etc. para 2, 3 y 4
boolean debouncedState1 = bajo; debounced estado de button1,... etc. para 2, 3 y 4
int debounceInterval = 20; esperar 20ms para botones resolver
timeOfLastButtonEvent1 largos sin signo = 0; tienda el último estado de button1 de tiempo cambió,... etc. para 2, 3 y 4
Al final de mi bosquejo fuera mi lazo setup(), agregué la siguiente función que había llamado «Estados»:
void States() {}
pinState1 = digitalRead(4);
pinState2 = digitalRead(5);
pinState3 = digitalRead(6);
pinState4 = digitalRead(7);
pinState5 = digitalRead(8);
pinState6 = digitalRead(9);
pinState7 = digitalRead(11);
pinState8 = digitalRead(22);
pinState9 = digitalRead(23);
pinState10 = digitalRead(24);
pinState11 = digitalRead(25);
Serial.Print ("ventilador lr bajo activo estado de circuito de salida pin 4:");
Serial.println(pinState1);
Serial.Print ("luz activa br bajo estado del pin del circuito de salida de 5:");
Serial.println(pinState2);
Serial.Print ("ventilador activa br bajo estado de circuito de salida pin 6:");
Serial.println(pinState3);
Serial.Print ("estado pin de salida de interruptor MV 7:");
Serial.println(pinState4);
Serial.Print ("power MV estado estado entrada de pin 8:");
Serial.println(pinState5); Serial.Print ("estado pin de salida interruptor de PC de 9:");
Serial.println(pinState6);
Serial.Print ("poder de la PC estado de clavija de entrada de estado del 11:"); Serial.println(pinState7);
Serial.Print ("estado de LR ventilador botón entrada pin 22:");
Serial.println(pinState8); Serial.Print ("estado de la clavija de entrada de botón de luz de BR 23:");
Serial.println(pinState9);
Serial.Print ("estado de la BR ventilador botón entrada pin de 24:"); Serial.println(pinState10);
Serial.Print ("estado de MV interruptor botón entrada pin 25:");
Serial.println(pinState11); }
Y debounce cada interruptor, determinar su estado, decidir si cambia y llamar a mi función States() de cada sección dentro de mi loop() como esta:
luz del dormitorio principal
currentState2 = digitalRead(buttonPin2);
currentTime2 largo sin signo = millis();
Si (currentState2! = lastState2) {}
timeOfLastButtonEvent2 = currentTime2;
}
si (currentTime2 - timeOfLastButtonEvent2 > debounceInterval) { //if ha pasado suficiente tiempo
si (currentState2! = debouncedState2) { //if el estado actual es aún diferente de nuestra última almacena estado debounced
debouncedState2 = currentState2; actualizar el estado debounced
activar un evento para la luz del dormitorio principal
Si (debouncedState2 == HIGH) {}
States();
Serial.println ("Button2 pulsado");
digitalWrite (5,! digitalRead(5)); invertir el estado del pin 5 primera lectura su valor digital, y luego escribir lo contrario
Serial.println("---");
Serial.println();
}
Else {}
States();
Serial.println ("Button2 lanzado");
Serial.println("---");
Serial.println();
}
}
}
lastState2 = currentState2;
También llamo States() cada vez que una acción se toma basada en el aporte de la página web, lo que para una serio gran cantidad de salida serie. Era sobre todo solucionar algún comportamiento extraño que resultó ser causada por una superficie ligeramente conductora (parte superior del pecho antiguo manchado) donde ponen mi Arduino y el interruptor de circuito, aún sin un caso de proyecto. Necesito arreglar eso pronto pero por ahora, he puesto una hoja de papel debajo de todo. Antes de eso, pude colocar mi mano en la parte superior del pecho y un relé invertir los Estados. Resultados no deseables. Yo a recortar el uso pesado de States() o whiddle por su contenido pronto. También cerca de la parte superior de mi ' lista' es para terminar mi caja de plexiglás para la Arduino Mega ethernet escudo y hacer algo similar para el interruptor de circuito impreso.
Las últimas tres imágenes de arriba son imágenes de la salida del monitor serial con notas.
-Final de actualización-