Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Relógio mestre

Componentes e suprimentos

Arduino UNO
× 1
Freetronics DMD Display
× 1
Módulo RTC
× 1
Botão de ação momentâneo
× 1
Botão liga / desliga
× 1

Aplicativos e serviços online

Arduino IDE

Sobre este projeto

Sobre


Este é um projeto para qualquer pessoa que queira um belo relógio grande que seja visível a 12 metros de distância ou de perto. Você pode torná-lo tão grande quanto quiser. Ele também incorpora um despertador embutido que pode ser usado como um manipulador de eventos, digamos para um sistema de rega automatizado para um jardim ou para lembrá-lo sobre aquele encontro semanal que você deveria ir, ou qualquer outra coisa que você possa conectar a um relé .

Você precisará de:


● Display DMD Freetronics

● Módulo de relógio em tempo real para Arduino

● Campainha (opcional - algo alto o suficiente para acordar de manhã)

● Botão momentaneamente ligado

● 2 botões liga-desliga (Power one é opcional)

● Arduino UNO ou placa compatível com Arduino

● Proto-escudo para Arduino (opcional)

● Fonte de alimentação para Arduino

● Uma fonte de alimentação regulada de 5 VCC, capaz de 4 - 30 amperes (opcional para alto brilho - não necessária para operação normal)

Construção:

Parte 1 - Eletrônicos:


Etapa 1:conecte a campainha, o botão de silêncio e o botão de ajuste do alarme ao breadboard

Etapa 2:Conecte um dos pinos de cada chave ao aterramento e o pino GND das campainhas ao pino GND no Arduino (conforme mostrado no diagrama)

Etapa 3:Conecte o outro pino da chave de definição de alarme a D2, o pino de silêncio a D3 e a campainha a D4

Etapa 4:Conecte seu módulo RTC ao Arduino de acordo com seu tipo (leia os dados de fabricação - siga o diagrama na maioria dos casos)

Etapa 5:Conecte o DMDCON ao Arduino e conecte o DMD

Etapa 6:Para obter o brilho total do DMD, conecte uma fonte de 5 V aos terminais de alto brilho

Etapa 7:se desejar fazer isso em uma proto-blindagem, solde todas as peças à blindagem e conecte-as adequadamente

Parte 2 - Software:


Primeiro você precisa instalar a biblioteca DMD disponível aqui e instalá-la em sua pasta de bibliotecas.

O software pode ser baixado do Prototyping Corner ou na parte inferior desta página. Contém as operações básicas para o relógio principal.

Para definir a hora no módulo RTC, localize as linhas 117 a 124 e ajuste-as para a hora atual. Agora descomente a linha 124 e carregue no Arduino. Agora comente a linha 124 novamente e carregue novamente. Se isso não for feito, o RTC permanecerá o mesmo tempo.

Nas linhas 593 e 594, você define a hora e os dias em que deseja que o alarme ocorra. A linha 593 é o dia da semana em que você deseja que ocorra. Os dias correspondem aos números da seguinte forma:

1 =domingo

2 =segunda-feira

3 =terça-feira

4 =quarta-feira

5 =quinta-feira

6 =sexta-feira

7 =sábado

Em seguida, na linha 594, defina a hora em que o alarme dispara no formato de 24 horas.

Indo além:

Adicionando mais monitores:


Você pode adicionar mais telas DMD para aumentar o relógio. Leia isto para mais informações.

Adicionando mais alarmes:


Para adicionar mais alarme, adicione as seguintes linhas de código ao esboço e chame o vazio no loop principal:

