Open top menu
sábado, junho 01, 2013

No post de hoje vou apresentar a montagem da primeira parte de um hardware para automação e monitoramento de aquários, inicialmente será monitorado alguns parametros como temperatura e horários de controle da luminosidade, mas futuramente pretendo ler outros parametros e monitoração remota.






Funcionalidades
  • LCD para monitoramento local.
  • Teclado para acesso as funcionalidades.
  • Leitura de temperatura.
  • Relógio.
  • Timer pré-programado para iluminação.
  • Acionamento local de saídas (bomba, termostato, iluminação e saída auxiliar).
  • Acionamento local para iluminação RGB.
  • Preparação de caixa e conexões para evolução do projeto.

Funcionalidades previstas
  • Leitura de PH.
  • Monitoramento remoto.
  • Integração ao site www.aquadroid.com.br para registro de leitura de parametros diários.
  • Acesso as funcionalidades remotamente pelo site www.aquadroid.com.br.
  • Envio de SMS/Email com alertas de parametros pré-determinados.
  • Alimentador pré-programado.
  • Monitoramento por camera.


Lista de componentes primeira parte

1 - Arduino Mega.
1 - Aquadroid Shield (detalhes montagem abaixo).
1 - LCD 20x4.
1 - RTC Arduino Shield (Real Time Clock).
1 - KeyPad numérico 12 teclasx7 pinos.
1 - Buzzer.
1 - Sensor temperatura ds18b20.
2 - Metros de fita de led RGB.
1 - Resistor 4K7 1/8w.
1 - Fonte 12V x 3A industrial.

1 - Caixa plástica para o projeto.
4 - Tomadas fêmea para saidas (bomba, termostado, saida 1 e 2).
1 - Tomada macho para alimentação do sistema.
4 - Pares de conectores macho / fêmea DIM 5 pinos.
1 - Par de conectores macho / fêmea NBC.
1 - Chave liga/desliga.
1 - Porta fusível com fusível para painel.
1 - Rabicho para alimentação.

Parafusos e cabos para montagem do projeto.


Montagem do Aquadroid Shield




Funcionalidades do shield:
  • Regulador de tensão 9V.
  • Regulador de tensão 5V.
  • 4 Relé Shield.
  • Driver RGB.

Lista de Componentes:

4 - Relés 12V 15A 1 polo 2 posições.
4 - Transistores BC548 ou equivalente
3 - Transistores TIP120
1 - Regulador de tensão LM7809.
1 - Regulador de tensão LM7805.
4 - Leds 5mm.
4 - Diodos 1N4004.
8 - Resistores 1K 1/8W  (marrom preto vermelho).
3 - Resistores 220R 1/8W  (vermelho vermelho marrom).
7 - Bornes de encaixe TC 3 Vias.
4 - Bornes de encaixe TC 2 Vias.
1- Placa de fenolite cobreada face simples 10cm x 15cm.

Confecção da placa de circuito impresso

Layout impresso em papel sulfite na impressora laser, será usado o processo de transferência témica do tonner para a placa de circuito impresso.


Verificando alinhamento dos componentes com layout da placa.


Para facilitar a remoção do papel após a transferência, eu coloco uns 15 minutos dentro da agua.


Papel removido, agora é colocar no percloreto de ferro para corrosão.


Placa corroída, furando a placa.


Placa pronta para início da montagem.


Começo com os jumpers, resistores e diodos, acho mais fácil para alinhar virando a placa para soldagem.


Finalizando a montagem.


Realizando um teste após a montagem



Layout da placa


Download do arquivo aquadroid shield no formato ExpressPCB para confecção da placa no processo de transferência térmica.


Diagrama de conexões




Espelhos para caixa


Frente


Fundo



Versão para impressão

Arquivo para download ImpressaoCaixaAquadroid.jpg.


Fotos da montagem

Layout para corte da frente e fundo da caixa.


Fixando o layout na placa frontal da caixa para corte.


Cortando com a dremel.


Janelas para o LCD e Keypad cortados.


Frente e fundo cortados e montados, com espelhos impressos em papel autoadesivo com qualidade fotográfica.


Detalhe da fixação dos componentes.


Componentes para montagem.


Fonte, arduino e controladora alinhados dentro da caixa.


