Throwduino básico - sensibles a la luz que destella Throwie con 1 parte de agregado - ahora con código Morse (7 / 7 paso)

Paso 7:

Código Morse!

En este paso usted encontrará el código Morse... erm... código para Throwdurino.

La gran cosa acerca de cómo agregar un microcontrolador es que podemos llevar información.  Este esquema permite la misma fotorresistencias a parpadear un mensaje preprogramado en código Morse.  La rutina de ajuste de umbral inicial y método de detección de luz son los mismos que el bosquejo original.

Editar - puede haber un error en el código:

umbral = (total >> 5); Ajuste el umbral a medio punto (dividir total de 128).

probablemente debe ser:

umbral = (total >>7); Ajuste el umbral a medio punto (dividir total de 128).

Ha trabajado para mí como era pero esto podría causar problemas con el sensor de luz.  Comprobar y corregir si es necesario.

El momento del Morse no es absolutamente tan rápido como debe ser - las pausas son mucho demasiadas realmente - pero encontré el momento estricto demasiado rápido para un principiante decodificar. O demasiado pesado en el uso de la batería.  Creo que esto es bastante claro para los novatos codificador Morse.

Para editar el mensaje, buscar la línea siguiente en la parte superior del bosquejo:

[] flashSeq de const char = {"oscuro aquí ISNT IT"};  Mensaje de Morse.  Editar esto.

y simplemente como usted requiere.

Para minimizar la longitud del bosquejo, reconoce sólo mayúsculas.  Todo lo demás será tratado como un "espacio".  No trate de usar más de 256 caracteres o es probable que falle horriblemente.

El bosquejo es atado y pegado por debajo.  Debe compilar alrededor de 1398 bytes

Throwduino básico - edición de código Morse!
Esofagogastroduodenal 2012
Licencia MIT
Escrito en ATtiny25/45/85 usando Arduino Tiny core - http://code.google.com/p/arduino-tiny/
No compilará para otros Arduinos (ATMega168, ATMega328 etc.)
Asegúrese de que selecciona la Junta correcta antes de compilar.

Ref:
Pines del ADC:
ADC1 = PB2
ADC2 = PB4
ADC3 = PB3

Si desea cambiar el patrón de iluminación, hazlo aquí.
valor por defecto es:
//
[] flashSeq de const char = {"oscuro aquí ISNT IT"};  Mensaje de Morse.  Editar esto.
//
Editar el mensaje con mayúsculas caracteres solamente.
Nada va a salir como un 1s retardo.
Después de la secuencia, esperamos 2s antes de repetir.

[] flashSeq de const char = {"oscuro aquí ISNT IT"};  Mensaje de Morse.  Editar esto.
const bytes seqLength =(sizeof(flashSeq)-1);

Codificación de código Morse
Guardan como un byte por letra.
Alta 5 pedacitos son 1- y 0 para el principio con LSB de ésos high-5...
Baja 3 bits dan número de parpadeos (puntos + guiones).
Morse permite 5 parpadeos (para números) pero Letras requieren máximo 4.
Este formato por lo tanto podría ser utilizado para números así pero no he implementado.

byte const morse [26] = {}
B00010010, //a
B00001100, //b
B00101100, //c
B00001011, //d
B00000001, //e
B00100100, //f
B00011011, //g
B00000100, //h
B00000010, //i
B01110100, //j
B00101011, //k
B00010100, //l
B00011010, //m
B00001010, //n
B00111011, //o
B00110100, //p
B01011100, //q
B00010011, //r
B00000011, //s
B00001001, //t
B00100011, //u
B01000100, //v
B00110011, //w
B01001100, //x
B01101100, //y
B00011100, //z
};
Ahora vamos a hacer un fotorresistencias para esa secuencia...

const int LEDpin = 4; Aunque esto está en una constante, hay un acceso directo del puerto
No trato de cambiar esto sin ir throu' el código entero.

umbral de unsigned int = 10; Esto instalaremos correctamente durante la instalación

