Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of warehouse by
main.cpp
- Committer:
- glintligo
- Date:
- 2018-06-03
- Revision:
- 10:80ccb0dc0784
- Parent:
- 9:238780dda8af
File content as of revision 10:80ccb0dc0784:
/*-----------------------------------------------------
File Name : main.cpp
Purpose : For esp8266 mbed porting
Creation Date : 22-06-2017
Last Modified :
Created By : Jeasine Ma [jeasinema[at]gmail[dot]com]
-----------------------------------------------------*/
#include <cstdarg>
#include <cstring>
#include "mbed.h"
#include "esp8266.h"
Serial ser2usb(PA_2, PA_3, 115200);
DigitalIn ref(PA_12);
DigitalOut LED(PC_13);
DigitalOut IN1(PB_4);
DigitalOut IN2(PB_3);
DigitalOut IN3(PA_15);
DigitalOut IN4(PA_12);
PwmOut ENA(PB_1);
PwmOut ENB(PB_0);
InterruptIn switch1(PB_6);
int state = 0;
int actionok = 0;
void run_forwoard();
void run_backwoard();
void stop();
void init();
int main(void) {
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
ENA.period_ms(10);
ENB.period_ms(10);
ENA.pulsewidth_ms(3);
ENB.pulsewidth_ms(3);
ser2usb.printf("starting\r\n");
// 选定与 esp8266 相连接的串口,WiFi 名称和密码
Esp8266 client(PA_9, PA_10, "iot_b827ebd838be", "ab087c9e");// 参数分别为 TX pin / RX pin / SSID / Password
//声明所有的传感器,每行一个,每个由名字、单位两部分组成,最后一行必须为空指针作为结尾
const char* sensors[][2] = {
"actionok", "",
NULL, NULL //最后一行以空指针作为结束标记
};
//声明所有的执行器,每行一个,每个由名字、参数类型两部分组成,最后一行必须为空指针作为结尾
const char* actuators[][2] = {
"do", "int",
NULL, NULL //最后一行以空指针作为结束标记
};
ser2usb.printf("connecting...\r\n");
//连接到服务器
client.connect_mqtt_broker("192.168.12.1", "car", sensors, actuators);
ser2usb.printf("Initialization done.\r\n");
char actuator_name[32], control_value[32];
// bool ref_last;
// float last_report=0;
Timer t;// 定时器用于计量发送传感器数据的时间
t.start();
switch1.rise(&init);
while(1) {
//检查有没有收到新的执行器控制指令
if(client.get_control_cmd(actuator_name, control_value)){
ser2usb.printf("Received CMD %s %s\r\n", actuator_name, control_value);
//判断哪个执行器收到命令
state = atoi(control_value);
switch (state)
{
case 0:
run_backwoard();
break;
case 1: // white to black
run_forwoard();
wait(0.2);
stop();
actionok = 1;
break;
case 2: //black to robo
run_forwoard();
break;
case 3: //robo to white
run_backwoard();
break;
case 4: //robo to black
run_backwoard();
break;
case 5: //white to robo
run_forwoard();
break;
case 6: //black to white
run_backwoard();
wait(0.2);
stop();
actionok = 1;
break;
default:
break;
}
}
if (actionok ==1)
{
client.publish_value("actionok", "0");
actionok = 0;
}
// bool reflection = ref;
// if(reflection != ref_last){ //仅在传感器发生变化时汇报数据
//
// ref_last = reflection;
//
// char val[4];
// sprintf(val, "%d", (int)reflection);
//
// //汇报传感器数据,两个参数分别是传感器名字和值
// client.publish_value("reflection", val);
// }
//
// if(t.read() - last_report > 1){ // 每1s发送汇报一次传感器数据
//
// //汇报传感器数据,两个参数分别是传感器名字和值
// //client.publish_value("light", "30 lx");
//
// last_report = t.read();
// }
}
}
void run_forwoard()
{ IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 1;
}
void run_backwoard()
{
IN1 = 0;
IN2 = 1;
IN3 = 1;
IN4 = 0;
}
void stop()
{
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
void init()
{
wait(0.01);
if(switch1.read() == 1)
{
switch (state)
{
case 0:
stop();
wait(0.01);
run_forwoard();
wait(0.1);
stop();
actionok = 1;
break;
case 2:
stop();
wait(0.01);
run_backwoard();
wait(0.1);
stop();
actionok = 1;
break;
case 3:
stop();
wait(0.01);
run_forwoard();
wait(0.1);
stop();
actionok = 1;
break;
case 4:
stop();
wait(0.01);
run_forwoard();
wait(0.5);
stop();
actionok = 1;
break;
case 5:
stop();
wait(0.01);
run_backwoard();
wait(0.1);
stop();
actionok = 1;
break;
default:
break;
}
}
}