Perspectiva da montagem.


LCD conectado no flat cabe.


LCD conectando no arduino.


Keypad conectado no arduino


Buzzer com os terminais soldados.


RTC com os teminais soldados.




Conexões realizadas.


Efetuando primeiros testes.


Testes realizados com sucesso.


Placas, fonte e painel frontal conectados.


Iniciando a montagem do painel traseiro.


Ligações do painel traseiro.


Conector de alimentação para fonte chaveada.


Ligações para os conectores de luz RGB e sensor de temperatura.


Ligações do painel traseiro finalizadas.


Vista superior


Vista Frontal


Montando conector do sensor de temperatura.


Conectando resistor 4K7 entre pinos V+ (vermelho) e sinal(amarelo) do sensor de temperatura.


 Resistor com termoretrátil.

Resistor soldado entre o V+ e sinal do sensor de temperatura.





Código fonte
/*
Controlado Aquadroid
Sergio de Miranda e Castro Mokshin
29/05/2013

*/

//Bibliotecas utilizadas
#include
#include
#include
#include
#include //Biblioteca adicionada manualmente na pasta arduino-1.0.4\libraries
#include
#include
#include


#define BUFSIZ 100

//Constantes de Entrada
#define PIN_BLUE 7
#define PIN_RED 8
#define PIN_GREEN 9

#define PIN_SAIDA_TERMO 31
#define PIN_SAIDA_BOMBA 33
#define PIN_SAIDA_LUZ 35
#define PIN_SAIDA_AUX1 37

#define PIN_SAIDA_BUZZ 41

#define PIN_ENTRADA_NIVEL_B 39
#define PIN_ENTRADA_NIVEL_A 41

#define PIN_ENTRADA_TEMP 6


//Constantes para configuração do RTC
#define HORAS 2
#define MINUTOS 1
#define SEGUNDOS 0
#define DIASEMANA 3
#define DIAMES 4
#define MES 5
#define ANO 6

OneWire ds(PIN_ENTRADA_TEMP);

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


//KeyPad
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'#','0','*'}
};

//123 colunas
//4567 linhas


byte colPins[COLS] = {30, 32, 34};
byte rowPins[ROWS] = {22, 24, 26, 28};


Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );



char clientline[BUFSIZ];
char comando[BUFSIZ];
char comando_teclado[BUFSIZ];
int index;
int tamanhocomando;

boolean inicioComando1;
boolean inicioComando2;
boolean inicioFuncaoTeclado;
boolean inicioComandoTeclado;
boolean fimComando;
boolean recebendoComandoWeb;
int indiceentrada;

int HoraConfirmada;
int QtdHoraConfirmada;

int Segundo;

boolean modoAutomatico;

void setup() {

Wire.begin(); // join i2c bus
Serial.begin(9600); //

// ds1307setup();

wdt_enable(WDTO_8S);


HoraConfirmada = 0;
QtdHoraConfirmada = 0;

pinMode(PIN_ENTRADA_NIVEL_B, INPUT);
pinMode(PIN_ENTRADA_NIVEL_A, INPUT);
pinMode(PIN_SAIDA_BOMBA, OUTPUT);
pinMode(PIN_SAIDA_TERMO, OUTPUT);
pinMode(PIN_SAIDA_AUX1, OUTPUT);
pinMode(PIN_SAIDA_LUZ, OUTPUT);
pinMode(PIN_SAIDA_BUZZ, OUTPUT);
digitalWrite(PIN_SAIDA_BOMBA, LOW);
digitalWrite(PIN_SAIDA_TERMO, LOW);
digitalWrite(PIN_SAIDA_AUX1, LOW);
digitalWrite(PIN_SAIDA_LUZ, LOW);
digitalWrite(PIN_SAIDA_BUZZ, LOW);

inicioComando1 = false;
inicioFuncaoTeclado = false;
inicioComandoTeclado = false;
inicioComando2 = false;
fimComando = false;
recebendoComandoWeb = false;
indiceentrada = 0;

modoAutomatico = true;

Segundo = 0;

delay(500);
lcd.begin(20, 4);
lcd.print("Aquadroid ");
lcd.setCursor(0, 1);
lcd.print("Iniciando Sistema ");
lcd.setCursor(0, 2);
lcd.print(" ");
delay(2000);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(" ");
BuzzerConfirma();
}


