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
}