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 }