//引脚定义
#define BTN_PIN 3
#define SERVO_PIN 4
#define SENSOR_PIN A0
#define PM_PIN A1
#define LED_PIN 13
#include <OneButton.h>//按键消抖库
OneButton button1 = OneButton(BTN_PIN, true, true);
#include <Servo.h>//舵机库
int pos = 0;
Servo myservo;
int workmode;//定义一些变量
int lightval, pmval;
unsigned long myTime1 = 0;
void setup()
{
Serial.begin(9600);//设置通讯波特率
pinMode(BTN_PIN, INPUT_PULLUP);//初始化引脚
pinMode(SENSOR_PIN, INPUT);
pinMode(PM_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
myservo.attach(SERVO_PIN, 500, 2500); //修正脉冲宽度
myservo.write(pos);//开机初始化角度
button1.setDebounceTicks(50);//设置按键的消抖参数
button1.setClickTicks(500);
button1.attachClick(singleClick1);
Serial.println("setup done.");
}
void loop()
{
button1.tick();//检测按键
if (millis() - myTime1 >= 500)//500毫秒的无阻塞定时器
{
myTime1 = millis();
lightval = analogRead(SENSOR_PIN);//读取传感器数值
pmval = analogRead(PM_PIN);
Serial.print("WORKMODE:");//打印调试信息
Serial.print(workmode);
Serial.print("|");
Serial.print("LIGHT:");
Serial.print(lightval);
Serial.print("|");
Serial.print("PM:");
Serial.print(pmval);
Serial.print("|");
Serial.print("SERVO:");
Serial.print(pos);
Serial.println();
if (workmode) {//如果是自动模式
digitalWrite(LED_PIN, HIGH);
pos = map(lightval, 0, 1023, 0, 180);//映射数值到舵机角度
myservo.write(pos);
} else {//如果是手动模式
digitalWrite(LED_PIN, LOW);
pos = map(pmval, 0, 1023, 0, 180);
myservo.write(pos);
}
}
}
void singleClick1()//按键触发
{
workmode = !workmode;
Serial.print("WORKMODE CHANGE TO:");
Serial.println(workmode);
}