第一步使用ESP8266 实现透传(使用的贝壳物联)
第二步使用YB智能小车51控制板
代码如下:
/*
注意 :Arduino IDE版本请使用1.6.5-1.8.2
ESP8266模块在接Arduino之前请确定透传稳定性,在串口查看ESP8266是否能多次收到WELCOME TO BIGIOT,
能多次收到说明透传稳定且能自动重连。
时间:2018.12.4
作者:www.bigiot.net
*/
#include <aJSON.h>
//============= 此处必须修该============
String DEVICEID = "1XXX"; // 你的设备ID ==
String APIKEY = "d33XXXX"; //设备密码=
//=======================================
const int LED = 4;// LED正极连接针脚4
unsigned long lastCheckStatusTime = 0; //记录上次报到时间
const unsigned long postingInterval = 40000; // 每隔40秒向服务器报到一次
unsigned long checkoutTime = 0;//登出时间
int ledState = 0;
//============================亚博智能===========================
// 智能小车前进实验
//===============================================================
int Left_motor_back=9; //左电机后退(IN1)
int Left_motor_go=5; //左电机前进(IN2)
int Right_motor_go=6; // 右电机前进(IN3)
int Right_motor_back=10; // 右电机后退(IN4)
int control = 150;//PWM控制量
void setup() {
pinMode(LED, OUTPUT);
//初始化电机驱动IO为输出方式
pinMode(Left_motor_go,OUTPUT); // PIN 5 (PWM)
pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
pinMode(Right_motor_go,OUTPUT);// PIN 6 (PWM)
pinMode(Right_motor_back,OUTPUT);// PIN 10 (PWM)
Serial.begin(115200);
delay(5000);//等一会儿ESP8266
}
void run(int time) // 前进
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,HIGH); // 左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Left_motor_back,0);
delay(time * 100); //执行时间,可以调整
}
void brake() //刹车,停车
{
digitalWrite(Left_motor_back, LOW);
digitalWrite(Left_motor_go, LOW);
digitalWrite(Right_motor_go, LOW);
digitalWrite(Right_motor_back, LOW);
//delay(time * 100);//执行时间,可以调整
}
void left() //左转(左轮不动,右轮前进)
{
digitalWrite(Right_motor_go, HIGH); // 右电机前进
digitalWrite(Right_motor_back, LOW);
analogWrite(Right_motor_go, 180);//control);
//analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go, LOW); //左轮不动
digitalWrite(Left_motor_back, LOW);
//analogWrite(Left_motor_go,0);
//analogWrite(Left_motor_back,0);//PWM比例0~255调速
delay(100); //执行时间,可以调整
digitalWrite(Right_motor_go, LOW); //全部停止
delay(100); //执行时间,可以调整
}
void spin_left() //左转(左轮后退,右轮前进)
{
digitalWrite(Right_motor_go, HIGH); // 右电机前进
digitalWrite(Right_motor_back, LOW);
analogWrite(Right_motor_go,control);
//analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go, LOW); //左轮后退
digitalWrite(Left_motor_back, HIGH);
//analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,control);//PWM比例0~255调速
//delay(time * 100); //执行时间,可以调整
}
void right() //右转(右轮不动,左轮前进)
{
digitalWrite(Right_motor_go, LOW); //右电机不动
digitalWrite(Right_motor_back, LOW);
//analogWrite(Right_motor_go,0);
//analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go, HIGH); //左电机前进
digitalWrite(Left_motor_back, LOW);
analogWrite(Left_motor_go,180); //control);
delay(100); //执行时间,可以调整
digitalWrite(Left_motor_go, LOW); //全部停止
delay(100); //执行时间,可以调整
}
void spin_right() //右转(右轮后退,左轮前进)
{
digitalWrite(Right_motor_go, LOW); //右电机后退
digitalWrite(Right_motor_back, HIGH);
//analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,control);//PWM比例0~255调速
digitalWrite(Left_motor_go, HIGH); //左电机前进
digitalWrite(Left_motor_back, LOW);
//analogWrite(Left_motor_go,200);
analogWrite(Left_motor_go,control);//PWM比例0~255调速
//delay(time * 100); //执行时间,可以调整
}
void back() //后退
{
digitalWrite(Right_motor_go, LOW); //右轮后退
digitalWrite(Right_motor_back, HIGH);
//analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,control);//PWM比例0~255调速
digitalWrite(Left_motor_go, LOW); //左轮后退
digitalWrite(Left_motor_back, HIGH);
//analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,control);//PWM比例0~255调速
//delay(time * 100); //执行时间,可以调整
}
void loop() {
//每一定时间查询一次设备在线状态,同时替代心跳
if (millis() - lastCheckStatusTime > postingInterval) {
checkStatus();
}
//checkout 50ms 后 checkin
if ( checkoutTime != 0 && millis() - checkoutTime > 50 ) {
checkIn();
checkoutTime = 0;
}
//读取串口信息
while (Serial.available()) {
String inputString = Serial.readStringUntil('\n');
//检测json数据是否完整
int jsonBeginAt = inputString.indexOf("{");
int jsonEndAt = inputString.lastIndexOf("}");
if (jsonBeginAt != -1 && jsonEndAt != -1) {
//净化json数据
inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1);
int len = inputString.length() + 1;
char jsonString[len];
inputString.toCharArray(jsonString, len);
aJsonObject *msg = aJson.parse(jsonString);
processMessage(msg);
aJson.deleteItem(msg);
}
}
}
//设备登录
//{"M":"checkin","ID":"xx1","K":"xx2"}\n
void checkIn() {
Serial.print("{\"M\":\"checkin\",\"ID\":\"");
Serial.print(DEVICEID);
Serial.print("\",\"K\":\"");
Serial.print(APIKEY);
Serial.print("\"}\r\n");
}
//处理网络接收到到指令,执行相关动作
void processMessage(aJsonObject *msg) {
aJsonObject* method = aJson.getObjectItem(msg, "M");
if (!method) {
return;
}
String M = method->valuestring;
if (M == "WELCOME TO BIGIOT") {
checkOut();
checkoutTime = millis();
return;
}
if (M == "connected") {
checkIn();
}
if (M == "say") {
aJsonObject* content = aJson.getObjectItem(msg, "C");
aJsonObject* client_id = aJson.getObjectItem(msg, "ID");
String C = content->valuestring;
String F_C_ID = client_id->valuestring;
if (C == "play") {
digitalWrite(LED, HIGH);
run(10); //前进
say(F_C_ID, "LED on!");
}
if (C == "up") {
digitalWrite(LED, HIGH);
run(10); //前进
say(F_C_ID, "LED on!");
}
if (C == "stop" || C == "pause") {
digitalWrite(LED, LOW);
brake();
say(F_C_ID, "LED off!");
}
if (C == "right") {
digitalWrite(LED, HIGH);
right(); //向右
say(F_C_ID, "LED on!");
}
if (C == "left") {
digitalWrite(LED, HIGH);
left(); //向右
say(F_C_ID, "LED on!");
}
if (C == "backward") {
digitalWrite(LED, HIGH);
spin_left(); //加速向左
say(F_C_ID, "LED on!");
}
if (C == "forward") {
digitalWrite(LED, HIGH);
spin_right(); //加速向右
say(F_C_ID, "LED on!");
}
if (C == "down") {
digitalWrite(LED, HIGH);
back(); //向后
say(F_C_ID, "LED on!");
}
if (C == "offOn") {
ledState = digitalRead(LED);
if (ledState == HIGH) {
digitalWrite(LED, LOW);
say(F_C_ID, "LED PowerOFF");
} else {
digitalWrite(LED, HIGH);
say(F_C_ID, "LED PowerON");
}
}
}
}
//发送say指令,用于设备与用户、设备与设备间通讯
//{"M":"say","ID":"xx1","C":"xx2","SIGN":"xx3"}\n
void say(String ID, String c) {
Serial.print("{\"M\":\"say\",\"ID\":\"");
Serial.print(ID);
Serial.print("\",\"C\":\"");
Serial.print(c);
Serial.print("\"}\r\n");
}
//强制设备下线,用消除设备掉线延时
//{"M":"checkout","ID":"xx1","K":"xx2"}\n
void checkOut() {
Serial.print("{\"M\":\"checkout\",\"ID\":\"");
Serial.print(DEVICEID);
Serial.print("\",\"K\":\"");
Serial.print(APIKEY);
Serial.print("\"}\n");
}
//查询设备在线状态
//{"M":"status"}\n
void checkStatus() {
Serial.print("{\"M\":\"status\"}\n");
lastCheckStatusTime = millis();
}