void loop()
{
wdt_reset();
AguardaComandosTeclado();
ModoAutomatico();
if(Segundo == 0 )
{
LeituraTemperatura();
}
PrintData();
}


void LeituraTemperatura(){

byte i;
byte present = 0;
byte data[12];
byte addr[8];
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
if ( !ds.search(addr)) {
ds.reset_search();
}
ds.reset();
ds.select(addr);

ds.write(0x44,1);
delay(800);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}

LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000;
if (SignBit)
{
TReading = (TReading ^ 0xffff) + 1;
}
Tc_100 = (6 * TReading) + TReading / 4;

Whole = Tc_100 / 100;
Fract = Tc_100 % 100;

if (SignBit)
{
Serial.print("-");
}
Serial.print(Whole);
Serial.print(".");
if (Fract < 10)
{
Serial.print("0");
}
Serial.print(Fract);

Serial.print("\n");

lcd.setCursor(15, 0);
lcd.print(Whole);
lcd.print(".");
lcd.print(Fract);


}

int ConfirmaTrocaHora(int hora)
{

if(HoraConfirmada == hora)
{
QtdHoraConfirmada = 0;
return hora;
}
else
{
QtdHoraConfirmada++;
}

if(QtdHoraConfirmada>=4)
{
HoraConfirmada = hora;
}

return HoraConfirmada;
}

void ModoAutomatico(){

lcd.setCursor(13, 0);
if (modoAutomatico == true){

digitalWrite(PIN_SAIDA_BOMBA, HIGH);
digitalWrite(PIN_SAIDA_TERMO, HIGH);

lcd.print("A");
int rtc[7];
ds1307get(rtc,true);

int hora = ConfirmaTrocaHora(rtc[HORAS]);

if (hora >= 7 && hora < 19){
digitalWrite(PIN_SAIDA_LUZ, HIGH);
analogWrite(PIN_RED, 0);
analogWrite(PIN_GREEN, 0);
analogWrite(PIN_BLUE, 0);
}
else if (hora >= 19 && hora < 20){
digitalWrite(PIN_SAIDA_LUZ, LOW);
analogWrite(PIN_RED, 255);
analogWrite(PIN_GREEN, 255);
analogWrite(PIN_BLUE, 255);
}
else if (hora >= 20 && hora < 21){
digitalWrite(PIN_SAIDA_LUZ, LOW);
analogWrite(PIN_RED, 0);
analogWrite(PIN_GREEN, 0);
analogWrite(PIN_BLUE, 255);
}
else if (hora >= 21 && hora < 22){
digitalWrite(PIN_SAIDA_LUZ, LOW);
analogWrite(PIN_RED, 0);
analogWrite(PIN_GREEN, 0);
analogWrite(PIN_BLUE, 50);
}
else if (hora >= 22){
digitalWrite(PIN_SAIDA_LUZ, LOW);
analogWrite(PIN_RED, 0);
analogWrite(PIN_GREEN, 0);
analogWrite(PIN_BLUE, 0);
}
}
else{
lcd.print("M");
}
}