Esto establece algunas librerías y definiciones para el uso con el temporizador para dormir
#include < avr/sleep.h >
#include < avr/wdt.h >
#ifndef cbi
#define cbi (sfr, bits) (_SFR_BYTE(sfr) & = ~_BV(bit))
#endif
#ifndef OSE
#define OSE (sfr, bits) (_SFR_BYTE(sfr) | = _BV(bit))
#endif

ISR(WDT_vect) {WDTCR| = B01000000;} / / reset Watchdog Timer al modo de interrupción de cada vez.

Metas con algunos registros para desactivar cosas y referencias.
void setup() {}
ADCSRB & = B10111111; desactivar comparitor
ACSR | = B10000000; Apague comparitor
ADCSRA | = B10000000; / / enciende ADC
DDRB & = B11100000; Set todo para entrada
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Set PB3 baja - esto era para la fase de prueba.  Probablemente puede ser caído ahora.
PRR y = B11111110; claro ADC disable bit Reg de reducción de potencia
analogReference(6); 2.56v interno de referencia con sin bypass - INTERNAL2v56NB-

Mostrar que estamos despiertos:
Flash(3);  Tres destellos - estamos ya en funcionamiento.


Establecer el umbral para la detección de luz durante los primeros 40 segundos.
Tomar 148 medidas, bin los primeros 20 y media entonces la siguiente 128.
unsigned int total = 0;
para (rep byte = 0; rep < 148; rep ++) {}
int value=lightLevel();
int valor = 10;
if(REP>19) {}
total += valor; tatke total de 128 lecturas
}
Flash(Value);

PAUSE(4); / / pause(4)
DDRB| = B00011010; Establecer 1, 3 y 4 como salida
PORTB & = B1110000; Todo bajo
}
umbral = (total >> 7); Ajuste el umbral a medio punto (dividir total de 128).

Flash(THRESHOLD); Esto es principalmente para propósitos de depuración.
}

Bucle principal
Medimos el nivel de luz.  Si es bajo entonces nos flash nuestra secuencia entonces sueño de 2s.
Si luz nivel alto, dormimos para 8s.
void loop() {}
analogReference(6); 2.56v interno de referencia con sin bypass

Medir el nivel de luz y si es lo suficientemente baja, mostrar nuestra secuencia flash
Si (lightLevel() < umbral) {}
flashMorse();
Si nosotros nos parpadea, ahora dormimos para el 4s
PAUSE(8);
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
}
Else {}
Si nosotros no nos parpadea entonces dormimos para 8s
PAUSE(9);
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
}

} / / fin de bucle principal

Medir el nivel de luz mirando el voltaje generado por el LED conectado a D4 (A2) en pin 3 del chip.
Salida y bajo para comenzar a descargar cualquier tipo de carga - no estoy seguro si necesitamos esto
int lightLevel() {}
pinMode (LEDpin, salida);
digitalWrite (LEDpin, LOW);
delayMicroseconds(50);
pinMode (LEDpin, entrada);
delayMicroseconds(100); Deje que se estabilice como entrada otra vez
unsigned int valor = analogRead(A2);
devolver valor;
}

Flash rutina - 70ms, 250 ms off
Repetir cierto número de veces y luego pausa 500ms
void flash(byte No) {}
pinMode (LEDpin, salida);

if (!. No) {/ / si recibimos un cero, simplemente pausa.
PAUSE(5);
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
}

Si tenemos un número distinto de cero de los flashes, les haremos ahora
para (rep byte = 0; rep < No; rep ++) {}
flashDot(70);
}

Pausa (sueño)
PAUSE(5);
DDRB| = B00011010; Set 1 y 3 como salida
PORTB & = B11110111; Pb3 baja.
}

void pausa (tiempo de byte) {}
DDRB & = B11100000; Set todo para entrada
setup_watchdog(Time); establecer período de espera
system_sleep(); / / dormir
}

