Ajuda Arduino Lógica - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)2024-03-29T14:18:26Zhttps://labdegaragem.com/forum/topics/ajuda-arduino-l-gica?feed=yes&xn_auth=noboa noite Rodrigo.
Nov…tag:labdegaragem.com,2019-10-31:6223006:Comment:7216012019-10-31T01:40:25.480ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">boa noite Rodrigo.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Novamente peço desculpas pela demora, mas fiquei distante do site por alguns dias.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Estou publicando a correção para o <strong>problema</strong> "<strong>1"</strong> que vc relatou, quando no mesmo dia da semana haviam dois comandos, e apenas um deles funcionava.</span></p>
<p><span style="font-size: 12pt;"> Vou esclarecer…</span></p>
<p><span style="font-size: 12pt;">boa noite Rodrigo.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Novamente peço desculpas pela demora, mas fiquei distante do site por alguns dias.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Estou publicando a correção para o <strong>problema</strong> "<strong>1"</strong> que vc relatou, quando no mesmo dia da semana haviam dois comandos, e apenas um deles funcionava.</span></p>
<p><span style="font-size: 12pt;"> Vou esclarecer o porque deste problema. Ocorre que a lista de comandos é varrida, e se naquele dia da semana um comando é encontrado cuja faixa de horário bata com a hora atual, então é sinalizado que a Lâmpada deve ser ligada, e isto está correto. Porém se um outro comando no mesmo dia é encontrado logo depois daquele que "mandou" ligar a lâmpada, e este comando não bate com a hora atual, então para este comando a lâmpada seria desligada. Como este comando foi "encontrado" logo depois do que "mandou" ligar a Lâmpada, acaba que a Lâmpada não é ligada, pois o mecanismo se comportou como se o último comando tivesse prioridade, embora não seja este o caso (pois a Lâmpada deveria ser ligada, já que bateu o dia da semana e a hora atual está na faixa do comando).</span></p>
<p><span style="font-size: 12pt;"> Este comportamento não era esperado, mas ele ocorreu porque não digitei um único caracter na linha de código. Veja na figura a seguir <span>apontado pela seta "rosa", </span>onde mostro a Flag "ligar" que indica se a Lâmpada deve ou não ser ligada na versão anterior do código:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/3688457160?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/3688457160?profile=RESIZE_710x" class="align-center" width="955" height="597"/></a></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Note que ali está apenas assim: <span style="font-size: 14pt;"><strong>ligar = Ok1 && Ok2;</strong></span></span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Agora veja a correção mostrada na figura seguinte apontado pela seta "azul", no código corrigido:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/3688458066?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/3688458066?profile=RESIZE_710x" class="align-center" width="1050" height="656"/></a></span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Parece difícil de acreditar, mas a correção é esta mesma: apenas acrescentar o caracter "<strong>|</strong>" antes do caracter "<strong>=</strong>", ficando a linha assim: <span style="font-size: 14pt;"><strong>ligar |= Ok1 && Ok2;</strong></span></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Ocorre que com o "<strong>|=</strong>", fica um "registro" de que um comando anterior para aquele dia e naquele horário, detectou que a Lâmpada deve ser ligada, e portanto mesmo que outro comando seja encontrado dizendo o contrário, o que vale é o que o "registro" está indicando. Uma solução alternativa e também mais "adequada", seria finalizar o loop "for" (mas <strong><span style="text-decoration: underline;"><em>SEM USAR</em></span> o MALDITO "BREAK"</strong> que quase todo mundo insiste em usar e é uma prática muito ruim em programação!!!!!!), logo que é detectado que a Lâmpada deve ser ligada. Mas preferi apenas corrigir acrescentando o "<strong>|</strong>" que faltou, pois isto não muda praticamente nada na estrutura que já havia ali.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Veja que neste caso, foi apenas um esquecimento de digitação que causou o problema. Mas isto também serve para mostrar como o conhecimento e domínio da linguagem C/C++ são fundamentais se vc quer fazer algo "sério" e principalmente "robusto".</span></p>
<p></p>
<p><span style="font-size: 12pt;"> O código com a correção está neste link: <em><strong><a href="https://storage.ning.com/topology/rest/1.0/file/get/3688459571?profile=original" target="_blank" rel="noopener">Lampada_Aquario_03.zip</a></strong></em></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Na simulação via <em><strong>Proteus</strong></em>, apenas o arquivo "<em><strong>HEX</strong></em>" precisou ser atualizado, uma vez que nos circuitos nada mudou.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Sobre os demais pontos que vc quer implementar, preciso de mais detalhes. Irei te enviar um email informando o meu <em><strong>Skype</strong></em>, assim ficará mais fácil vc me descrever estes outros itens que vc deseja incluir. Já adianto que não tenho whatsapp (e nunca tive). Apenas <em><strong>Skype</strong></em> pois já usava no trabalho.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Boa noite Eucids! Rapaz, esto…tag:labdegaragem.com,2019-10-14:6223006:Comment:7200722019-10-14T22:22:14.666ZRodrigohttps://labdegaragem.com/profile/Rodrigo446
Boa noite Eucids! Rapaz, estou fascinado com seu código! Esqueci por duas vezes de mencionar aqui o quão fantástico é ajustar o RTC através do monitor serial do arduino (terminal). Depois que você me fez conhecer isso, o método antigo, aquele de descomentar/comentar as linhas dos ajustes, me pareceu gambiarra, kkkk.<br />
Agora, em relação à integrar mais atuadores e sensores ao projeto, é ótimo ouvir de você que é possível ter tudo isso em harmonia, pois já estava achando que é muita coisa pros…
Boa noite Eucids! Rapaz, estou fascinado com seu código! Esqueci por duas vezes de mencionar aqui o quão fantástico é ajustar o RTC através do monitor serial do arduino (terminal). Depois que você me fez conhecer isso, o método antigo, aquele de descomentar/comentar as linhas dos ajustes, me pareceu gambiarra, kkkk.<br />
Agora, em relação à integrar mais atuadores e sensores ao projeto, é ótimo ouvir de você que é possível ter tudo isso em harmonia, pois já estava achando que é muita coisa pros 16MHz do Uno.<br />
Como digo sempre, obrigado por tudo e espero pacientemente suas colaborações!<br />
<br />
Abraços! olá Rodrigo, boa tarde.
…tag:labdegaragem.com,2019-10-14:6223006:Comment:7200702019-10-14T21:07:54.827ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p></p>
<p><span style="font-size: 12pt;">olá Rodrigo, boa tarde.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Fiquei duas semanas distante do LDG, e por isso demorei a vir aqui responder.</span></p>
<p><span style="font-size: 12pt;"> Então abordando suas questões, uma de cada vez:</span></p>
<p></p>
<p><span style="font-size: 12pt;"> <em><strong>1)</strong></em> o comportamento que vc evidenciou, sobre a falha descrita no seu exemplo nos…</span></p>
<p></p>
<p><span style="font-size: 12pt;">olá Rodrigo, boa tarde.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Fiquei duas semanas distante do LDG, e por isso demorei a vir aqui responder.</span></p>
<p><span style="font-size: 12pt;"> Então abordando suas questões, uma de cada vez:</span></p>
<p></p>
<p><span style="font-size: 12pt;"> <em><strong>1)</strong></em> o comportamento que vc evidenciou, sobre a falha descrita no seu exemplo nos <em><strong>comandos</strong></em> "<em><strong>duplos</strong></em>" na segunda e quinta-feira, realmente há um erro no código. Já identifiquei e a correção é em apenas uma única linha do programa (acho que na correria, eu esqueci de digitar uma parte). Irei logo postar o código com a correção.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> <em><strong>2)</strong></em> sobre o acréscimos dos elementos que vc mencionou (LCD, MC-38, Termômetro, etc), é simples integrar isso ao código. Mas apesar de muito simples, é preciso saber como se faz isso, mantendo a <em><strong>Máquina de Estados</strong></em> funcionando corretamente (além do "<em><strong>Alive</strong></em>" que vc disse que deu zica nas suas "experiências"). Não se preocupe, irei te mostrar como fazer essas implementações, mas antes irei publicar a correção para o <em><strong>item</strong> <strong>1)</strong></em> acima (a correção para a falha com os comandos "duplos").</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Como eu disse, fique tranquilo, pois é possível fazer que todos os elementos funcionem em perfeita harmonia, mesmo que vc acrescente uma infinidade destes elementos.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Para este seu <em><strong>item</strong> <strong>2)</strong></em>, irei também te perguntar mais detalhes, para se obter o melhor resultado.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Olá Elcids, tudo bem? Então,…tag:labdegaragem.com,2019-10-07:6223006:Comment:7194942019-10-07T13:54:19.173ZRodrigohttps://labdegaragem.com/profile/Rodrigo446
<p>Olá Elcids, tudo bem? Então, na última semana consegui avanços em meu aprendizado.</p>
<p></p>
<p>Agora o <strong>Alive</strong> tá funcionando. Porém, quando fecho a porta e a <strong>fita LED</strong> acende (<strong>RELE2</strong>), o <strong>botão</strong> e o <strong>PIR</strong> não atuam, ficam inoperantes. A <strong>Lâmpada LED</strong> do aquário (<strong>RELE1</strong>), se estiver acessa, não apaga e se estiver apagada, não acende. O RTC também para de informar a hora segundo a…</p>
<p>Olá Elcids, tudo bem? Então, na última semana consegui avanços em meu aprendizado.</p>
<p></p>
<p>Agora o <strong>Alive</strong> tá funcionando. Porém, quando fecho a porta e a <strong>fita LED</strong> acende (<strong>RELE2</strong>), o <strong>botão</strong> e o <strong>PIR</strong> não atuam, ficam inoperantes. A <strong>Lâmpada LED</strong> do aquário (<strong>RELE1</strong>), se estiver acessa, não apaga e se estiver apagada, não acende. O RTC também para de informar a hora segundo a segundo no monitor Serial, mas não desajusta o relógio, só não informa. </p>
<p>Ao abrir a porta e apagar a <strong>Fita LED</strong> (<strong>RELE2</strong>), tudo volta ao normal, inclusive o monitor Serial informando hora a cada segundo.</p>
<p></p>
<p>Pretendo sanar pelo menos essa questão do interruptor magnético (fita LED) ativando o RELE2. Estava na expectativa de colocar o display LCD informando temperatura da água, mas em meus testes em outro arduino o sistema ficou extremamente lento quando adicionei o display LCD 1602 + sensor de temperatura + interruptor magnético ao seu código.</p>
<p></p>
<p>Tenha uma ótima semana!!!</p> Olá Elcids, tudo bem? Fiquei…tag:labdegaragem.com,2019-09-30:6223006:Comment:7193262019-09-30T14:05:57.406ZRodrigohttps://labdegaragem.com/profile/Rodrigo446
<p>Olá Elcids, tudo bem? Fiquei um tanto enrolado porque estou fazendo obra em casa. :/</p>
<p>Mas consegui testá-lo. Olha, o seu código é realmente incrível! O "<em>LED Alive</em>" além de extremamente funcional, dá um charme e elegância ao sistema! Agora, ao se interromper a energia do arduino ele volta acendendo perfeitamente, se ainda estiver no horário de acendimento automático. Maravilhoso!</p>
<p>Apenas uma coisa me inculcou: os horários de acendimento automático dos LEDs de iluminação…</p>
<p>Olá Elcids, tudo bem? Fiquei um tanto enrolado porque estou fazendo obra em casa. :/</p>
<p>Mas consegui testá-lo. Olha, o seu código é realmente incrível! O "<em>LED Alive</em>" além de extremamente funcional, dá um charme e elegância ao sistema! Agora, ao se interromper a energia do arduino ele volta acendendo perfeitamente, se ainda estiver no horário de acendimento automático. Maravilhoso!</p>
<p>Apenas uma coisa me inculcou: os horários de acendimento automático dos LEDs de iluminação não estão funcionando no horário de 4h30 às 7h30 nas segundas e quintas-feiras. O código permanece inalterado na versão 2. já revisei tudo e não entendo porque somente nessa faixa de horário ele não quer acender. A minha linha de comandos está assim:</p>
<p></p>
<p>LED_prog_type Vetor_Comandos [] = // Vetor de Comandos:<br/> {<br/> segunda, 4, 30, 7, 0, // liga o LED as segundas, entre 4:30 e 7:00 horas.<br/> segunda, 17, 0, 22, 0, // liga o LED as segundas, entre 17:00 e 22:00 horas.</p>
<p>terca, 17, 0, 22, 0, // liga o LED as terças, entre 17:00 e 22:00 horas.</p>
<p>quarta, 17, 0, 22, 0, // liga o LED as quartas, entre 17:00 e 22:00 horas.</p>
<p>quinta, 4, 30, 7, 0, // liga o LED as quintas, entre 4:30 e 7:00 horas.<br/> quinta, 17, 0, 22, 0, // liga o LED as quintas, entre 17:00 e 22:00 horas.</p>
<p>sexta, 17, 0, 22, 0, // liga o LED as sextas, entre 17:00 e 22:00 horas.</p>
<p>sabado, 8, 0, 22, 0, // liga o LED aos sabados, entre 8:00 e 22:00 horas.</p>
<p>domingo, 8, 0, 22, 0, // liga o LED aos domingos, entre 8:00 e 22:00 horas.<br/> };</p>
<p></p>
<p>Tem alguma coisa erra aí?</p>
<p></p>
<p>Bom, os Correios resolveram trabalhar e meu kit arduino chegou, finalmente! Nele eu tenho um interruptor magnético MC-38 para porta/janela, um termômetro à prova d'água e um display LCD 1602, dentro outras coisas. Gostaria de uma ajuda apenas para o sensor magnético mc38, já que os outros sensores/atuadores são para eu (sozinho) quebrar a cabeça mais pra frente.</p>
<p>Eu tenho uma porta de vidro, de correr, que fica atrás do aquario e fecha a minha sala quando estamos com ar condicionado ligado. Este ano, há cerca de 3 meses aconteceu um acidente comigo e essa porta. Eu levantei bem cedo e, ainda sonolento, dei de cara na porta, que é toda transparente, e a derrubei em cima do aquário e rack da sala. Voou peixe e água pra tudo quanto é lado! Cortei meus pés, quebrou meu receiver, mas a porta (vidro temperado) não quebrou! Uma verdadeira cena de terror! Diante disso, decidi adesivar algumas faixas vermelhas na porta e coloquei uma iluminação em fita led (+/- 2m) em um dos lados da parede em que ela fecha.</p>
<p>Já consegui um código que ao fechar a porta, acende a fita LED instalada próximo à ela. Ao fechar, a fita LED se apaga. A questão é que quando eu acrescento esse código ao seu, ele de cara acusa erro nas partes do LED Alive. Então comentei tudo do Alive, então, compilou. Mas, além de perder o Alive (não queria!), tá dando um pequeno conflito que toda vez ao ligar o arduino numa faixa de horário do acendimento automático, os LED do aquário não acendem se a fita LED estiver ligada. Então eu movimento a porta para apagar a fita LED, os LEDs do aquário acendem, e então, eu movimento a porta novamente para acender a fita LED. Daí pra frente fica funcionado normalmente. Posso apagar ou acender a fita LED que não interrompe os LEDs do aquário.</p>
<p>As modificações de hardware foram um relè duplo no lugar dos simples e o interrptor magnético. O código que tenho é de um <em>pushbutton</em> comum, mas adaptei e funcionou no sensor magnético:</p>
<p></p>
<p>// digital pin 2 has a interuptor magnético attached to it. Give it a name:<br/> const int pino_magnetico = 10;<br/> const int pino_RELE2 = 9;<br/> int estadoMagnetico = 0;</p>
<p></p>
<p>// the setup routine runs once when you press reset:<br/> void setup() {<br/> // initialize serial communication at 9600 bits per second:<br/> Serial.begin(9600);</p>
<p><br/> // definindo pino interruptor magnético como entrada:<br/> pinMode(pino_magnetico, INPUT_PULLUP);<br/> pinMode(pino_RELE2, OUTPUT);<br/> }</p>
<p>// the loop routine runs over and over again forever:<br/> void loop() {</p>
<p><br/> estadoMagnetico = digitalRead(pino_magnetico);</p>
<p></p>
<p>// check if the pushbutton is pressed. If it is, the buttonState is HIGH:<br/> if (estadoMagnetico == HIGH) {<br/> // turn LED on:<br/> digitalWrite(pino_RELE2, LOW);<br/> } else {<br/> // turn LED off:<br/> digitalWrite(pino_RELE2, HIGH);<br/> }</p>
<p><br/> // read the input pin:<br/> int estadoMagnetico = digitalRead(pino_magnetico);</p>
<p><br/> // print out the state of the button:<br/> Serial.println(estadoMagnetico);<br/> delay(1); // delay in between reads for stability<br/> }</p>
<p></p>
<p>Sei que o solicitado já foi atendido e você está correto em dizer que o sistema já foi concluído. Mas, se não for pedir muito, preciso pelo menos dessa parte da fita LED no sensor magnético porque, como disse, tenho medo que se repita esse acidente com mais alguém.</p>
<p></p>
<p>Tenha uma ótima semana e mais uma vez: obrigado por tudo!!!!</p> Olá Elcids!
Que ótimo que voc…tag:labdegaragem.com,2019-09-20:6223006:Comment:7183932019-09-20T11:12:22.363ZRodrigohttps://labdegaragem.com/profile/Rodrigo446
Olá Elcids!<br />
Que ótimo que você conseguiu!<br />
Ainda hoje quando estiver em casa estarei testando o código com as alterações recentes. Ao longo da semana já consigo dar um retorno sobre o seu funcionamento completo no meu sistema.<br />
Obrigado mais uma vez pelo empenho e dedicação!<br />
Tenha uma ótima sexta-feira!<br />
<br />
Abçs!
Olá Elcids!<br />
Que ótimo que você conseguiu!<br />
Ainda hoje quando estiver em casa estarei testando o código com as alterações recentes. Ao longo da semana já consigo dar um retorno sobre o seu funcionamento completo no meu sistema.<br />
Obrigado mais uma vez pelo empenho e dedicação!<br />
Tenha uma ótima sexta-feira!<br />
<br />
Abçs! .
Parte 1A - alterações confo…tag:labdegaragem.com,2019-09-20:6223006:Comment:7183872019-09-20T02:29:43.976ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">.</span></p>
<p><span style="font-size: 18pt;"><em><strong><span style="text-decoration: underline;">Parte 1A</span> - <span style="text-decoration: underline;">alterações conforme solicitado</span>:</strong></em></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Olá Rodrigo.</span></p>
<p><span style="font-size: 12pt;"> Conforme vc solicitou, alterei o Sistema para que não perdesse o status de controle da <em><strong>Lâmpada</strong></em> (ou…</span></p>
<p><span style="font-size: 12pt;">.</span></p>
<p><span style="font-size: 18pt;"><em><strong><span style="text-decoration: underline;">Parte 1A</span> - <span style="text-decoration: underline;">alterações conforme solicitado</span>:</strong></em></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Olá Rodrigo.</span></p>
<p><span style="font-size: 12pt;"> Conforme vc solicitou, alterei o Sistema para que não perdesse o status de controle da <em><strong>Lâmpada</strong></em> (ou <strong><em>LEDs</em></strong>) após ter ocorrido queda de energia, e para que o <em><strong>Botão</strong> </em>possa desligar a Lâmpada quando se estiver dentro de um horário para acendimento programado (através do <em><strong>Vetor de Comandos</strong></em>).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> <strong><span style="text-decoration: underline;"><em>Importante</em></span></strong>: sobre este apagamento via Botão dentro de um horário programado para acender a Lâmpada, observe que poderia ocorrer da pessoa que acionou o Botão esquecer que estava dentro do período de acendimento automático, e com este esquecimento deixar a Lâmpada apagada. </span><span style="font-size: 12pt;">Então para avisar que o Sistema está nesta condição (Lâmpada apagada via Botão dentro do horário para estar ligada), acrescentei um <em><strong>LED</strong> <strong>comum</strong></em>, que irá piscar duas vezes por segundo, avisando sobre a condição (a taxa de pisca do LED é facilmente alterada no código, como mostrado logo adiante no texto).</span></p>
<p><span style="font-size: 12pt;"> Aproveitando isso, resolvi também indicar os demais estados do Sistema, usando diferentes taxas de pisca do mesmo LED. Devido ao LED sempre piscar, mas a taxas diferentes, o nome que normalmente damos a ele é "<em><strong>LED Alive</strong></em>" (ou simplesmente "<em><strong>Alive</strong></em>", indicando que o Sistema está "vivo" e funcionando). Veja na figura a seguir como estão definidas as diferentes taxas de pisca para o "<em><strong>LED Alive</strong></em>":</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/3575543922?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/3575543922?profile=RESIZE_710x" class="align-center" width="856" height="373"/></a></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Observe que no código, são definidos os <em><strong>intervalos de pisca</strong></em> do LED, marcados em verde na figura anterior. Por exemplo para o <em><strong>estado</strong></em> "<em><strong>Desligado</strong></em>" onde o valor é 20, significa que o "<em><strong>LED Alive</strong></em>" irá piscar uma vez a cada 20 segundos. Cada piscada é bem rápida e demora apenas <em><strong>1/5 de segundo</strong></em> (ou <em><strong>0.2 segundos</strong></em>), independente do intervalo entre piscadas.</span></p>
<p><span style="font-size: 12pt;"> Quando a <strong>Lâmpada</strong> for ligada via <em><strong>Sensor PIR</strong></em> ou via <em><strong>Botão</strong></em>, mas fora do horário de acendimento programado, o "<em><strong>Alive</strong></em>" piscará a cada <em><strong>5 segundos</strong></em> (indicando que o Sistema está no <em><strong>estado</strong></em> "<em><strong>Tempo_ON</strong></em>". Já quando a Lâmpada for ligada automaticamente devido ao horário programado, o "<em><strong>Alive</strong></em>" irá piscar a cada <em><strong>2 segundos</strong></em>, e se neste intervalo o <em><strong>Botão</strong></em> for acionado para desligar a Lâmpada, o "<em><strong>Alive</strong></em>" piscará 2 vezes por segundo (ou a cada <em><strong>0.5 segundo</strong></em>, como definido no código).</span></p>
<p><span style="font-size: 12pt;"> Estes intervalos do "<em><strong>Alive</strong></em>", escolhi procurando usar o bom senso, de forma que identifique claramente cada estado sem confundir um com o outro, e que também chame a atenção que seja necessária quando a Lâmpada for apagada dentro do intervalo de acendimento programado.</span></p>
<p><span style="font-size: 12pt;"> Como vc pode ver, é muito simples alterar o intervalo, uma vez que ele é especificado em segundos. Então basta ajustar conforme desejado.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Mas caso não deseje usar o "<em><strong>Alive</strong></em>", então basta desabilitá-lo no código. Na figura a seguir, o "<em><strong>Alive</strong></em>" está habilitado, conforme marquei em amarelo na figura:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/3575573878?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/3575573878?profile=RESIZE_710x" class="align-center" width="754" height="513"/></a></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Observe que para desabilitar o "<em><strong>LED Alive</strong></em>", basta mudar para "<strong><em>0</em></strong>" no "<em><strong>#define habilita_Alive</strong></em>". Se o "<em><strong>Alive</strong></em>" for desabilitado neste ponto do código, nenhuma outra ação precisa se feita (nem é preciso excluir as chamadas às funções do "<em><strong>Alive</strong></em>"), e nem mesmo precisa se preocupar em comentar a linha onde o <em><strong>pino</strong></em> do "<em><strong>LED Alive</strong></em>" é definido (pois o código irá ignorar estas definições).</span></p>
<p><span style="font-size: 12pt;"> Mas caso use o "<em><strong>Alive</strong></em>", então veja na figura anterior, que vc deve definir em qual pino o "<em><strong>LED Alive</strong>" </em>está conectado (além do <em><strong>Nível Lógico</strong></em> que liga o LED). No código que estou publicando, usei o <em><strong>pino 5</strong></em> do <em><strong>Arduino</strong></em>, mas use e especifique conforme desejado.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Sobre o funcionamento do Sistema, para atender às novas características solicitadas, conforme informei em post anterior, tive que acrescentar um novo estado na <em><strong>Máquina de Estados</strong></em> que controla o Sistema. A este estado chamei de "<em><strong>Botão OFF</strong></em>", pois ele desliga a Lâmpada quando se estiver dentro do período de acendimento automático.</span></p>
<p><span style="font-size: 12pt;"> O novo <em><strong>Diagrama de Estados</strong></em> pode ser visto na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/3575640896?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/3575640896?profile=RESIZE_710x" width="714" height="842" class="align-center"/></a></span></p>
<p></p>
<p><span style="font-size: 12pt;"> O Diagrama ainda é simples, mas devido a quantidade de elementos de controle (<em><strong>PIR</strong></em>, <em><strong>Botão</strong></em>, e <em><strong>Temporizações automáticas</strong></em>, etc), fica realmente claro que este Sistema não é nada adequado para o aprendizado, e poderia afugentar ou desestimular as pessoas interessadas em aprender sobre a implementação de <em><strong>Máquinas de Estados</strong></em>. Assim a decisão tomada no post anterior faz sentido, quando vemos todo o Sistema funcionando, pois ele tem uma complexidade um pouco além daquela exigida para ser usado como exemplo para um aprendizado.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Também testei o Sistema em <em><strong>simulação</strong></em> no <em><strong>Proteus</strong></em>. O circuito usado é praticamente idêntico ao anterior, porém como dito, foi acrescentado o "<em><strong>LED Alive</strong></em>", que indica o "<em><strong>Status</strong></em>" que o Sistema se encontra, conforme mostrado na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/3575662887?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/3575662887?profile=RESIZE_710x" width="1137" height="692" class="align-center"/></a></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Observe na figura anterior, que no <em><strong>Terminal do Arduino</strong></em>, além das informações que já eram exibidas na primeira versão do código, também é informado que o "<em><strong>LED Alive</strong></em>" existe no Sistema.</span></p>
<p><span style="font-size: 12pt;"> Veja também que é exibido no Terminal, a <em><strong>hora atual</strong></em>, conforme vc solicitou. A exibição é feita a cada segundo (mas sem usar o "<em><strong>delay</strong></em>", <span style="text-decoration: underline;"><em>lembre-se disso, que já enfatizei no post anterior</em></span> <em>!!! </em>).</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Sobre a questão da <em><strong>queda da energia</strong></em>, isso foi resolvido com a alteração do <em><strong>Formato do Comando</strong></em>, que agora especifica a <em><strong>Hora que o LED deve ser ligado</strong></em> e a <em><strong>Hora que ele deve ser desligado</strong></em>. Pode-se ver no exemplo que está no código, onde deixei <em><strong>3 Comandos</strong></em> na <em><strong>Lista de Comandos</strong></em> (ou "<em><strong>Vetor de Comandos</strong></em>"), mostrado na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/3575685433?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/3575685433?profile=RESIZE_710x" class="align-center" width="827" height="405"/></a></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Observe na figura anterior, que marquei em <em><strong>amarelo</strong></em> e <em><strong>verde</strong> </em>a definição do horário no primeiro Comando na Lista, mostrando como é simples acrescentar um Comando. Como antes, vc pode acrescentar qualquer quantidade de Comandos que desejar, e novamente a ordem na Lista não interfere, uma vez que o próprio comando já tem o horário dizendo quando ele tem efeito.</span></p>
<p><span style="font-size: 12pt;"> Neste novo Formato, aumentou em 1 byte o tamanho de um Comando em relação à primeira versão. Assim cada Comando ocupa agora o espaço de <em><strong>5 bytes</strong></em> (ainda totalmente viável para a aplicação desejada).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Sobre o Sistema acredito que não há mais o que dizer, pois praticamente tudo já foi dito neste ou nos posts anteriores.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Mas há uma característica (ou "<em>feature</em>" se preferir), que conforme eu disse no post anterior, acredito que vc irá apreciar. É sobre o <em><strong>ajuste</strong></em> da <em><strong>Data/Hora</strong></em>, que agora vc pode fazer diretamente pelo <em><strong>Terminal do Arduino</strong></em> (ou qualquer outro Programa de Terminal que desejar, como por exemplo o "<em><strong>Termite</strong></em>").</span></p>
<p><span style="font-size: 12pt;"> O <em><strong>ajuste</strong></em> da <em><strong>Data/Hora</strong></em> pelo Terminal, pode ser feita a qualquer momento, independente de qual estado o Sistema esteja atualmente. Para isto, basta enviar um "<em><strong>Comando de Ajuste</strong></em>" através do Terminal. O comando é muito simples, e pode ser visto na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><span><a href="https://storage.ning.com/topology/rest/1.0/file/get/3575702526?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/3575702526?profile=RESIZE_710x" class="align-center" width="750" height="362"/></a></span></span></p>
<p></p>
<p><span style="font-size: 12pt;"><span> A figura é auto-explicativa (não esqueça de clicar no <em><strong>Botão</strong></em> "<strong><em>Enviar</em></strong>" do <em><strong>Terminal</strong></em>, o qual marquei na figura).</span></span></p>
<p><span style="font-size: 12pt;"> Sempre que vc ajustar a <em><strong>Data/Hora</strong></em> através do <em><strong>Comando</strong></em>, será exibido imediatamente no próprio Terminal, a nova <em><strong>Data/Hora</strong></em> lida do <em><strong>RTC</strong></em>, de forma que assim vc pode conferir se o ajuste foi feito conforme especificado pelo comando.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Esta <em>segunda versão</em> da implementação do <em><strong>Sistema para Controle da Lâmpada do Aquário</strong></em>, está no link a seguir:</span></p>
<p><span style="font-size: 12pt;"> <em><strong><a href="https://storage.ning.com/topology/rest/1.0/file/get/3575727495?profile=original" target="_blank" rel="noopener">Lampada_Aquario_02.zip</a></strong></em></span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Lembre-se: pode não parecer, mas a implementação ainda se mantém simples. Assim, se vc analisar o código com atenção (e sem pressa), irá aprender muito. E veja que no próprio código há comentários e explicações sobre cada parte dele (preste atenção a estas informações inseridas no código). E não pare de estudar a <em><strong>Linguagem C</strong></em>, pois isto é muito importante neste caminho de aprendizado.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Apesar <span>Rodrigo, </span>de <span>ainda</span> não ter seu retorno sobre esta segunda implementação, considero este Sistema concluído, principalmente porque todas as solicitações foram atendidas.</span></p>
<p><span style="font-size: 12pt;"> Entenda que a coisa toda aqui no site é <em>espontaneamente colaborativa</em>, e que também estou envolvido em outros tópicos aqui no <em><strong>LDG</strong> </em>que necessitam da minha atenção.</span></p>
<p><span style="font-size: 12pt;"> Veja</span> <span style="font-size: 12pt;">também que quaisquer alterações que vc faça no código, são inteiramente de sua responsabilidade.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Sobre o aprendizado de como funcionam e como implementar <em><strong>Máquinas de Estados</strong></em>, fique atento ao site, pois estarei iniciando isto em breve (logo depois que eu conseguir atender alguns tópicos que estão pendentes aqui no <em><strong>LDG</strong></em>).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Espero que fique satisfeito com as implementações, e que tenham ido além da sua expectativa, pois foi esta a intenção.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Olá Elcids! Entendi tudo perf…tag:labdegaragem.com,2019-09-18:6223006:Comment:7184852019-09-18T12:24:39.553ZRodrigohttps://labdegaragem.com/profile/Rodrigo446
Olá Elcids! Entendi tudo perfeitamente e acredito que vai ficar bom. Você está correto. Deixemos essa Máquina de Estados com 4 estados só para implementar meu Aquário e outra para aprendizado. Até porque quando chegarem meus outros componentes, como LCD, Bluetooth, etc ela irá fica bem mais complexa. Espero conseguir aprender para implementar tudo.<br />
<br />
Abçs!
Olá Elcids! Entendi tudo perfeitamente e acredito que vai ficar bom. Você está correto. Deixemos essa Máquina de Estados com 4 estados só para implementar meu Aquário e outra para aprendizado. Até porque quando chegarem meus outros componentes, como LCD, Bluetooth, etc ela irá fica bem mais complexa. Espero conseguir aprender para implementar tudo.<br />
<br />
Abçs! olá Rodrigo.
Revisei s…tag:labdegaragem.com,2019-09-18:6223006:Comment:7182912019-09-18T03:42:27.357ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">olá Rodrigo.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Revisei seu <em><strong>código original</strong></em>, para ver a funcionalidade que havia ali.</span></p>
<p><span style="font-size: 12pt;"> Sobre a questão do "print" do <em><strong>horário</strong></em> lido do <em><strong>RTC</strong></em> no <em><strong>Terminal do Arduino</strong></em>, vc estava fazendo como mostrado na figura a seguir:…</span></p>
<p><span style="font-size: 12pt;">olá Rodrigo.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Revisei seu <em><strong>código original</strong></em>, para ver a funcionalidade que havia ali.</span></p>
<p><span style="font-size: 12pt;"> Sobre a questão do "print" do <em><strong>horário</strong></em> lido do <em><strong>RTC</strong></em> no <em><strong>Terminal do Arduino</strong></em>, vc estava fazendo como mostrado na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/3561951673?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/3561951673?profile=RESIZE_710x" class="align-center" width="664" height="222"/></a></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Essencialmente era a impressão de uma "<em><strong>String</strong></em>" retornada pelo método "<em><strong>getTimeStr</strong></em>". E depois da impressão, vc usava um <em><strong>delay</strong></em> de <em><strong>1 segundo</strong></em>, para que a cada segundo tivesse uma atualização do horário. Ok, isto funcionava no seu código original, <span style="text-decoration: underline;"><em>mas não é</em></span> a forma adequada de fazer isso, ou seja: não se deve usar o "<em><strong>delay</strong></em>" para temporizar o Sistema. O "<em><strong>delay</strong></em>" deve ser usado em condições específicas, quando se sabe que ele não irá comprometer as demais temporizações do Sistema (que normalmente usam o "<em><strong>millis</strong></em>"). Se vc não tem certeza se o "<em><strong>delay</strong></em>" irá comprometer a temporização do Sistema, então <span style="text-decoration: underline;"><em>não use</em></span> o mesmo.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Atente para o seguinte: na primeira liberação do código eu não coloquei esta impressão do horário, simplesmente porque vc não disse que ela era necessária. E veja: mesmo que seu código estivesse fazendo a impressão do horário, da forma que ele estava ali sem um propósito claro, parecia ser apenas uma funcionalidade para debug/testes.</span></p>
<p></p>
<p><span style="font-size: 12pt;"><span> Mas agora que sei que vc necessita dessa "impressão" do horário no <em><strong>Terminal do Arduino</strong></em>, então acrescentei no Sistema uma função para imprimir o horário a cada segundo, mas da forma adequada, ou seja: sem comprometer as demais temporizações do Sistema.</span></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Sobre a questão da <em><strong>queda da energia</strong></em>, já alterei o <em><strong>formato do Comando</strong></em> (conforme propus no post anterior), e os comandos agora contém a <em><strong>hora de ligar</strong></em> e a <em><strong>hora de desligar</strong></em> a Lâmpada. Então não tem mais o problema de perder o estado da Lâmpada após a energia voltar.</span></p>
<p></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Mas há um pequeno problema: devido à questão do acionamento manual via Botão, foi preciso diferenciar no Sistema entre um acionamento <em><strong>fora do período de acendimento programado</strong></em> e um <span>acionamento</span> <em><strong>dentro do período de acendimento programado</strong></em>. Esta diferenciação se dá na <em><strong>Máquina de Estados</strong></em>, e para isto tive que acrescentar mais um estado.</span></p>
<p><span style="font-size: 12pt;"> A questão é que eu não considero adequado usar para <em><strong>aprendizado</strong></em> sobre <em><strong>Máquina de Estados</strong></em>, qualquer Máquina que tenha mais de 3 estados. O ideal para não comprometer o aprendizado, são 2 estados, e até 3 ainda vai. Mas 4 estados já passou da conta.</span></p>
<p><span style="font-size: 12pt;"> Então vamos usar este <em><strong>tópico do Aquário</strong></em> apenas para a implementação do Sistema, pois tendo a <strong>Máquina de Estados</strong> <em><strong>4 estados</strong></em>, s<span>e usarmos o tópico para aprendizado </span>não dará o resultado esperado. Eu sei o que estou dizendo, e não quero que isto afugente as pessoas interessadas em aprender (ou pior, desistam achando que a coisa é complicada, quando não é). Então não vamos arriscar pois é certo que irá causar dificuldades.</span></p>
<p><span style="font-size: 12pt;"> Como solução, então vamos fazer a implementação do <em><strong>Sistema do Aquário</strong></em>, e posteriormente usarei outro exemplo mais simples com uma <em><strong>Máquina de Estados</strong></em> com <em><strong>apenas 2 estados</strong></em> para que o aprendizado seja eficiente e se mantenha acessível a todos.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Aproveito também para informar que encontrei pequenas falhas que cometi na primeira implementação, e que talvez não sejam percebidas. Mas já tratei de corrigir estes pontos.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Ah, tem uma coisa que acho que vc irá apreciar muito: nesta "nova" implementação, vc pode alterar a <em><strong>Data/Hora</strong></em> a partir de comandos enviados ao <em><strong>UNO</strong></em> através do <em><strong>Terminal do Arduino</strong></em>. Ou seja, para ajustar a <em><strong>Data/Hora</strong></em> vc não precisa mais alterar e regravar o código no Arduino. E fique tranquilo, pois o comando é muito simples e fácil de usar (vou mostrar quando postar a implementação).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Olá Elcids! Verdade! De iníci…tag:labdegaragem.com,2019-09-16:6223006:Comment:7184422019-09-16T00:04:50.934ZRodrigohttps://labdegaragem.com/profile/Rodrigo446
<p>Olá Elcids! Verdade! De início eu pensava que nem o Botão, nem o Sensor PIR devessem atuar quando os LEDs estivessem ligados dentro do intervalo de <strong>acendimento automático. </strong>Mas ao rodar seu código, gostei da ideia de poder interromper o acendimento automático com o botão. Isso pode me ser útil. Mas o PIR não deve atuar mesmo. Durante o intervalo de <strong>acendimento automático, </strong>o botão pode apagar os LEDs. Mas se isso for muito complicado, posso ficar sem.</p>
<p>O…</p>
<p>Olá Elcids! Verdade! De início eu pensava que nem o Botão, nem o Sensor PIR devessem atuar quando os LEDs estivessem ligados dentro do intervalo de <strong>acendimento automático. </strong>Mas ao rodar seu código, gostei da ideia de poder interromper o acendimento automático com o botão. Isso pode me ser útil. Mas o PIR não deve atuar mesmo. Durante o intervalo de <strong>acendimento automático, </strong>o botão pode apagar os LEDs. Mas se isso for muito complicado, posso ficar sem.</p>
<p>O que realmente não dá é perder o intervalo de <strong>acendimento automático</strong> por desligamento do sistema. Imagine que eu quisesse, como estou fazendo agora, estudar outros códigos num momento em que o acendimento automático esteja atuando, por exemplo domingo às 20h40. Eu desligaria o Arduino do carregador DC 5V e o conectaria em meu notebook para desbravar a plaquinha. Ao terminar de brincar no IDE, ele não iria acender por conta do horário do <strong>acendimento automático</strong> não estar em intervalos. Até ficar tudo redondinho, farei muito isso. E enquanto não recebo outra placa, (malditos Correios!) preciso usá-lo para aprender. Isso realmente é muito chato porque poderia passar o dia inteiro apagado até que um novo horário de <strong>acendimento automático</strong> o fizesse acender. Ou seja, toda vez que eu quiser olhar ou alterar o código, perco o <strong>acendimento</strong> <strong>automático</strong> do momento.</p>
<p>Tem outra questão que percebi. Preciso que o horário seja ajustado com precisão de segundos (é, eu sei que tenho mania de precisão, kkk) No código antigo eu tinha o terminal atualizando a cada segundo o que fazia com que eu pudesse conferir com o relógio do Windows e, descontando o tempo de compilação, conseguia ajustar de maneira sincronizada com o relógio do Windows. Até coloquei no <em>Serial.print</em> o comando<em> RTC_time.sec</em> mas não ficou atualizando.</p>
<p>Um grande abraço!</p>