void AguardaComandosTeclado()
{
char key = keypad.getKey();
if (key != NO_KEY){
BuzzerClica();
lcd.setCursor(0, 1);
lcd.print("Selecione uma funcao");
lcd.setCursor(0, 2);

Serial.print("KEY: ");
Serial.println(key);

if( inicioComandoTeclado == true )
{
Serial.println("Executado comando");

if(key == '#')
{
BuzzerCancela();
ComandoCancelado();
Serial.println("Comando Cancelado");
}
else if (key == '*')
{
index++;
clientline[index] = 'F';
// clientline[index] = 0;
Serial.println(clientline);
DisparaComando();
ComandoExecutado();
Serial.println("Comando Executado");
Serial.println(clientline);
BuzzerConfirma();
}
else
{
index++;
clientline[index] = key;
Serial.print("Armazenando buffer: ");
Serial.println(key);
Serial.println(clientline);

}

}
else
{
inicioComandoTeclado = true;
index = 0;
tamanhocomando = 0;
memset( &clientline, 0, BUFSIZ ); //clear inString memory

Serial.println("Executado menu");
inicioFuncaoTeclado = true;
switch (key) {
case '1':
clientline[index] = 'I';
index++;
clientline[index] = 'L';
index++;
clientline[index] = 'R';
lcd.print("Luz Vermelha 0..250 ");
break;
case '2':
clientline[index] = 'I';
index++;
clientline[index] = 'L';
index++;
clientline[index] = 'G';
lcd.print("Luz Verde 0..250 ");
break;
case '3':
clientline[index] = 'I';
index++;
clientline[index] = 'L';
index++;
clientline[index] = 'B';
lcd.print("Luz Azul 0..250 ");
break;
case '4':
clientline[index] = 'I';
index++;
clientline[index] = 'S';
index++;
clientline[index] = '4';
lcd.print("Bomba 1:ON = 0:OFF ");
break;
case '5':
clientline[index] = 'I';
index++;
clientline[index] = 'S';
index++;
clientline[index] = '3';
lcd.print("Termo 1:ON = 0:OFF ");
break;
case '6':
clientline[index] = 'I';
index++;
clientline[index] = 'S';
index++;
clientline[index] = '2';
lcd.print("LUZ 1:ON = 0:OFF ");
break;
case '7':
clientline[index] = 'I';
index++;
clientline[index] = 'S';
index++;
clientline[index] = '1';
lcd.print("Saida 1 1:ON = 0:OFF ");
break;
case '8':
clientline[index] = 'I';
index++;
clientline[index] = 'M';
index++;
clientline[index] = 'A';
lcd.print("Auto 1:ON = 0:OFF ");
Serial3.print("C\r");
break;
case '9':
lcd.print("Nao programado ");
break;
case '#':
ComandoCancelado();
break;
case '*':
ComandoCancelado();
break;
}
}
}
}

void ComandoCancelado()
{
lcd.setCursor(0, 1);
lcd.print("Comando cancelado ");

lcd.setCursor(0, 2);
lcd.print(" ");

lcd.setCursor(0, 2);
lcd.print(" ");
inicioFuncaoTeclado = false;
inicioComandoTeclado = false;

}


void ComandoExecutado()
{
lcd.setCursor(0, 1);
lcd.print("Comando executado ");

lcd.setCursor(0, 2);
lcd.print(" ");

lcd.setCursor(0, 2);
lcd.print(" ");
inicioFuncaoTeclado = false;
inicioComandoTeclado = false;

}