void flashMorse() {}
para (rep byte = 0; rep < seqLength; rep ++) {}
Índice de byte = 0;
Si (flashSeq [rep] < 65 || flashSeq [rep] > 90) index = 0;
otro índice = flashSeq [rep] -64;
pause(6) de if(!index);
Else {}
byte dotdash = morse [índice-1] >> 3; poner sólo parte de la secuencia (5 bits) en dotdash
Puntos y guiones según secuencia codificada en morse]
para (byte parpadea = 0; parpadea < ((morse[(index-1)] & B111)); parpadea ++) {}
Si (dotdash & 1)flashDot(160); Si el LSB es 1 entonces muestra un tablero
flashDot(40) otra cosa; de lo contrario es un punto
PAUSE(4); pausa entre destellos - 256ms
dotdash >> = 1; ruedan en el bit siguiente
}
PAUSE(5); Final de palabra pausa 0.5s
}
}
}

Flash LED por vez (< ms 256) y pausa para 250ms.
void flashDot (tiempo de byte) {}
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
PORTB| = B00010000; PB4 alta
Delay(Time);
PORTB & = B11101111; PB4 baja.
PAUSE(4);
}

Configuración del temporizador perro guardián
Esto es específico a ATTiny85 (+ tiny45 & tiny25) y no compila para ATMega328, etc..
0 = 16ms, 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250ms, 5 = 500ms
6 = 1 sec, 7 = 2 seg, 8 = 4 seg, 9 = 8 seg.
void setup_watchdog (int periodo) {}

valor del octeto;
Si período (período > 9) = 9;
valor = período & B111;
Si value| (período > 7) = (1 << 5);
Value| = (1 << WDCE);

MCUSR & = ~ (1 << WDRF);
Iniciar secuencia de tiempo de ciclo de reloj 4
WDTCR | = (1 << WDCE) | (1 << WDE);
definir el nuevo valor de tiempo de espera vigilante
WDTCR = valor;
WDTCR | = _BV(WDIE);
}

del sistema en el estado de sueño
sistema se despierta cuando está agotado wtchdog
void system_sleep() {}
CBI(ADCSRA,Aden);                    interruptor análogo a Digitalconverter

set_sleep_mode(SLEEP_MODE_PWR_DOWN); modo de reposo se encuentra aquí
sleep_enable();

sleep_mode();                        Sistema duerme aquí

sleep_disable();                     Sistema continúa ejecución aquí cuando agotado el tiempo de vigilancia
SBI(ADCSRA,Aden);                    interruptor analógico on Digitalconverter
PRR y = B11111110; claro ADC disable bit Reg de reducción de potencia
}
Esofagogastroduodenal 2012
Licencia MIT
Escrito en ATtiny25/45/85 usando Arduino Tiny core - http://code.google.com/p/arduino-tiny/
No compilará para otros Arduinos (ATMega168, ATMega328 etc.)
Asegúrese de que selecciona la Junta correcta antes de compilar.

Ref:
Pines del ADC:
ADC1 = PB2
ADC2 = PB4
ADC3 = PB3

Si desea cambiar el patrón de iluminación, hazlo aquí.
valor por defecto es:
//
[] flashSeq de const char = {"oscuro aquí ISNT IT"};  Mensaje de Morse.  Editar esto.
//
Editar el mensaje con mayúsculas caracteres solamente.
Nada va a salir como un 1s retardo.
Después de la secuencia, esperamos para el 4s antes de repetir.

[] flashSeq de const char = {"oscuro aquí ISNT IT"};  Mensaje de Morse.  Editar esto.
const bytes seqLength =(sizeof(flashSeq)-1);

Codificación de código Morse
Guardan como un byte por letra.
Alta 5 pedacitos son 1- y 0 para el principio con LSB de ésos high-5...
Baja 3 bits dan número de parpadeos (puntos + guiones).
Morse permite 5 parpadeos (para números) pero Letras requieren máximo 4.
Este formato por lo tanto podría ser utilizado para números así pero no he implementado.
byte const morse [26] = {}
B00010010, //a
B00001100, //b
B00101100, //c
B00001011, //d
B00000001, //e
B00100100, //f
B00011011, //g
B00000100, //h
B00000010, //i
B01110100, //j
B00101011, //k
B00010100, //l
B00011010, //m
B00001010, //n
B00111011, //o
B00110100, //p
B01011100, //q
B00010011, //r
B00000011, //s
B00001001, //t
B00100011, //u
B01000100, //v
B00110011, //w
B01001100, //x
B01101100, //y
B00011100, //z
};
Ahora vamos a hacer un fotorresistencias para esa secuencia...

