


ESP代码
#include <ESP8266WiFi.h>
static WiFiClient espClient;
#include <ArduinoJson.h>
#include <AliyunIoTSDK.h>
AliyunIoTSDK iot;
#define PRODUCT_KEY "hyyfW2KHpdG"
#define DEVICE_NAME "Node1"
#define DEVICE_SECRET "b8825507720f1566c5b0dc9b77bf8cf9"
#define REGION_ID "cn-shanghai"
#define WIFI_SSID "yaoyao"
#define WIFI_PASSWD "love123456"
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
//#include <SoftwareSerial.h>
//实例化软串口
//SoftwareSerial mySerial(D2, D1); // RX, TX
//分割结果
#define sleng 11 //数组大小
String split_result[sleng];//手动动态调整数组大小,保证数组可以满足容量
/*字符串分割
输入参数
String zifuchuan, 输入字符串
String fengefu, 分隔符号-可以是多个
String result[] 输出结果
*/
void Split(String zifuchuan,String fengefu,String result[])
{
int weizhi; //找查的位置
String temps;//临时字符串
int i=0;
do
{
weizhi = zifuchuan.indexOf(fengefu);//找到位置
if(weizhi != -1)//如果位置不为空
{
temps=zifuchuan.substring(0,weizhi);//打印取第一个字符
zifuchuan = zifuchuan.substring(weizhi+fengefu.length(), zifuchuan.length());
//分隔后只取后面一段内容 以方便后面找查
}
else
{ //上面实在找不到了就把最后的 一个分割值赋值出来以免遗漏
if(zifuchuan.length() > 0)
temps=zifuchuan;
}
result[i++]=temps;
//Serial.println(result[i-1]);//在这里执行分割出来的字符下面不然又清空了
temps="";
}
while(weizhi >=0);
}
void wifiInit(const char *ssid, const char *passphrase)
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, passphrase);
WiFi.setAutoConnect (true);
WiFi.setAutoReconnect (true);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("WiFi not Connect");
}
Serial.println("Connected to AP");
}
void powerCallback(JsonVariant p)
{
int PowerSwitch = p["PowerSwitch"];
if (PowerSwitch == 1)
{
//
}
else
{
//
}
}
/* 初始化 */
void setup() {
Serial.begin(9600);
while (!Serial) {
}
Serial.println("Goodnight moon!");
//mySerial.begin(9600);
wifiInit(WIFI_SSID, WIFI_PASSWD);
AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
// 绑定属性回调
AliyunIoTSDK::bindData("PowerSwitch", powerCallback);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.display();
delay(500); // Pause for 2 seconds
display.setTextSize(1);
display.setTextColor(WHITE);
display.setRotation(0);
}
unsigned long lastMsMain = 0;
String wind_speed="0";
String wind_jibie="0";
String wind_alram="0";
String dgree_X="0";
String dgree_Y="0";
String dgree_Z="0";
String dgree_alram="0";
// 如果数据内容为字符串而非数字
/*
SendMsg("wind_speed",wind_speed);
*/
void SendMsg_String(String s_send_id,String s_send_msg){
char c_send_msg[s_send_msg.length()+1];
char c_send_id[s_send_id.length()+1];
s_send_msg.toCharArray(c_send_msg,s_send_msg.length()+1);
s_send_id.toCharArray(c_send_id,s_send_id.length()+1);
AliyunIoTSDK::send(c_send_id, c_send_msg);
}
/* 主函数 */
void loop() {
AliyunIoTSDK::loop();
//接收串口消息mySerial
if (Serial.available()){
String split_input =Serial.readStringUntil(';');
//Serial.println(split_input);
//分割解析
Split(split_input,"-",split_result);//分割调用
Serial.println("--------new data--------");
//打印消息 检查是否为空
for(int i=0;i<sleng;i++)
{
if(split_result[i]!="")
{
//Serial.println(String(i)+"-"+split_result[i]);
}
else
{
split_result[i]="0";
}
}
wind_speed=split_result[0];
wind_jibie=split_result[1];
wind_alram=split_result[7];
dgree_X=split_result[3];
dgree_Y=split_result[5];
dgree_Z=split_result[6];
dgree_alram=split_result[8];
display.clearDisplay();
display.setCursor(0, 0);
display.print("wind speed:");
display.println(split_result[0]);
display.print("wind level:");
display.println(split_result[1]);
display.print("wind waring:");
display.println(split_result[7]);
display.print("angle x:");
display.println(split_result[3]);
display.print("angle y:");
display.println(split_result[5]);
display.print("angle z:");
display.println(split_result[6]);
display.print("angle waring:");
display.println(split_result[8]);
display.display();
delay(100);
String msg=String("")+"{"
+"\"wind_speed\":"+String(split_result[0])+","
+"\"wind_jibie\":"+String(split_result[1])+","
+"\"wind_alram\":"+String(split_result[7])+","
+"\"dgree_X\":"+String(split_result[3])+","
+"\"dgree_Y\":"+String(split_result[5])+","
+"\"dgree_Z\":"+String(split_result[6])+","
+"\"dgree_alram\":"+String(split_result[8])
+"}";
Serial.println(msg);
}
if (millis() - lastMsMain >= 3000){
lastMsMain = millis();
AliyunIoTSDK::send("wind_speed", wind_speed.toFloat());
AliyunIoTSDK::send("wind_jibie", int(wind_jibie.toInt()));
AliyunIoTSDK::send("wind_alram", int(wind_alram.toInt()));
AliyunIoTSDK::send("dgree_X", dgree_X.toFloat());
AliyunIoTSDK::send("dgree_Y", dgree_Y.toFloat());
AliyunIoTSDK::send("dgree_Z", dgree_Z.toFloat());
AliyunIoTSDK::send("dgree_alram", int(dgree_alram.toInt()));
// SendMsg("报警状态","报警信息");
}
}
STM32