void DisparaComando()
{
boolean iniciocomando = false;
for (int i = 0; i









Observações:




  1. Manter o arquivo ds1307.ino na pasta com o arquivo principal do programa, ele contém uma biblioteca com funções do RTC. Download do código fonte.

  2. Procedimento para ajuste do horário: Deve ser descomentado do método setup() a chamada //ds1307setup(), definir o horário nas variáveis do método void ds1307setup(void) no arquivo ds1307.ino, compilar, gravar no Arduino, comentar, compilar e gravar novamento no Arduino.

  3. Na minha versão utilizada da IDE do arduino não veio com a library Keypad, a mesma foi adicionada manualmente em libraries dentro da pasta da IDE do arduino (reiniciar IDE). Download Libraries.

  4. É necessário um delay de pelo menos 750ms para envio e retorno pela conexão wire do sensor de temperatura, nessa versão a temperatura é atualizada a cada 60 segundos, exatamente no segundo 0.

  5. Nesse projeto tive alguns problemas com o LCD, após alguns minutos ele simplesmente travava, mostrando uns caracteres estranhos, errados. Pesquisando na internet encontrei uma correção na librarie \libraries\liquidcrystal arquivo LiquidCrystal.h: deve alterar uint8_t _rw_pin para int8_t _rw_pin.

  6. Está funcionando, mas falta refatorar alguns trechos do código (vários), fica para depois.....


Funcionamento do menu de opções









Sequência de comandos para acionamento do menu de opções:



Acender luz vermelha

1 -> [0..250] para intensidade da luz -> # para confirmar o comando.



Acender luz verde

2 -> [0..250] para intensidade da luz -> # para confirmar o comando.




Acender luz azul

3 -> [0..250] para intensidade da luz -> # para confirmar o comando.




Acionar bomba

4 -> [0 Desli ou 1 Lig] -> # para confirmar o comando.




Acionar termostato

5 -> [0 Desli ou 1 Lig] -> # para confirmar o comando.




Acionar luz fluorescente (saida auxiliar 2)

6 -> [0 Desli ou 1 Lig] -> # para confirmar o comando.




Acionar saida auxiliar 1

7 -> [0 Desli ou 1 Lig] -> # para confirmar o comando.




Acionar modo automático / manual

8 -> [0 Manual ou 1 Automatico] -> # para confirmar o comando.



9-> não usado.



* -> cancela o comando.



#-> confirma o comando.



Mudar para o modo manual antes de usar as funções de 1 a 6, o modo automático trava o funcionamento das saídas de acordo com a programação do método void ModoAutomatico().

Tagged
Different Themes
Written by Lovely

Aenean quis feugiat elit. Quisque ultricies sollicitudin ante ut venenatis. Nulla dapibus placerat faucibus. Aenean quis leo non neque ultrices scelerisque. Nullam nec vulputate velit. Etiam fermentum turpis at magna tristique interdum.

20 comentários:

  1. Sérgio, parabéns pela iniciativa de compartilhar esse conhecimento. O projeto e o objetivo são muito bons.

    ResponderExcluir
    Respostas
    1. Obrigado Clézio, o projeto não está finalizado, mas tem ajudado muito no me aquário com o monitoramento e temporizador da iluminação.

      Excluir
  2. Sergio,

    Parabens, ficou muito bom.
    Eu tb tava com uma ideia de fazer uma intervenção com Arduino no meu aquario (q eu to terminando de montar). Pensei em algo bem mais simples do q isso. Sou programador, então a parte do código fonte é a parte mais fácil pra mim, o meu problema é com a eletronica. Vou tentar me inspirar nesse teu projeto pra fazer o meu. Vou tentar fazer mais simples, com protoboard mesmo. Pensei em:
    1. Medir temperatura
    2. medir PH, Amonia, nível da agua, e oq der mais pra medir
    3. LCD pra mostrar isso tudo
    4. fazer uma integração com Android, como os lembretes de TPA por exemplo, e alguns alertas

    Seilá, alguma coisa assim. Se eu tiver alguma dúvida técnica, posso postar aqui?

    abração, e parabens

    ResponderExcluir
    Respostas
    1. Fala Frank, Obrigado!

      Dependendo da sua necessidade, a automação de aquários não exige muita complexidade e o retorno é vantajoso, atualmente tenho 2 aquários automatizados e monitorados 24x7, quando viajo 1, 2 dias, nem me preocupo com por exemplo com a iluminação, ela é trocada automaticamente, entre outras funções.

      Atualmente estou investido meu tempo em outros projetos, parei com o projeto do aquário, mas conclui algumas etapas do hardware e criei a primeira versão do gerenciador de aquários http://www.aquadroid.com.br.
      Quanto as suas perguntas:
      1- Muito fácil, já tem um exemplo no próprio post.
      2- Nível de água é mais simples, sensores para níveis de água são baratos, para outros, precisa de sensores mais específicos e caros. O de PH comprei na sparkfun, mas não cheguei a finalizar o monitoramento com ele, a temperatura estava influenciando na medição e acabei não investindo mais tempo nele.
      3-O Arduino tem uma bliblioteca para LCD muito simples e fácil de usar, não terá dificuldade, se olhar no meu outro post de RFID tem outro exemplo, você poderá usar um LCD com touch ao invés de teclado para ações.
      4- Uma opção para primeira etapa é desenvolver uma api REST na sua aplicação para o controlador se comunicar, e construa toda a sua lógica nela, o projeto de RFID foi desenvolvido com esse conceito.


      Precisando de algo pode postar.
      Abs

      Excluir
  3. Sérgio,

    Sabe onde posso encontrar uma caixa dessa para montar uma para meu aquário?

    ResponderExcluir
    Respostas
    1. Clézio, Eu comprei em SP, na loja multicomercial que fica na Timbiras.

      Excluir
  4. Sergio muito bom, esse projeto estava a procura de um assim. No meu caso seria para uso em um terrário com plantas. Gostaria de utilizar para controle da temperatura/umidade, luzes e acionamento de nebulização. Você teria alguma ideia que pudesse me ajudar? Obrigado

    ResponderExcluir
    Respostas
    1. Fala Leonardo, Blz!
      A adaptação para uso em um terrário não será difícil, para temperatura e luzes já está implementada, para Umidade, voce pode usar um sensor DHT11, e de acordo com a faixa, vc aciona o nebulizador. De uma olhada em um post meu de teste do ReleShield, que aciono o relé de acordo com a Luminosidade.

      Excluir
  5. Sergio, parabéns pelo projeto, muito bom.
    Estou montando um aquário e tenho um Arduino Uno, gostaria de fazer o controle de temperatura, PH e ligar e desligar a luminária em determinado horário.

    Quais os componentes básicos que você indica?

    ResponderExcluir
    Respostas
    1. Obrigado Thiago,
      Temperatura e timer de luminosidade não terá problemas, mas PH é um pouco mais complicado, estou realizando uns testes com um sensor que importei, mas estou tendo uns problemas de calibração. Voce pode começar com um Arduino Uno, mas ele é limitado qto as IOs, dessa forma, inicialmente poderia montar um projeto com UNO, LCD, TEMP e RELE Shield para iluminação no modo automático, não seria possível colocar um teclado. Voce precisa adequar o programa acima com essas funcionalidades no UNO.

      Excluir
  6. boa tarde qual modelo do arduino indica adquiri pois pretendendo adicionar sonda de ph orp e temp

    ResponderExcluir
    Respostas
    1. Francisco, Boa Tarde!
      O ideial é adquirir um Arduino Mega, como ele tem mais IOs, você pode controlar e monitorar mais parâmetros.

      Excluir
  7. Boa tarde, estou tentando criar um controlador de aquário utilizando o Arduíno, porem tive um problema para controlar a iluminação.
    O problema é o seguinte, quando simulo o acender e apagar sem a iluminação conectada consigo deixar rodando sem problemas, mas quando conecto a iluminação parece que ao acender ou apagar algum tipo de ruido faz com que o Arduíno trave.
    Utilizo um modulo rele para o acionamento e a iluminação é de lampadas T8.
    Você teve algum problema parecido? Saberia dizer como solucionar esse problema?
    Obrigado.

    ResponderExcluir
    Respostas
    1. Maxwell, Boa Noite!

      Eu uso lâmpadas T8 em 2 aquários e nunca tive problemas.

      É muito difícil, mas é possível você ter problemas de interferência quando a fiação da lâmpada / reator fica próxima da alimentação / IOs do arduíno. É o caso? Geralmente está mais para ser um problema na fiação do seu circuito. Nos seus testes os cabos estão bem afastados e não são muito longos? Tente usar um cabo com malha para evitar a interferência.

      Ao invés de ligar a T8, tente ligar uma lâmpada incandescente e veja se o mesmo problema ocorre.

      Excluir
    2. Teria como me passar um email seu? Ai mando uma foto do sistema para você ter uma idéia. Acredito que possa ser esse tipo de interferencia sim.

      Excluir
  8. Parabéns pelo projeto, vou automatizar meu aquário e estou pensando em reproduzir seu projeto. Você já colocou o medidor de ph?

    ResponderExcluir
    Respostas
    1. Vinicius,
      Eu comprei o sensor de PH da sparkfun, calibrei, mais tive alguns problemas de leitura no aquário, acabei focando em outras projetos e deixei um pouco de lado, mas pretendo brevemente resolver esse problema.

      Excluir
  9. ótimo projeto, muito bem explicado, realmente atento aos detalhes está de parabéns, irei implementá-lo para o aquário marinho do meu irmão. No entanto, gostaria de saber se consigo faze-lo com um arduino uno ou duemilenove, você acha possível?

    Parabéns e continue neste caminho, todos agradecem!

    ResponderExcluir
    Respostas
    1. Boa Noite!
      Não é possível devido a quantidade de portas disponíveis nessas versões. Com o uno, voce conseguiria, automatizar uma luz, realizar leituras, mas um projeto com teclado, lcd, comandos de entrada e saida não.

      Abs

      Excluir