const int LEDpin = 4; Aunque esto está en una constante, hay un acceso directo del puerto
No trato de cambiar esto sin ir throu' el código entero.

umbral de unsigned int = 10; Esto instalaremos correctamente durante la instalación

Esto establece algunas librerías y definiciones para el uso con el temporizador para dormir
#include
#include
#ifndef cbi
#define cbi (sfr, bits) (_SFR_BYTE(sfr) & = ~_BV(bit))
#endif
#ifndef OSE
#define OSE (sfr, bits) (_SFR_BYTE(sfr) | = _BV(bit))
#endif

ISR(WDT_vect) {WDTCR| = B01000000;} / / reset Watchdog Timer al modo de interrupción de cada vez.

Metas con algunos registros para desactivar cosas y referencias.
void setup() {}
ADCSRB & = B10111111; desactivar comparitor
ACSR | = B10000000; Apague comparitor
ADCSRA | = B10000000; / / enciende ADC
DDRB & = B11100000; Set todo para entrada
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Set PB3 baja - esto era para la fase de prueba.  Probablemente puede ser caído ahora.
PRR y = B11111110; claro ADC disable bit Reg de reducción de potencia
analogReference(6); 2.56v interno de referencia con sin bypass - INTERNAL2v56NB-

Mostrar que estamos despiertos:
Flash(3);  Tres destellos - estamos ya en funcionamiento.


Establecer el umbral para la detección de luz durante los primeros 40 segundos.
Tomar 148 medidas, bin los primeros 20 y media entonces la siguiente 128.
unsigned int total = 0;
para (rep byte = 0; rep < 148; rep ++) {}
int value=lightLevel();
int valor = 10;
if(REP>19) {}
total += valor; tatke total de 128 lecturas
}
Flash(Value);

PAUSE(4); / / pause(4)
DDRB| = B00011010; Establecer 1, 3 y 4 como salida
PORTB & = B1110000; Todo bajo
}
umbral = (total >> 5); Ajuste el umbral a medio punto (dividir total de 128).

Flash(THRESHOLD); Esto es principalmente para propósitos de depuración.
}

Bucle principal
Medimos el nivel de luz.  Si es bajo entonces nos flash nuestra secuencia entonces sueño de 2s.
Si luz nivel alto, dormimos para 8s.
void loop() {}
analogReference(6); 2.56v interno de referencia con sin bypass

Medir el nivel de luz y si es lo suficientemente baja, mostrar nuestra secuencia flash
Si (lightLevel()
flashMorse();
Si nosotros nos parpadea, ahora dormimos para el 4s
PAUSE(8);
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
}
Else {}
Si nosotros no nos parpadea entonces dormimos para 8s
PAUSE(9);
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
}

} / / fin de bucle principal

Medir el nivel de luz mirando el voltaje generado por el LED conectado a D4 (A2) en pin 3 del chip.
Salida y bajo para comenzar a descargar cualquier tipo de carga - no estoy seguro si necesitamos esto
int lightLevel() {}
pinMode (LEDpin, salida);
digitalWrite (LEDpin, LOW);
delayMicroseconds(50);
pinMode (LEDpin, entrada);
delayMicroseconds(100); Deje que se estabilice como entrada otra vez
unsigned int valor = analogRead(A2);
devolver valor;
}

Flash rutina - 70ms, 250 ms off
Repetir cierto número de veces y luego pausa 500ms
void flash(byte No) {}
pinMode (LEDpin, salida);

if (!. No) {/ / si recibimos un cero, simplemente pausa.
PAUSE(5);
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
}

Si tenemos un número distinto de cero de los flashes, les haremos ahora
para (rep byte = 0; flashDot(70) de rep;
}

Pausa (sueño)
PAUSE(5);
DDRB| = B00011010; Set 1 y 3 como salida
PORTB & = B11110111; Pb3 baja.
}

