#include <Servo.h>
Servo servo1; // create servo object to control a servo
Servo servo2;
const int detpin = 0; // 检测状态指示的光电传感器
//int ledpin = 2;//指示灯
const int but_on = 3; //开按钮
const int but_off = 4; //关按钮
const int localon = 3;
const int localoff = 4;
//int but_chk = 3; //检测按钮
const int led = 7; //发射器状态指示灯
const int fbdelay = 3000; //反馈间隔
const int dicdelay = 5000;//断线检测时间
unsigned long timeflag1;//时间戳
unsigned long timeflag2;
unsigned long timeflag3;
unsigned long recedflag;
unsigned long sendedflag;
unsigned long blinkflag;
const int blinkdelay = 500;
bool runningflag1 = false;//运行中
bool conneted = false;//链接
bool sended = false; //刚发送完毕
bool reced = false;//
const int RUN = 0;
const int STOP = 1;
const int notsure = 2;
int state;
int nowstate;
const char on = 'o';
const char off = 'p';
const char runing = 'r';
const char stopping = 's';
const char ns='n';
const int ledonval = 750;//亮灯读数
const int ledoffval = 350;//灭灯读数
//char test = '';//测试代码
//int val;
const int push = 180;
const int pull = 0;
void setup() {
servo1.attach(5); // attaches the servo on pin 9 to the servo object
servo2.attach(6);
// initialize serial:
Serial.begin(9600);
pinMode(13, OUTPUT);
//Serial.println("1");
pinMode(led, OUTPUT);
pinMode(but_on, INPUT_PULLUP);
pinMode(but_off, INPUT_PULLUP);
pinMode(localon, INPUT_PULLUP);
pinMode(localoff, INPUT_PULLUP);
servo1.write(push);
servo2.write(pull);
}
void loop()
{
delay(200);
switcher();
feedback();
localcrtl();
//sender();
//feedbackled();
//Serial.println('r');
//delay(2000);
//Serial.println('s');
//delay(2000);
}
void sender() // 发射器
{
if (digitalRead(but_on) == LOW)
{
Serial.println(on);
sended = true;
sendedflag = millis();
delay(500);//连续发射,等待0.5秒
}
else if (digitalRead(but_off) == LOW)
{
Serial.println(off);
sendedflag = millis();
sended = true;
delay(500);
}
else
{
sended = false;
}
}
void feedback()
{
char fbchar;
if (analogRead(detpin) > ledonval)
{
fbchar = stopping;
digitalWrite(led, LOW);
state = STOP;
}
else if (analogRead(detpin) < ledoffval)
{
fbchar = runing;
digitalWrite(led, HIGH);
state = RUN;
}
else
{
fbchar =ns;
state = notsure;
ledblink();
}
/*if(nowstate!=state)
{
Serial.println(fbchar);
state=nowstate;
}*/
if ((millis() - timeflag1 >= (dicdelay - 3000)) || (reced && (millis() - recedflag >= fbdelay))) //定时反馈
{
timeflag1 = millis();//更新时间戳
reced = false;
//Serial.println('1');
Serial.println(fbchar);
delay(500);
}
}
void feedbackled()
{
if ((millis() - timeflag2 >= dicdelay) && (millis() - sendedflag >= fbdelay + 2000)) // 检测是是否超时未收到回复。
{
timeflag2 = millis();//更新时间戳
conneted = false;
}
if (Serial.available() > 0)
{
char ch_rec = Serial.read();
timeflag2 = millis();
if (ch_rec == runing)
{
digitalWrite(led, HIGH);
conneted = true;
}
if (ch_rec == stopping)
{
digitalWrite(led, LOW);
conneted = true;
}
}
if (conneted == false)
{
ledblink();
}
}
void switcher()
{
if (Serial.available() > 0)
{
recedflag = millis();
char ch = Serial.read();
if (ch == on)
{ servo1.write(pull);
delay(1000);
servo1.write(push);
reced = true;
}
if (ch == off)
{
servo2.write(push);
delay(1000);
servo2.write(pull);
reced = true;
}
// ch = '0';
// Serial.print(ch);
}
}
void ledblink()
{
if (millis() - blinkflag >= blinkdelay)
{ blinkflag = millis();
if (digitalRead (led) == LOW)
{
digitalWrite(led, HIGH);
}
else
{
digitalWrite(led, LOW);
}
}
}
void localcrtl()
{
if (digitalRead(localon) == LOW)
{
servo1.write(pull);
delay(1000);
servo1.write(push);
reced = true;
}
if (digitalRead(localoff) == LOW)
{
servo2.write(push);
delay(1000);
servo2.write(pull);
reced = true;
}
}
/*void Update()
{
if(analogRead(detpin)<>laststate)
Serial.println()
}
bool RTdelay()
{
return( millis()>=lastime);
}*/