Hoje estou postando um vídeo novo, onde dei uma boa melhorada no código, onde implemento uma classe que facilita o uso desse tipo de solução.
vídeo anterior:
código atualizado:
class BotaoSerialAnalogico{ private: int _pino; int _quantidade; int* _ref_botao; public: BotaoSerialAnalogico(int pino, int quantidade, int resistores[], int resistor_gnd){ _ref_botao = new int[quantidade]; _pino = pino; _quantidade = quantidade; float r_eq = 0; for(int i=0;i<_quantidade;i++){ r_eq += resistores[i]; _ref_botao[i] = 1023 - ( r_eq*1023 / (resistor_gnd + r_eq) ); } int anterior; for(int i=0;i<_quantidade;i++){ int temp = _ref_botao[i]; _ref_botao[i] = (i==0 ? 1024 : ( anterior + temp ) / 2); anterior = temp; } } int get_button(){ int v = analogRead(_pino); if (v == 0) return -1; //nenhum botao pressionado int b = 0; for(int i=0;i<_quantidade;i++){ if (_ref_botao[i] > v) { b=i; } else { break; } } return b; } void print(){ Serial.print("|"); for(int i=0;i<_quantidade;i++){ Serial.print(_ref_botao[i]); Serial.print("|"); } Serial.print("analog="); Serial.print(analogRead(_pino)); Serial.print("|b="); Serial.println(get_button()); } }; BotaoSerialAnalogico *b; int RESISTORES[] = {0, 1500, 1500, 2700, 4700}; //resistores dos botões void setup() { Serial.begin(9600); b = new BotaoSerialAnalogico(A0, 5, RESISTORES, 1000); //1000-> 1K -> resistor ligado entre o gnd e o pino analógico } void loop() { int botao = b->get_button(); if (botao >= 0) { b->print(); delay(200); } if (botao == 0){} //programar botao 01 if (botao == 1){} //programar botao 02 if (botao == 2){} //programar botao 03 if (botao == 3){} //programar botao 04 if (botao == 4){} //programar botao 05 }
excelente seu post e muito obrigado. fiz os testes aqui e me ocorreu apenas um probleminha, as vezes o arduino lê valores de ate 40 mas geralmente menos de 5 no analog do seu codigo dai ele interpreta o b como sendo o ultimo botão. deve ser pela qualidade dos resistores sei la. Uma sugestão é que você colocasse uma porcentagem minima para o ultimo botão pra evitar este problema. Eu estou usando o codigo como acrescentando um botão a mais que na realidade não existe dessa maneira não tive problema mas seria legal se vc colocasse essa barragem no ultimo botão. Mas uma vez muito obrigado pelo post. vou colocar algumas linhas aqui do monitor serial. abraço
ResponderExcluir|1024|891|819|758|706|analog=0|b=-1
|1024|891|819|758|706|analog=0|b=-1
|1024|891|819|758|706|analog=3|b=4
|1024|891|819|758|706|analog=0|b=-1
|1024|891|819|758|706|analog=20|b=4
|1024|891|819|758|706|analog=0|b=4
|1024|891|819|758|706|analog=0|b=-1
|1024|891|819|758|706|analog=0|b=-1
|1024|891|819|758|706|analog=0|b=-1
|1024|891|819|758|706|analog=0|b=4
|1024|891|819|758|706|analog=11|b=4
|1024|891|819|758|706|analog=0|b=-1
|1024|891|819|758|706|analog=16|b=-1
|1024|891|819|758|706|analog=0|b=-1
|1024|891|819|758|706|analog=0|b=-1
|1024|891|819|758|706|analog=0|b=-1
|1024|891|819|758|706|analog=0|b=4
|1024|891|819|758|706|analog=0|b=-1
Boa noite .ótimo código e apresentação parabéns , teria como acrescentar mais um código, quando aperta botão , ele apagasse todos os leds e apertar o mesmo ele acender eles ?
ResponderExcluirWillian Darol, implementado uma porta lógica not no código, seria a solução, para sua pergunta.
ResponderExcluir