void pausa (tiempo de byte) {}
DDRB & = B11100000; Set todo para entrada
setup_watchdog(Time); establecer período de espera
system_sleep(); / / dormir
}

void flashMorse() {}
para (rep byte = 0; índice de rep byte = 0;
Si (flashSeq [rep] < 65 || flashSeq [rep] > 90) index = 0;
otro índice = flashSeq [rep] -64;
pause(6) de if(!index);
Else {}
byte dotdash = morse [índice-1] >> 3; poner sólo parte de la secuencia (5 bits) en dotdash
Puntos y guiones según secuencia codificada en morse]
para (byte parpadea = 0; parpadea < ((morse[(index-1)] & B111)); parpadea ++) {}
Si (dotdash & 1)flashDot(160); Si el LSB es 1 entonces muestra un tablero
flashDot(40) otra cosa; de lo contrario es un punto
PAUSE(5); pausa entre destellos - 256ms
dotdash >> = 1; ruedan en el bit siguiente
}
PAUSE(6); Final de palabra pausa 1 s
}
}
}

Flash LED por vez (< ms 256) y pausa para 250ms.
void flashDot (tiempo de byte) {}
DDRB| = B00011010; Set 1, 3 y 4 como salida
PORTB & = B11110111; Pb3 baja.
PORTB| = B00010000; PB4 alta
Delay(Time);
PORTB & = B11101111; PB4 baja.
PAUSE(4);
}

Configuración del temporizador perro guardián
Esto es específico a ATTiny85 (+ tiny45 & tiny25) y no compila para ATMega328, etc..
0 = 16ms, 1 = 32ms, 2 = 64ms, 3 = 128ms, 4 = 250ms, 5 = 500ms
6 = 1 sec, 7 = 2 seg, 8 = 4 seg, 9 = 8 seg.
void setup_watchdog (int periodo) {}

