O primeiro passo foi gravar no microcontrolador o bootloader do Arduino, juntamente com o exemplo Blink, com o auxílio de um UsbTinyISP:
- Carreguei a aplicação Blink em um Arduino Uno.
- Retirei o ATmega do Uno e usei o UsbTiny para ler a sua memória Flash e salvar em um arquivo no PC.
- Liguei ao UsbTiny um ATmega novo, gravei a Flash lida e programei os fuses com os valores usados no Arduino.
O teste seguinte foi exercitar todos os LEDs, o buzzer e o botão. Exceto pelos LEDs ligados ao 74HC595 e ao botão, bastou copiar a sequência usada no Blink, alterando o pino utilizado (observando a correspondência entre os pinos do ATmega e a numeração usada nas bibliotecas do Arduino e lembrando que os pinos A0 a A5 podem ser usados como pinos digitais 14 a 14).
O uso do 74HC595 é simplificado pela existência da função ShiftOut no Arduino:
// Acende/Apaga os LEDs da barra conforme um valor void barraLeds (int val) { shiftOut (shiftData, shiftClk, MSBFIRST, val & 0xFF); digitalWrite (shiftReg, HIGH); digitalWrite (shiftReg, LOW); digitalWrite (ledBar8, (val & 0x100) ? HIGH : LOW); digitalWrite (ledBar9, (val & 0x200) ? HIGH : LOW); }O botão também não requer grandes códigos:
// Iniciação em setup() pinMode (botaoReset, INPUT); digitalWrite (botaoReset, HIGH); // Testa se botão apertado if (digitalRead (botaoReset) == LOW) { // botão está apertado }
O resultado final esta nos arquivos do blog, em PC1.zip.
É chegado o momento de fazer a aplicação propriamente dita. O código não é muito sofisticado. Usa e abusa do random (por enquanto sem iniciar a semente para permitir repetir o comportamento durante os testes):
- Ao ligar, aciona em ordem sequência os LEDs de "alimentação". O LED da "refrigeração" é aceso na cor verde.
- Os LEDs de "processamento" e "ocupado" são piscados continuamente de forma aleatória.
- O LED de "heartbeat" varia continuamente de intensidade (aproveitei aqui o código do exemplo ArduinoISP)
- Os LEDs de "temperatura" são acesos progressivamente até a metade da barra e depois oscilam ligeiramente.
- O painel fica neste comportamento "normal" até ocorrer (aleatoriamente) uma falha. Isto é sinalizado acendendo o botão de "falha" e mudando o LED de "refrigeração" para vermelho.
- A partir daí a "temperatura" vai subindo. Atingido um certo nível, o LED "perigo" é aceso.
- Ao atingir a "temperatura" máxima, o LED "pânico" acende e o buzzer é acionado.
- O painel permanece assim até que o botão de "reset" seja apertado, voltando ao comportamento "normal".
Nenhum comentário:
Postar um comentário