Еще могу предложить мой вариант прочтения программ от Чипа, если он не возражает.
В данном скетче объединены резистивные кнопки, автоматическая регулировка LED подсветки и добавлена реакция на включение заднего хода.
Отличия от первоисточников:
1. реакция на резистивные кнопки по факту нажатия а не отпускания т.е. практически мгновенно
2. Для регулировки яркости подсветки используется усредненное значение двух замеров при отсутствии дребезга и яркость сдвигается по единичке
3. При включении заднего хода яркость выставляется на максимум
4. Используются условные переходы, поэтому одновременно несколько действий не происходит и поэтому нет поводов для глюков
PHP код:
//AutoLight & Softresbutton & reverslight
//http://compcar.ru
#define PIN 5 //номер аналогового порта
#define LIMIT 10 //предел погрешности сопротивления
#define DELTA 5 //предел погрешности освещения
byte bytes[2];
int res_dt1, res_d;
int back_on = 12; //вход сигнал включения задней скорости
int ledPin = 9; //номер светодиодного порта
int light = 0;
int reallight = 0;
int oldlight = 0;
int sensVal_dt1 = 0;
int sensVal_d = 0;
void setup()
{
pinMode(back_on, INPUT);
digitalWrite(back_on, HIGH); //Подключить внутренний подтягивающий резистор
pinMode(ledPin, OUTPUT);
TCCR1B = TCCR1B & 0b11111000 | 1;
Serial.begin(115200); // настроить скорость com порта
}
void loop()
{
res_d = analogRead(PIN); // прочитать данные АЦП
delay(50);
res_dt1 = analogRead(PIN); // прочитать данные АЦП
if (res_dt1 > res_d-LIMIT && res_dt1 < res_d+LIMIT && res_dt1 < 900) // если сигнал резистивных кнопок не дребезжит и что-то нажато
{
bytes[0] = res_d & 255; // преобразовать в 2-байта
bytes[1] = (res_d & 768) >> 8;
Serial.write( bytes,2); // отправить прочитаное значение компьютеру
delay(700);
}
else if (digitalRead(back_on) == HIGH) //если нет сигнала резистивных кнопок надо проверить включен ли задний ход
{
delay(200);
light = 255; // ежели включен з.х.- сделать яркость на максимум (иначе нифига ночью не видно)
goto label;
}
else
{
sensVal_d = analogRead(0); // если нет з.х.- прочитать данные фоторезистора
delay(100);
sensVal_dt1 = analogRead(0); // опять прочитать данные фоторезистора
if(sensVal_dt1 > sensVal_d-DELTA && sensVal_dt1 < sensVal_d+DELTA ) // если разница между замерами незначительна
{
reallight = (sensVal_d + sensVal_dt1)/50 + 7; // присваиваем значению которое программа хотела бы отправить на светодиоды сумму этих замеров.
// можно дополнительно умножить или приплюсовать любое поправочное значение которое подойдет для настройки адекватной яркости
if(reallight == oldlight) //сравниваем желаемое для программы значение яркости со старым и если они не совпадают, то изменяем по единичке
{
light = oldlight;
}
else if(reallight > oldlight) //
{
light = ++oldlight;
}
else
{
light = --oldlight;
}
}
else
{
light = oldlight;
}
}
oldlight = light;
label:
constrain(light, 8, 255);
analogWrite(ledPin, light);
}