void CheckAlarm-ALARM-NO- () {

AlarmSet =digitalRead (AlarmSetPin);

Snooze =digitalRead (SnoozePin);

byte, segundo, minuto, hora, dayOfWeek, dayOfMonth, mês, ano;

getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

/ * Apenas dispara o alarme se for um dia listado abaixo. Isso pode ser alterado alterando os números para qualquer um dos seguintes:

1 =Domingo

2 =segunda-feira

3 =terça

4 =quarta-feira

5 =quinta

6 =sexta-feira

7 =Sábado

* /

if (dayOfWeek ==2 || dayOfWeek ==3 || dayOfWeek ==4 || dayOfWeek ==5 || dayOfWeek ==6) {// Dias PERMITIDOS para tocar o alarme

if (hour ==18 &&minute ==05) {// Definir hora aqui (em 24 horas)

if (AlarmSet ==LOW) {// Se o pino de alarme estiver ativado

Snooze =digitalRead (SnoozePin);

while (Snooze ==HIGH)

{

Snooze =digitalRead (SnoozePin);

// Adicione o que acontece aqui

}

}

}

}


Código

  • Código para relógio mestre
Código para relógio mestre C / C ++
 / * Esboço do relógio mestre. Criado em 26/03/14 Este é um programa arduino usando o Freetronics DMD como uma saída para exibição. Ele contém uma função de alarme. O dia, a data e a hora são impressos no DMD. O botão de função de alarme está nos pinos 2 para definir o alarme, 3 para soneca e 4 para o alarme de saída. A hora do alarme e os dias da semana podem ser definidos nas linhas 551 e 552. Jed Hodson 2014 * / byte dayOfWeek =4; byte dayOfMonth =1; #include  //SPI.h deve ser incluído como DMD é escrito por SPI (o IDE reclama o contrário) #include  // # include  // # include "SystemFont5x7.h" #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68int AlarmSetPin =2; int SnoozePin =3; int Alarm =4; int AlarmSet =0; int Snooze =0; // Converter números decimais normais em decToBcd decToBcd (valor de byte) {return ((val / 10 * 16) + (val% 10));} // Converter decimal codificado binário em números decimais normaisbyte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16));} // 1) Define a data e hora no ds1307 // 2) Inicia o relógio // 3) Define o modo de hora para relógio de 24 horas // Presume que você está passando números válidos para evitar setDateDs1307 (byte segundo, // 0-59byte minuto, // 0-59byte hora, // 1-23byte dayOfWeek, // 1-7byte dayOfMonth, // 1-28 / 29/30 / 31byte mês, // 1-12byte ano) // 0-99 {Wire.beginTransmission (DS1307_I2C_AD VESTIR); Wire.write (0); Wire.write (decToBcd (segundo)); // 0 ao bit 7 inicia o relógio Wire.write (decToBcd (minuto)); Wire.write (decToBcd (hora)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mês)); Wire.write (decToBcd (ano)); Wire.write (00010000); // envia 0x10 (hex) 00010000 (binário) para o registro de controle - ativa a onda quadrada Wire.endTransmission ();} // Obtém a data e hora de ds1307void getDateDs1307 (byte * segundo, byte * minuto, byte * hora, byte * dayOfWeek, byte * dayOfMonth, byte * mês, byte * ano) {// Reinicializar o ponteiro de registro Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission (); Wire.requestFrom (DS1307_I2C_ADDRESS, 7); // Alguns deles precisam de máscaras porque certos bits são bits de controle * segundo =bcdToDec (Wire.read () &0x7f); * minuto =bcdToDec (Wire.read ()); * hora =bcdToDec (Wire.read () &0x3f); // É necessário alterar isso se 12 horas am / pm * dayOfWeek =bcdToDec (Wire.read ()); * dayOfMonth =bcdToDec (Wire.read ()); * mês =bcdToDec (Wire.read ()); * year =bcdToDec (Wire.read ());} // Abra a biblioteca DMD como dmdDMD dmd (1,1); void ScanDMD () {dmd.scanDisplayBySPI ();} void setup () {byte segundo, minuto , hora, dayOfWeek, dayOfMonth, mês, ano; // inicializa a interrupção do TimerOne / uso da CPU usada para verificar e atualizar a exibição Timer1.initialize (5000); // período em microssegundos para chamar ScanDMD. Qualquer coisa maior que 5000 (5ms) e você pode ver a oscilação. Timer1.attachInterrupt (ScanDMD); // anexa a interrupção Timer1 ao ScanDMD que vai para dmd.scanDisplayBySPI () // limpa / inicia os pixels DMD mantidos na RAM dmd.clearScreen (true); // verdadeiro é normal (todos os pixels desativados), falso é negativo (todos os pixels ativados) dmd.selectFont (System5x7); Wire.begin (); // Altere esses valores para o que você deseja definir para o seu relógio. // Você provavelmente só deseja definir seu relógio uma vez e, em seguida, remover // a chamada setDateDs1307. segundo =0; minuto =35; hora =11; // use o horário de 24 horas, caso contrário os cálculos de dia / data serão desativados dayOfWeek =1; dayOfMonth =23; mês =3; ano =14; // descomente a chamada setDateDs1307 abaixo para definir o tempo para os intervalos acima. Lembre-se de que se você definir o tempo // você precisa descomentar a linha abaixo novamente, caso contrário, o esboço ficará apenas no tempo definido. // setDateDs1307 (segundo, minuto, hora, dayOfWeek, dayOfMonth, mês, ano); pinMode (AlarmSetPin, INPUT_PULLUP); pinMode (SnoozePin, INPUT_PULLUP); pinMode (Alarme, SAÍDA); digitalWrite (Alarm, LOW);} void drawDay () // mostra o dia da semana {byte, segundo, minuto, hora, dayOfWeek, dayOfMonth, month, year; getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); switch (dayOfWeek) {case 1:dmd.drawString (1,0, "Sun,", 3, GRAPHICS_NORMAL); pausa; caso 2:dmd.drawString (1,0, "Mon,", 3, GRAPHICS_NORMAL); pausa; caso 3:dmd.drawString (1,0, "Tue,", 3, GRAPHICS_NORMAL); pausa; caso 4:dmd.drawString (1,0, "Quarta,", 3, GRAPHICS_NORMAL); pausa; caso 5:dmd.drawString (1,0, "Thu,", 3, GRAPHICS_NORMAL); pausa; caso 6:dmd.drawString (1,0, "Sex,", 3, GRAPHICS_NORMAL); pausa; caso 7:dmd.drawString (1,0, "Sat,", 3, GRAPHICS_NORMAL); pausa; }} void drawDate () // mostra a data numérica {byte segundo, minuto, hora, dayOfWeek, dayOfMonth, month, year; getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); switch (dayOfMonth) {case 1:dmd.drawString (20,0, "01", 2, GRAPHICS_NORMAL); pausa; caso 2:dmd.drawString (20,0, "02", 2, GRAPHICS_NORMAL); pausa; caso 3:dmd.drawString (20,0, "03", 2, GRAPHICS_NORMAL); pausa; caso 4:dmd.drawString (20,0, "04", 2, GRAPHICS_NORMAL); pausa; caso 5:dmd.drawString (20,0, "05", 2, GRAPHICS_NORMAL); pausa; caso 6:dmd.drawString (20,0, "06", 2, GRAPHICS_NORMAL); pausa; caso 7:dmd.drawString (20,0, "07", 2, GRAPHICS_NORMAL); pausa; caso 8:dmd.drawString (20,0, "08", 2, GRAPHICS_NORMAL); pausa; caso 9:dmd.drawString (20,0, "09", 2, GRAPHICS_NORMAL); pausa; caso 10:dmd.drawString (20,0, "10", 2, GRAPHICS_NORMAL); pausa; caso 11:dmd.drawString (20,0, "11", 2, GRAPHICS_NORMAL); pausa; caso 12:dmd.drawString (20,0, "12", 2, GRAPHICS_NORMAL); pausa; caso 13:dmd.drawString (20,0, "13", 2, GRAPHICS_NORMAL); pausa; caso 14:dmd.drawString (20,0, "14", 2, GRAPHICS_NORMAL); pausa; caso 15:dmd.drawString (20,0, "15", 2, GRAPHICS_NORMAL); pausa; caso 16:dmd.drawString (20,0, "16", 2, GRAPHICS_NORMAL); pausa; caso 17:dmd.drawString (20,0, "17", 2, GRAPHICS_NORMAL); pausa; caso 18:dmd.drawString (20,0, "18", 2, GRAPHICS_NORMAL); pausa; caso 19:dmd.drawString (20,0, "19", 2, GRAPHICS_NORMAL); pausa; caso 20:dmd.drawString (20,0, "20", 2, GRAPHICS_NORMAL); pausa; caso 21:dmd.drawString (20,0, "21", 2, GRAPHICS_NORMAL); pausa; caso 22:dmd.drawString (20,0, "22", 2, GRAPHICS_NORMAL); pausa; caso 23:dmd.drawString (20,0, "23", 2, GRAPHICS_NORMAL); pausa; caso 24:dmd.drawString (20,0, "24", 2, GRAPHICS_NORMAL); pausa; caso 25:dmd.drawString (20,0, "25", 2, GRAPHICS_NORMAL); pausa; caso 26:dmd.drawString (20,0, "26", 2, GRAPHICS_NORMAL); pausa; caso 27:dmd.drawString (20,0, "27", 2, GRAPHICS_NORMAL); pausa; caso 28:dmd.drawString (20,0, "28", 2, GRAPHICS_NORMAL); pausa; caso 29:dmd.drawString (20,0, "29", 2, GRAPHICS_NORMAL); pausa; caso 30:dmd.drawString (20,0, "30", 2, GRAPHICS_NORMAL); pausa; caso 31:dmd.drawString (20,0, "31", 2, GRAPHICS_NORMAL); pausa; }} void drawHour () // desenha o ponteiro das horas {byte segundo, minuto, hora, dayOfWeek, dayOfMonth, month, year; getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); if (hora> 12) // Remova este comando if para 24 horas {hora =hora-12; // Este é um relógio de 12 horas} switch (hora) {case 1:dmd.drawString (1,8, "01", 2, GRAPHICS_NORMAL); pausa; caso 2:dmd.drawString (1,8, "02", 2, GRAPHICS_NORMAL); pausa; caso 3:dmd.drawString (1,8, "03", 2, GRAPHICS_NORMAL); pausa; caso 4:dmd.drawString (1,8, "04", 2, GRAPHICS_NORMAL); pausa; caso 5:dmd.drawString (1,8, "05", 2, GRAPHICS_NORMAL); pausa; caso 6:dmd.drawString (1,8, "06", 2, GRAPHICS_NORMAL); pausa; caso 7:dmd.drawString (1,8, "07", 2, GRAPHICS_NORMAL); pausa; caso 8:dmd.drawString (1,8, "08", 2, GRAPHICS_NORMAL); pausa; caso 9:dmd.drawString (1,8, "09", 2, GRAPHICS_NORMAL); pausa; caso 10:dmd.drawString (1,8, "10", 2, GRAPHICS_NORMAL); pausa; caso 11:dmd.drawString (1,8, "11", 2, GRAPHICS_NORMAL); pausa; caso 12:dmd.drawString (1,8, "12", 2, GRAPHICS_NORMAL); pausa; caso 13:dmd.drawString (1,8, "13", 2, GRAPHICS_NORMAL); pausa; caso 14:dmd.drawString (1,8, "14", 2, GRAPHICS_NORMAL); pausa; caso 15:dmd.drawString (1,8, "15", 2, GRAPHICS_NORMAL); pausa; caso 16:dmd.drawString (1,8, "16", 2, GRAPHICS_NORMAL); pausa; caso 17:dmd.drawString (1,8, "17", 2, GRAPHICS_NORMAL); pausa; caso 18:dmd.drawString (1,8, "18", 2, GRAPHICS_NORMAL); pausa; caso 19:dmd.drawString (1,8, "19", 2, GRAPHICS_NORMAL); pausa; caso 20:dmd.drawString (1,8, "20", 2, GRAPHICS_NORMAL); pausa; caso 21:dmd.drawString (1,8, "21", 2, GRAPHICS_NORMAL); pausa; caso 22:dmd.drawString (1,8, "22", 2, GRAPHICS_NORMAL); pausa; caso 23:dmd.drawString (1,8, "23", 2, GRAPHICS_NORMAL); pausa; caso 24:dmd.drawString (1,8, "24", 2, GRAPHICS_NORMAL); pausa; }} void drawMinute () {byte segundo, minuto, hora, dayOfWeek, dayOfMonth, mês, ano; getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); switch (minuto) {case 0:dmd.drawString (20,8, "00", 2, GRAPHICS_NORMAL); pausa; caso 1:dmd.drawString (20,8, "01", 2, GRAPHICS_NORMAL); pausa; caso 2:dmd.drawString (20,8, "02", 2, GRAPHICS_NORMAL); pausa; caso 3:dmd.drawString (20,8, "03", 2, GRAPHICS_NORMAL); pausa; caso 4:dmd.drawString (20,8, "04", 2, GRAPHICS_NORMAL); pausa; caso 5:dmd.drawString (20,8, "05", 2, GRAPHICS_NORMAL); pausa; caso 6:dmd.drawString (20,8, "06", 2, GRAPHICS_NORMAL); pausa; caso 7:dmd.drawString (20,8, "07", 2, GRAPHICS_NORMAL); pausa; caso 8:dmd.drawString (20,8, "08", 2, GRAPHICS_NORMAL); pausa; caso 9:dmd.drawString (20,8, "09", 2, GRAPHICS_NORMAL); pausa; caso 10:dmd.drawString (20,8, "10", 2, GRAPHICS_NORMAL); pausa; caso 11:dmd.drawString (20,8, "11", 2, GRAPHICS_NORMAL); pausa; caso 12:dmd.drawString (20,8, "12", 2, GRAPHICS_NORMAL); pausa; caso 13:dmd.drawString (20,8, "13", 2, GRAPHICS_NORMAL); pausa; caso 14:dmd.drawString (20,8, "14", 2, GRAPHICS_NORMAL); pausa; caso 15:dmd.drawString (20,8, "15", 2, GRAPHICS_NORMAL); pausa; caso 16:dmd.drawString (20,8, "16", 2, GRAPHICS_NORMAL); pausa; caso 17:dmd.drawString (20,8, "17", 2, GRAPHICS_NORMAL); pausa; caso 18:dmd.drawString (20,8, "18", 2, GRAPHICS_NORMAL); pausa; caso 19:dmd.drawString (20,8, "19", 2, GRAPHICS_NORMAL); pausa; caso 20:dmd.drawString (20,8, "20", 2, GRAPHICS_NORMAL); pausa; caso 21:dmd.drawString (20,8, "21", 2, GRAPHICS_NORMAL); pausa; caso 22:dmd.drawString (20,8, "22", 2, GRAPHICS_NORMAL); pausa; caso 23:dmd.drawString (20,8, "23", 2, GRAPHICS_NORMAL); pausa; caso 24:dmd.drawString (20,8, "24", 2, GRAPHICS_NORMAL); pausa; caso 25:dmd.drawString (20,8, "25", 2, GRAPHICS_NORMAL); pausa; caso 26:dmd.drawString (20,8, "26", 2, GRAPHICS_NORMAL); pausa; caso 27:dmd.drawString (20,8, "27", 2, GRAPHICS_NORMAL); pausa; caso 28:dmd.drawString (20,8, "28", 2, GRAPHICS_NORMAL); pausa; caso 29:dmd.drawString (20,8, "29", 2, GRAPHICS_NORMAL); pausa; caso 30:dmd.drawString (20,8, "30", 2, GRAPHICS_NORMAL); pausa; caso 31:dmd.drawString (20,8, "31", 2, GRAPHICS_NORMAL); pausa; caso 32:dmd.drawString (20,8, "32", 2, GRAPHICS_NORMAL); pausa; caso 33:dmd.drawString (20,8, "33", 2, GRAPHICS_NORMAL); pausa; caso 34:dmd.drawString (20,8, "34", 2, GRAPHICS_NORMAL); pausa; caso 35:dmd.drawString (20,8, "35", 2, GRAPHICS_NORMAL); pausa; caso 36:dmd.drawString (20,8, "36", 2, GRAPHICS_NORMAL); pausa; caso 37:dmd.drawString (20,8, "37", 2, GRAPHICS_NORMAL); pausa; caso 38:dmd.drawString (20,8, "38", 2, GRAPHICS_NORMAL); pausa; caso 39:dmd.drawString (20,8, "39", 2, GRAPHICS_NORMAL); pausa; caso 40:dmd.drawString (20,8, "40", 2, GRAPHICS_NORMAL); pausa; caso 41:dmd.drawString (20,8, "41", 2, GRAPHICS_NORMAL); pausa; caso 42:dmd.drawString (20,8, "42", 2, GRAPHICS_NORMAL); pausa; caso 43:dmd.drawString (20,8, "43", 2, GRAPHICS_NORMAL); pausa; caso 44:dmd.drawString (20,8, "44", 2, GRAPHICS_NORMAL); pausa; caso 45:dmd.drawString (20,8, "45", 2, GRAPHICS_NORMAL); pausa; caso 46:dmd.drawString (20,8, "46", 2, GRAPHICS_NORMAL); pausa; caso 47:dmd.drawString (20,8, "47", 2, GRAPHICS_NORMAL); pausa; caso 48:dmd.drawString (20,8, "48", 2, GRAPHICS_NORMAL); pausa; caso 49:dmd.drawString (20,8, "49", 2, GRAPHICS_NORMAL); pausa; caso 50:dmd.drawString (20,8, "50", 2, GRAPHICS_NORMAL); pausa; caso 51:dmd.drawString (20,8, "51", 2, GRAPHICS_NORMAL); pausa; caso 52:dmd.drawString (20,8, "52", 2, GRAPHICS_NORMAL); pausa; caso 53:dmd.drawString (20,8, "53", 2, GRAPHICS_NORMAL); pausa; caso 54:dmd.drawString (20,8, "54", 2, GRAPHICS_NORMAL); pausa; caso 55:dmd.drawString (20,8, "55", 2, GRAPHICS_NORMAL); pausa; caso 56:dmd.drawString (20,8, "56", 2, GRAPHICS_NORMAL); pausa; caso 57:dmd.drawString (20,8, "57", 2, GRAPHICS_NORMAL); pausa; caso 58:dmd.drawString (20,8, "58", 2, GRAPHICS_NORMAL); pausa; caso 59:dmd.drawString (20,8, "59", 2, GRAPHICS_NORMAL); pausa; }} void drawCol () {dmd.drawString (14,8, ":", 1, GRAPHICS_NORMAL);} void runClock () {drawDay (); drawDate (); drawHour (); drawCol (); drawMinute (); CheckAlarm ();} void AlarmSequence () {drawDay (); drawDate (); drawHour (); drawCol (); drawMinute (); digitalWrite (Alarme, ALTO); atraso (1000); dmd.clearScreen (true); digitalWrite (Alarme, BAIXO); atraso (1000);} void CheckAlarm () {AlarmSet =digitalRead (AlarmSetPin); Snooze =digitalRead (SnoozePin); byte segundo, minuto, hora, dayOfWeek, dayOfMonth, mês, ano; getDateDs1307 (&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); / * Apenas dispara o alarme se for um dia listado abaixo. Isso pode ser alterado alterando os números para qualquer um dos seguintes:1 =Domingo 2 =Segunda-feira 3 =Terça-feira 4 =Quarta-feira 5 =Quinta-feira 6 =Sexta-feira 7 =Sábado * / if (dayOfWeek ==2 || dayOfWeek ==3 | | dayOfWeek ==4 || dayOfWeek ==5 || dayOfWeek ==6) {// Dias PERMITIDOS para tocar o alarme se (hora ==18 &&minuto ==05) {// Definir hora aqui (em 24 horas Time) if (AlarmSet ==LOW) {// Se o pino de alarme estiver ativado Snooze =digitalRead (SnoozePin); enquanto (Snooze ==HIGH) {Snooze =digitalRead (SnoozePin); AlarmSequence (); }}}}} void loop () {runClock (); } 

Esquemas


Processo de manufatura

  1. Relógio de cuco
  2. Relógio de visão pov do Arduino
  3. DIY mais simples relógio IV9 Numitron com Arduino
  4. Simple Word Clock (Arduino)
  5. Relógio Arduino com horas de oração islâmica
  6. Arduino Spybot
  7. FlickMote
  8. TV B-Gone caseiro
  9. Arduino Temp. Monitor e relógio em tempo real com tela 3.2
  10. Despertador simples com DS1302 RTC