valor del octeto;
Si período (período > 9) = 9;
valor = período & B111;
Si value| (período > 7) = (1 << 5);
Value| = (1 <

MCUSR & = ~(1<
Iniciar secuencia de tiempo de ciclo de reloj 4
WDTCR | = (1 < / / definir el nuevo valor de tiempo de espera vigilante
WDTCR = valor;
WDTCR | = _BV(WDIE);
}

del sistema en el estado de sueño
sistema se despierta cuando está agotado wtchdog
void system_sleep() {}
CBI(ADCSRA,Aden);                    interruptor análogo a Digitalconverter

set_sleep_mode(SLEEP_MODE_PWR_DOWN); modo de reposo se encuentra aquí
sleep_enable();

sleep_mode();                        Sistema duerme aquí

sleep_disable();                     Sistema continúa ejecución aquí cuando agotado el tiempo de vigilancia
SBI(ADCSRA,Aden);                    interruptor analógico on Digitalconverter
PRR y = B11111110; claro ADC disable bit Reg de reducción de potencia
}

Artículos Relacionados

Bola que destella LED con agua salina

Bola que destella LED con agua salina

La bola de LED es un proyecto basado en la propiedad eléctrica de agua salina. Primero poner el cátodo del LED en una taza con agua salada, conecta el ánodo al polo positivo de una batería y también conectar un cable al polo negativo de la batería. S
Arduino + WiFi, música sensible accesorio de luz LED

Arduino + WiFi, música sensible accesorio de luz LED

este instructable le da instrucciones para construir un Saiko5 WiFi activado LED luminaria basada en la plataforma de Arduino aficionado. Incluye instrucciones paso a paso desde el diseño de la Junta a soldar para integración de caso, así como las in
Luz que brilla intensamente de la bicicleta

Luz que brilla intensamente de la bicicleta

mi hijo le encanta la película "Tron" y quería la moto de luz que está en la película. Ya... Hacen, pero... Es de 50 + gran manera que no va a suceder, lo siento amigo.  Por cierto este es mi primer instructivo, así que por favor sea paciente. Q
Dr que TARDIS diadema con intermitente efecto luz y sonido

Dr que TARDIS diadema con intermitente efecto luz y sonido

Así, mi amigo es un gran que fan (como soy). Ella tiene el vestido de la TARDIS y los calcetines y todo. Dijo que también venden una diadema TARDIS con un poco de luz en la parte superior. Sin embargo, la luz es solo plástico y no se enciende. Era un
Tira de la energía en el día y la noche!: toma de corriente sensible A la luz

Tira de la energía en el día y la noche!: toma de corriente sensible A la luz

día y noche tira de la energía es un poder capaz de cambiar su producción dependiendo de la luz que recibe en su superficie. Sus sensores son LDRs que son resistencias básicamente variables que cambian dependiendo de la intensidad de la luz que recib
Panel de la puerta de luz de Navidad que destella

Panel de la puerta de luz de Navidad que destella

Se trata de un panel de la puerta de luz de Navidad que hice para una concurso de decoración de la puerta. Perdí.  De todos modos, pensé que sería postearlo aquí.  Mina adapta a las dimensiones de la puerta, pero podría hacerlo en cualquier tamaño y
Hacer una luz de noche LED con estrella

Hacer una luz de noche LED con estrella

Esta luz nocturna LED cuenta con un patrón de estrella y se ilumina una habitación oscura en una forma mágica. He utilizado ipe para la madera, sin embargo todo oscuro, o MDF pintado por ejemplo se trabajaría bien. Este es un muy divertido proyecto y
Controlar cualquier aparato luz o eléctrico con tablet o smartphone (wifi)

Controlar cualquier aparato luz o eléctrico con tablet o smartphone (wifi)

Controlar cualquier aparato ligero o eléctrico con tablet o smartphone (wifi) usando arduino, blynk y un wemos / Junta de ESP8266En este tutorial vamos a hacer algo pido un wifi controlado interruptor de CA. (Pero también funciona para las aplicacion
¿Qué es la luz? Sondeo alrededor con mi DIY espectroscopio

¿Qué es la luz? Sondeo alrededor con mi DIY espectroscopio

Recientemente conseguí un kit de escritorio espectroscopia de publiclab! Realmente tuve muy divertido edificio y sondeo de fuentes de luz con su infierno. Su un juego impresionante con todos los elementos necesarios para conseguir tu propio espectros
Switch luz de Wi-Fi con frambuesa Pi

Switch luz de Wi-Fi con frambuesa Pi

¡ Hola! En este instructable, voy a mostrarte cómo construí mi interruptor de la luz de Wi-Fi con una Raspberry Pi y algunos componentes básicos. Tenga en cuenta que este es mi primer instructivo y no soy muy bueno en explicar las cosas, así que voy
Señal de tráfico / luz de freno cables con controlador Arduino

Señal de tráfico / luz de freno cables con controlador Arduino

siempre ha querido una vieja señal de tráfico y finalmente consiguió uno recientemente.  Sin embargo, fue muy simple cableado para que todas las luces estaban fijos en.  ¿Qué divertido es esto?  También quería probar un controlador Arduino y pensé qu
Reparación de un montaje de luz de la bici con la impresión 3D

Reparación de un montaje de luz de la bici con la impresión 3D

impresoras 3D tienen increíbles posibilidades para hacer nuestro mundo mejor, pero desafortunadamente muchas de las cosas que la gente imprime ellos tienen poco o ningún valor útil.  Desde una perspectiva ambiental, impresión 3D está lejos de ser per
ESPECTÁCULO de luz cristal motorizado LED con VIDEO

ESPECTÁCULO de luz cristal motorizado LED con VIDEO

este instructable le dará un conocimiento medio sobre cómo hacer un espectáculo de luces de cristal motorizadas. Es muy hermosa y por favor voten por él en el haz del LED hacia fuera COMP. Tampoco soy bueno en dibujo esquemas:). También perdón por no
Construir un cambio de color, luz de noche LED con pilas

Construir un cambio de color, luz de noche LED con pilas

un pequeño pero poderoso con pilas luz de la noche.  Seleccione de modos diferentes de color sólido o disco modo llamativo!  También haría una luz excelente bicicleta.  Construido a partir de 7 LEDs de color y un dot-it.Encontré estos LEDs comprando