bananenkeyboard/touchcontroller/src/main.cpp

112 lines
3.1 KiB
C++

#include "Arduino.h"
#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 1000 //below which value input counts as touched. 0<x<1024
#define COUNTEDLOWTHRESHOLD 10 //how many times input has to be sampled as low in a row to count as real touch.
#define COUNTEDLOWTHRESHOLD_OFF 0
// Inputdelay is given by: COUNTEDLOWTHRESHOLD*ADCREADINTERVAL
unsigned long last_adcmicros=0;
#define ADCREADINTERVAL 2000 //in microseconds. interval to read all adc values
boolean last_output[INPUTS];
unsigned long last_send=0;
#define MINIMUMSENDDELAY 10 //in milliseconds. minimum delay between serial sends
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
pinMode(A0, INPUT_PULLUP);
pinMode(A1, INPUT_PULLUP);
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);
/*
Serial.print(rawIn[0]);
Serial.print(", ");
Serial.print(rawIn[1]);
Serial.println();*/
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
if (countedLow[i]>0) {
countedLow[i]--; //decrease counter
}
}
}
//Serial.print("A0="); Serial.println(rawIn[0]);
}
for (uint8_t i=0;i<INPUTS;i++){ //for all keys
if (countedLow[i]>=COUNTEDLOWTHRESHOLD) { //key pressed/touched
last_output[i]=true;
}else if (countedLow[i]<=COUNTEDLOWTHRESHOLD_OFF) { //key pressed/touched
last_output[i]=false;
}
}
// ## Calculate Byte ##
byte newTouch=0;
for (uint8_t i=0;i<INPUTS;i++){ //for all keys
if (last_output[i]) { //key pressed/touched
newTouch^=1<<i;
}
}
digitalWrite(LED_BUILTIN, newTouch!=0); //Show touch on led
// ## 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); //Debug output
Serial.write(touchOut); //Send byte
}
}
}