83 lines
2.4 KiB
C++
83 lines
2.4 KiB
C++
|
|
#define INPUTS 8
|
|
byte touchOut=0; //binary encoded sensors
|
|
uint16_t rawIn[INPUTS];
|
|
|
|
uint16_t countedLow[INPUTS]; //count the times input was below threshold (touched)
|
|
#define TOUCHTHRESHOLD 300 //below which value input counts as touched
|
|
#define COUNTEDLOWTHRESHOLD 10 //how many times input has to be sampled as low in a row to count as real touch.
|
|
// Inputdelay is given by: COUNTEDLOWTHRESHOLD*ADCREADINTERVAL
|
|
|
|
unsigned long last_adcmicros=0;
|
|
#define ADCREADINTERVAL 2000 //in microseconds. interval to read all adc values
|
|
|
|
unsigned long last_send=0;
|
|
#define MINIMUMSENDDELAY 10 //in milliseconds. minimum delay between serial sends
|
|
|
|
void setup() {
|
|
pinMode(A0, INPUT_PULLUP);
|
|
pinMode(A1, INPUT);
|
|
pinMode(A2, INPUT_PULLUP);
|
|
pinMode(A3, INPUT_PULLUP);
|
|
pinMode(A4, INPUT_PULLUP);
|
|
pinMode(A5, INPUT_PULLUP);
|
|
pinMode(A6, INPUT_PULLUP);
|
|
pinMode(A7, INPUT_PULLUP);
|
|
Serial.begin(115200);
|
|
}
|
|
|
|
void loop() {
|
|
unsigned long loopmillis=millis();
|
|
|
|
// ## Sampling and Touch Filtering ##
|
|
if (micros()-last_adcmicros>=ADCREADINTERVAL)
|
|
{
|
|
last_adcmicros=micros();
|
|
//Sample all analog Inputs
|
|
rawIn[0]=analogRead(A0);
|
|
rawIn[1]=analogRead(A1);
|
|
rawIn[2]=analogRead(A2);
|
|
rawIn[3]=analogRead(A3);
|
|
rawIn[4]=analogRead(A4);
|
|
rawIn[5]=analogRead(A5);
|
|
rawIn[6]=analogRead(A6);
|
|
rawIn[7]=analogRead(A7);
|
|
//Serial.print(analogRead(A1));
|
|
//Serial.print(": ");
|
|
//Serial.println(micros()-mic);
|
|
|
|
for (uint8_t i=0;i<INPUTS;i++){ //for all inputs
|
|
if (rawIn[i]<=TOUCHTHRESHOLD) { //touch detected (input low at this sample)
|
|
countedLow[i]++; //increase counter
|
|
if (countedLow[i]>=COUNTEDLOWTHRESHOLD) { //upper limit
|
|
countedLow[i]=COUNTEDLOWTHRESHOLD; //upper limit. prevent overflow
|
|
}
|
|
}else{ //released or not pressed hard enough
|
|
countedLow[i]=0; //reset counter
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// ## Calculate Byte ##
|
|
byte newTouch=0;
|
|
for (uint8_t i=0;i<INPUTS;i++){ //for all keys
|
|
if (countedLow[i]>=COUNTEDLOWTHRESHOLD) { //key pressed/touched
|
|
newTouch^=1<<i;
|
|
}
|
|
}
|
|
|
|
// ## Send to Raspberry ##
|
|
if (loopmillis-last_send>MINIMUMSENDDELAY) //delay between last send long enough
|
|
{
|
|
if (newTouch!=touchOut) { //touched keys have changed
|
|
touchOut=newTouch; //update
|
|
last_send=loopmillis;
|
|
//Serial.println(touchOut, BIN);
|
|
Serial.write(touchOut); //Send byte
|
|
}
|
|
}
|
|
|
|
|
|
}
|