#include "Servo.h"
struct Ctlr {
const byte PinServo;
const byte PinBut;
int angNorm;
int angRev;
byte butState;
bool norm;
Servo servo;
};
const int N = 5;
Ctlr ctlr [N] = {
// Srv But norm rev
{ A0, 13, 40, 120 },
{ A1, 12, 45, 140 },
{ A2, 11, 120, 10 },
{ A3, 10, 90, 60 },
{ A4, 9, 20, 170 },
};
void setup() {
Serial.begin(115200);
Serial.println("rdy");
for (int n = 0; n < N; n++) {
pinMode (ctlr [n].PinBut, INPUT_PULLUP);
ctlr [n].butState = digitalRead (ctlr [n].PinBut);
ctlr [n].servo.attach (ctlr [n].PinServo);
ctlr [n].servo.write (ctlr [n].angNorm);
ctlr [n].norm = true;
}
}
void
tglServo (
int n )
{
if (ctlr [n].norm) {
ctlr [n].servo.write (ctlr [n].angRev);
ctlr [n].norm = false;
Serial.print("reverse ");
Serial.println (n);
}
else {
ctlr [n].servo.write (ctlr [n].angNorm);
ctlr [n].norm = true;
Serial.print("normal ");
Serial.println (n);
}
}
void chkButtons () {
for (int n = 0; n < N; n++) {
byte but = digitalRead(ctlr [n].PinBut);
if (ctlr [n].butState != but) { // state change
ctlr [n].butState = but;
if (LOW == but) { // pressed
tglServo (n);
}
}
}
delay (50); // deounce
}
void chkCmds() {
if (Serial.available()) {
char c = Serial.read ();
unsigned i = c - '0';
if (i < N)
tglServo (i);
}
}
void loop() {
chkButtons ();
chkCmds ();
}