#define BLINKER_WIFI
#include <Blinker.h>
#include <Servo.h>
Servo myServo; //舵机
char auth[] = "d0cdb48b50fc";
char ssid[] = "Arduino_Wifi";
char pswd[] = "12345678";
#define LIN1 15//pwm
#define LIN2 14
#define RIN1 12//pwm
#define RIN2 13
#define BUTTON_1 "btn-switch"//总开关
#define BUTTON_2 "btn-manual"//手动模式
#define BUTTON_3 "btn-auto"//自动模式
#define BUTTON_4 "btn-track"//循迹模式
#define BUTTON_5 "btn-igncol"//忽略碰撞
#define BUTTON_6 "btn-front"//前进
#define BUTTON_7 "btn-left"//左转
#define BUTTON_8 "btn-back"//后退
#define BUTTON_9 "btn-right"//右转
#define lf D5//避障模块
#define rf D4
#define lb D2
#define rb D0
//********* 循迹模式
//#define tlS D3//左循迹
//#define trS D16//右循迹
//*********
//***********自动模式
#define outputPin D3//超声波触发
#define inputPin D16//超声波Echo回
//**********
//按钮绑定
BlinkerButton Button1(BUTTON_1);
BlinkerButton Button2(BUTTON_2);
BlinkerButton Button3(BUTTON_3);
BlinkerButton Button4(BUTTON_4);
BlinkerButton Button5(BUTTON_5);
BlinkerButton Button6(BUTTON_6);
BlinkerButton Button7(BUTTON_7);
BlinkerButton Button8(BUTTON_8);
BlinkerButton Button9(BUTTON_9);
bool isCollision = false;
bool MasterSwitch = false; //总开关
int rType = 0; // 0转弯 1 前进 2后退
bool ignCol = false;//忽略碰撞
enum ControlType
{
manual , autos, track, def
} CType = def;
void setup() {
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
analogWriteRange(255); //PWN 最大值设置为255
blinker_car_init();
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback);//按钮绑定 总开关
Button2.attach(button2_callback);//手动模式
Button3.attach(button3_callback);//自动模式
Button4.attach(button4_callback);//循迹模式
Button5.attach(button5_callback);//忽略避障
Button6.attach(button6_callback);//前进
Button7.attach(button7_callback);//左转
Button8.attach(button8_callback);//后退
Button9.attach(button9_callback);//右转
}
void blinker_car_init()
{
pinMode(LIN1, OUTPUT);//电机控制引脚初始化
pinMode(LIN2, OUTPUT);
pinMode(RIN1, OUTPUT);
pinMode(RIN2, OUTPUT);
StopCar();
pinMode(lf, INPUT);//避障引脚初始化
pinMode(rf, INPUT);
pinMode(lb, INPUT);
pinMode(rb, INPUT);
//****************
// pinMode(tlS, INPUT); //定义左循迹红外传感器为输入
// pinMode(trS, INPUT); //定义右循迹红外传感器为输入
//*************
myServo.attach(D1);
pinMode(outputPin, OUTPUT);//超声波传感器发射
pinMode(inputPin, INPUT);
//*************
}
void loop() {
CheckCollision();
// put your main code here, to run repeatedly:
Blinker.run();
if (CType == autos)
{
StartAuto();
}
else if (CType == track) {
StartTrack();
}
else if (CType == def) {
StopCar();
}
}
void CheckCollision()//检测碰撞
{
if (rType == 1) //前进中
{
if (!digitalRead(lf) || !digitalRead(rf))
{
if (!ignCol)
{
isCollision = true;
StopCar();
}
}
else
{
isCollision = false;
}
}
else if (rType == 2) //后退中
{
if (!digitalRead(lb) || !digitalRead(rb))
{
if (!ignCol)
{
isCollision = true;
StopCar();
}
}
else
{
isCollision = false;
}
}
else {
isCollision = false;
}
}
void StartAuto()//自动模式
{
int pos;
int dis[3];//距离
blinker_car_control(255, 0, 255, 0);
myServo.write(90);
dis[1] = getDistance(); //中间
if (dis[1] < 30 )
{
StopCar();
for (pos = 90; pos <= 150; pos += 1)//
{
myServo.write(pos); // tell servo to go to position in variable 'pos'
Blinker.delay(15); // waits 15ms for the servo to reach the position
}
dis[2] = getDistance(); //左边
for (pos = 150; pos >= 30; pos -= 1)
{
myServo.write(pos); // tell servo to go to position in variable 'pos'
Blinker.delay(15); // waits 15ms for the servo to reach the position
if (pos == 90)
dis[1] = getDistance(); //中间
}
dis[0] = getDistance(); //右边
for (pos = 30; pos <= 90; pos += 1)
{
myServo.write(pos); // tell servo to go to position in variable 'pos'
Blinker.delay(15); // waits 15ms for the servo to reach the position
}
if (dis[0] < dis[2]) //右边距离障碍的距离比左边近
{
//左转
blinker_car_control(0, 255, 255, 0);
Blinker.delay(500);
}
else //右边距离障碍的距离比左边远
{
//右转
blinker_car_control(255, 0, 0, 255);
Blinker.delay(500);
}
}
}
void StartTrack()
{
#if defined(tlS)
if (!isCollision)
{
if (!digitalRead(tlS) && !digitalRead(trS))//都没有碰到线,前进
{
blinker_car_control(180, 0, 180, 0);
}
else if (digitalRead(tlS) && !digitalRead(trS))//右转
{
blinker_car_control(200, 0, 0, 0);
}
else if (!digitalRead(tlS) && digitalRead(trS))//左转
{
blinker_car_control(0, 0, 200, 0);
}
else//停止
{
StopCar();
}
}
#endif
}
void blinker_car_control(int in1, int in2, int in3, int in4)
{
// 0转弯 1 前进 2后退
if (in1 > 0)
{
if (in3 > 0)
{
rType = 1;
} else {
rType = 0;
}
}
else if (in2 > 0)
{
if (in3 > 0)
{
rType = 0;
} else {
rType = 2;
}
}
if (!isCollision)
{
analogWrite(LIN1, in1);
analogWrite(LIN2, in2);
analogWrite(RIN1, in3);
analogWrite(RIN2, in4);
}
}
void button1_callback(const String & state)//总开关
{
if (state == BLINKER_CMD_ON)//切换为开
{
MasterSwitch = true;
Button1.color("#00FF30");
Button1.print("on");
}
else if (state == BLINKER_CMD_OFF) //切换为关
{
CType = def;
MasterSwitch = false;
StopCar();
Button1.color("#FF0000");
Button2.color("#000000");
Button3.color("#000000");
Button4.color("#000000");
Button1.print("off");
Button2.print();
Button3.print();
Button4.print();
}
}
void button2_callback(const String & state)//开始手动
{
if (CType != manual && MasterSwitch)
{
StopCar();
CType = manual;
if (state == BLINKER_CMD_BUTTON_TAP) {
Button2.color("#00FF00");
Button3.color("#000000");
Button4.color("#000000");
Button2.text("ManualModel");
Button2.print();
Button3.print();
Button4.print();
}
}
}
void button3_callback(const String & state)//开始自动
{
if ( CType != autos && MasterSwitch)
{
CType = autos;
if (state == BLINKER_CMD_BUTTON_TAP)
{
Button3.color("#00FF00");
Button2.color("#000000");
Button4.color("#000000");
Button3.text("AutoModel");
Button2.print();
Button3.print();
Button4.print();
}
}
}
void button4_callback(const String & state)//开始循迹
{
if ( CType != track && MasterSwitch)
{
CType = track;
if (state == BLINKER_CMD_BUTTON_TAP)
{
Button4.color("#00FF00");
Button2.color("#000000");
Button3.color("#000000");
Button4.text("TrackModel");
Button2.print();
Button3.print();
Button4.print();
}
}
}
void button5_callback(const String & state)//忽略碰撞开关
{
if (state == BLINKER_CMD_ON)//切换为开
{
ignCol = true;
Button5.color("#ff0000");
Button5.print("on");
}
else if (state == BLINKER_CMD_OFF) //切换为关
{
ignCol = false;
Button5.color("#000000");
Button5.print("off");
}
}
void button6_callback(const String & state)//前进
{
if (state == BLINKER_CMD_BUTTON_PRESSED && CType == manual) {
blinker_car_control(255, 0, 255, 0);
Button6.color("#00FF00");
Button6.print();
}
else if (state == BLINKER_CMD_BUTTON_RELEASED && CType == manual) {
StopCar();
Button6.color("#000000");
Button6.print();
}
}
void button7_callback(const String & state)//左转
{
if (state == BLINKER_CMD_BUTTON_PRESSED && CType == manual) {
blinker_car_control(0, 255, 255, 0);
Button7.color("#00FF00");
Button7.print();
}
else if (state == BLINKER_CMD_BUTTON_RELEASED && CType == manual) {
StopCar();
Button7.color("#000000");
Button7.print();
}
}
void button8_callback(const String & state)//后退
{
if (state == BLINKER_CMD_BUTTON_PRESSED && CType == manual) {
blinker_car_control(0, 255, 0, 255);
Button8.color("#00FF00");
Button8.print();
}
else if (state == BLINKER_CMD_BUTTON_RELEASED && CType == manual) {
StopCar();
Button8.color("#000000");
Button8.print();
}
}
void button9_callback(const String & state)//右转
{
if (state == BLINKER_CMD_BUTTON_PRESSED && CType == manual) {
blinker_car_control(255, 0, 0, 255);
Button9.color("#00FF00");
Button9.print();
}
else if (state == BLINKER_CMD_BUTTON_RELEASED && CType == manual) {
StopCar();
Button9.color("#000000");
Button9.print();
}
}
void StopCar() {
analogWrite(LIN1, 0);
analogWrite(LIN2, 0);
analogWrite(RIN1, 0);
analogWrite(RIN2, 0);
}
int getDistance()
{
digitalWrite(outputPin, LOW); // 使发出发出超声波信号接口低电平2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 保持发出超声波信号接口低电平
int distance = pulseIn(inputPin, HIGH); // 读出脉冲时间
distance = distance / 58.0; // 将脉冲时间转化为距离(单位:厘米)
Serial.println(distance); //输出距离值
if (distance >= 50)
{
//如果距离小于50厘米返回数据
return 50;
}//如果距离小于50厘米小灯熄灭
else
return distance;
}
网友评论