#include <Adafruit_MPU6050.h>
//#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
int PIN_LEDR = PA12;
int PIN_LEDG = PB5;
int PIN_alram = PB8;
Adafruit_MPU6050 mpu;
//Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
bool buttonState = 0;
float dx_list[10]={0,0,0,0,0,0,0,0,0,0};
float dy_list[10]={0,0,0,0,0,0,0,0,0,0};
float dz_list[10]={0,0,0,0,0,0,0,0,0,0};
int idex=0;
#define ESP_Serial3 Serial3
#define mySerial Serial2
// 查询一次
byte Msg_getdata[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};
char RecData[9]={0};
// 风速 m/s
float fengsu[1]={0.0};
// 风速等级
int dnegji[1]={0};
//==============校验==============
uint16_t modbus_crc16( char *data, uint8_t length) {
uint16_t crc = 0xFFFF;
for (uint8_t i = 0; i < length; i++) {
crc ^= data[i];
for (uint8_t j = 8; j > 0; j--)
{
if (crc & 0x0001)
{
crc = (crc >> 1) ^ 0xA001;
} else
{
crc >>= 1;
}
}
}
return crc;
}
// CRC16 校验
// char senddata[6] = {0x30,0x31,0x00,0x00,0x00,0x02};
// 数据 数据长度(不包含校验码本身)
// uint16_t crc = modbus_crc16(senddata, sizeof(senddata));
//
// //CRC16: 0xB, 0xC4
// uint16_t crc_H= (crc & 0xFF00) >> 8;
// uint16_t crc_L= (crc & 0x00FF);
//
// Serial.print("CRC16: 0x");
// Serial.print(crc_H, HEX);
// Serial.print(", 0x");
// Serial.println(crc_L, HEX);
/*
0~9 48~57 30~39H
A~Z 65~90 41~5AH
a~z 97~122 61~7AH
空格 32 20H
*/
void ReadSpeed(float *fengsu, int *dnegji){
mySerial.write(Msg_getdata,sizeof(Msg_getdata)) ;
while(1){
if(mySerial.available()>0)//判断串口是否有数据可读
{
delay(50);
for(int i=0;i<9;i++)
{
RecData[i]=mySerial.read();
//Serial.print(i); Serial.print(" - ");Serial.println(RecData[i]);
}
// 地址 功能码 数据长度 风速寄存器0高 风速寄存器0低 风级寄存器1高 风级寄存器1低 CRC16低校验码 CRC16高校验码
// 01 03 00 00 24 00 03 FA 39
uint16_t crc = modbus_crc16(RecData, sizeof(RecData)-2);// 最后两位是校验码
//CRC16: 0xB, 0xC4
uint16_t crc_H= (crc & 0xFF00) >> 8;
uint16_t crc_L= (crc & 0x00FF);
uint16_t crc_L_rec=RecData[7];
uint16_t crc_H_rec=RecData[8];
if(crc_L_rec=crc_L && crc_H_rec==crc_H)
{
fengsu[0]=(RecData[4])/10.0;
dnegji[0] =(RecData[6]);
//String showms=" 风速: " + String(fengsu)+"m/s 等级:"+String(dnegji);
//Serial.println(showms);
break;
}
else{
fengsu[0]=0.1;
dnegji[0]=0;
Serial.println("校验失败......");
Serial.print("接收的CRC16: 0x");
Serial.print(crc_L, HEX);
Serial.print(", 0x");
Serial.print(crc_H, HEX);
Serial.print(" 计算的CRC16: ");
Serial.print(crc_L_rec, HEX);
Serial.print(", 0x");
Serial.println(crc_H_rec, HEX);
break;
}
}
delay(20);
}
}
float MPU_x_y_z[3]={0};
void ReadMPU(float *MPU_x_y_z_){
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
float d_x= acos(a.acceleration.x/9.8)/3.14*180-90;
float d_y= acos(a.acceleration.y/9.8)/3.14*180-90;
float d_z= acos(a.acceleration.z/9.8)/3.14*180;
if (idex<10){
dx_list[idex]=d_x;
dy_list[idex]=d_y;
dz_list[idex]=d_z;
idex=idex+1;
}
else{
idex=0;
dx_list[idex]=d_x;
dy_list[idex]=d_y;
dz_list[idex]=d_z;
idex=idex+1;
}
float d_x_j=0;
float d_y_j=0;
float d_z_j=0;
for(int i=0;i<10;i++)
{
d_x_j=d_x_j+dx_list[i];
d_y_j=d_y_j+dy_list[i];
d_z_j=d_z_j+dz_list[i];
}
d_x_j=d_x_j/10.0;
d_y_j=d_y_j/10.0;
d_z_j=d_z_j/10.0;
MPU_x_y_z_[0]=d_x_j;
MPU_x_y_z_[1]=d_y_j;
MPU_x_y_z_[2]=d_z_j;
}
void setup()
{
Serial.begin(9600);
mySerial.begin(4800);
ESP_Serial3.begin(9600);
pinMode(PIN_LEDR, OUTPUT);
pinMode(PIN_LEDG, OUTPUT);
digitalWrite(PIN_LEDR, LOW);
digitalWrite(PIN_LEDG, LOW);
pinMode(PIN_alram, OUTPUT);
digitalWrite(PIN_alram, HIGH);
if (!mpu.begin()) {
Serial.println("Sensor init failed");
while (1)
yield();
}
// Serial.println("Found a MPU-6050 sensor");
// // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
// if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
// Serial.println(F("SSD1306 allocation failed"));
// for (;;)
// ; // Don't proceed, loop forever
// }
// display.display();
// delay(500); // Pause for 2 seconds
// display.setTextSize(1);
// display.setTextColor(WHITE);
// display.setRotation(0);
}
bool alram_speed_dgree[2]={0};
unsigned long currentMicros = 0;
unsigned long previousMicros = 0;
void loop()
{
delay(100);
ReadSpeed(fengsu,dnegji);
ReadMPU(MPU_x_y_z);
currentMicros = micros();
if (currentMicros - previousMicros >= 3000*1000) {
previousMicros = currentMicros;
String showms=" 风速: " + String(fengsu[0])+"m/s 等级:"+String(dnegji[0]);
Serial.println(showms);
if(dnegji[0]>=3){
alram_speed_dgree[0]=1;
Serial.println("风速过大报警");
}
else{
alram_speed_dgree[0]=0;
Serial.println("风速正常");
}
String showms_mpu=" 角度x: " + String(MPU_x_y_z[0])+" y:"+String(MPU_x_y_z[1])+" z:"+String(MPU_x_y_z[2]);
Serial.println(showms_mpu);
if(abs(MPU_x_y_z[0])>=65 || abs(MPU_x_y_z[1])>=65){
alram_speed_dgree[1]=1;
Serial.println("倾斜角过大报警");
}
else{
alram_speed_dgree[1]=0;
Serial.println("倾斜角正常");
}
if (alram_speed_dgree[0]==1 || alram_speed_dgree[1]==1 ) {
digitalWrite(PIN_LEDR, LOW);
digitalWrite(PIN_LEDG, HIGH);
digitalWrite(PIN_alram, LOW);
} else {
digitalWrite(PIN_LEDR, HIGH);
digitalWrite(PIN_LEDG, LOW);
digitalWrite(PIN_alram, HIGH);
}
String(fengsu[0])+"m/s 等级:"+String(dnegji[0]);
String msg_esp=String()
+ String(fengsu[0])+"-"
+ String(dnegji[0])+"-"
+ String(MPU_x_y_z[0])+"-"
+ String(MPU_x_y_z[1])+"-"
+ String(MPU_x_y_z[2])+"-"
+ String(alram_speed_dgree[0])+"-"
+ String(alram_speed_dgree[1])+"-"
+";";
ESP_Serial3.print(msg_esp);
}
// display.clearDisplay();
// display.setCursor(0, 0);
//
// display.print("speed:");
// display.println(fengsu[0], 1);
//
// display.print("level:");
// display.println(dnegji[0], 1);
//
// display.print("x:");
// display.println(MPU_x_y_z[0], 1);
// display.print("y:");
// display.println(MPU_x_y_z[1], 1);
// display.print("z:");
// display.println(MPU_x_y_z[2], 1);
//
// display.display();
// delay(100);
}
浙公网安备 33010602011771号