开源智能鸟蛋演示系统/zh
概述
本次教程我们将使用Microduino产品模块搭建鸟蛋温度检测系统,该系统通过温度传感器采集鸟蛋中各个点的内容,同时将数据传到手机中,实时生成温度表示图。 材料清单
实验原理智能鸟蛋系统主要由两大部分组成,数据采集部分由8个LM75温度传感器和一个10DOF模块组成,实时采集鸟蛋多个位置的温度和鸟蛋的位置状态,之后经过核心Core+的处理通过蓝牙模块Microduino-BT与手机联动将数据传输到手机中继上,继而上传到我们的云服务器mCotton,之后可通过网页查看温度示意图和鸟蛋姿态示意图。
Microduino-LM75 Microduino-Module motion 文档鸟蛋代码:【鸟蛋演示系统代码】 鸟蛋代码Github:SmartEgg 调试过程将Microduino-Core+/zh、Microduino-USBTTL/zh堆叠在一起.用数据线将写好的程序通过Microduino-USBTTL/zh上传到Microduino-Core+/zh上。 注意:最好不要将所有模块堆叠在一起之后再上传程序 打开Arduino IDE编程软件,点击 【文件】->【打开】,打开插卡音箱文件夹后选择Microduino_Audio_ble\ SmartEgg.ino 点击"√",编译程序。 点击【工具】,选择正确的板+处理器+端口。 点击"→",进行上传。 组装
至此鸟蛋部分拼装完成 mCotton设置进入https://mcotton.microduino.cn/projects 点击右上角Sign in/Join,在下拉菜单中点击右下角的Create account创建自己的账号。 输入Email作为用户名和自己的密码,之后点击Create即可。 注册后会自动进入登录状态,若未登录则点击右上角Sign in输入用户名(邮箱)和密码登录。登陆后点击左上角的Projects。 此时网页上会显示很多个标签,找到Smart Egg标签,并点击Made It进入下一步页面 在此处填写自己项目的名称和项目描述。图中高亮部分ID需要记住,建议复制在txt中保存。之后点击√Save 之后进入myDevice页面,会看到出现了名为XXX(刚才设定好的名字)的项目,点Details进入详细页面。 在之后的页面中点击Data右边的蓝色图标进入数据观察页面 若连接成功则右侧可显示鸟蛋数据图,左侧为选项设置部分
操作说明程序说明#include <Wire.h>
#include <I2Cdev.h>
#include <SoftwareSerial.h>
#include "MPU6050_6Axis_MotionApps20.h"
#include <lm75.h>
SoftwareSerial bleSerial(4, 5);
TempI2C_LM75 termo[8] = {TempI2C_LM75(0x48, TempI2C_LM75::nine_bits),
TempI2C_LM75(0x49, TempI2C_LM75::nine_bits),
TempI2C_LM75(0x4A, TempI2C_LM75::nine_bits),
TempI2C_LM75(0x4B, TempI2C_LM75::nine_bits),
TempI2C_LM75(0x4C, TempI2C_LM75::nine_bits),
TempI2C_LM75(0x4D, TempI2C_LM75::nine_bits),
TempI2C_LM75(0x4E, TempI2C_LM75::nine_bits),
TempI2C_LM75(0x4F, TempI2C_LM75::nine_bits)
};
Quaternion q;
MPU6050 mpu;
uint8_t mpuIntStatus;
uint16_t packetSize;
uint16_t fifoCount;
uint8_t fifoBuffer[64]; // FIFO存储缓冲器
float buff1[10]; //发送数据缓存
unsigned long time_mpu, time_tem;
uint8_t devStatus;
//获取四元数
void dmpGetQuaternion()
{
mpuIntStatus = mpu.getIntStatus();
fifoCount = mpu.getFIFOCount();
if((mpuIntStatus & 0x10) || fifoCount == 1024)
{
mpu.resetFIFO();
}
else if(mpuIntStatus & 0x02)
{
while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
mpu.getFIFOBytes(fifoBuffer, packetSize);
fifoCount -= packetSize;
mpu.dmpGetQuaternion(&q, fifoBuffer);
// mpu.resetFIFO();
}
}
void setup()
{
Serial.begin(9600);
bleSerial.begin(9600);
Wire.begin();
mpu.initialize();
Serial.println("Testing device connections...");
Serial.println(mpu.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
Serial.println(F("Initializing DMP..."));
devStatus = mpu.dmpInitialize();
if(devStatus == 0)
{
Serial.println(F("Enabling DMP..."));
mpu.setDMPEnabled(true);
mpuIntStatus = mpu.getIntStatus();
packetSize = mpu.dmpGetFIFOPacketSize();
}
else
{
while(1)
{
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}
}
}
void loop()
{
dmpGetQuaternion();
if(millis() > time_mpu + 1000)
{
time_mpu = millis();
buff1[0] = q.w;
buff1[1] = q.x;
buff1[2] = q.y;
buff1[3] = q.z;
/*
Serial.print("quat\t");
Serial.print(q.w);
Serial.print("\t");
Serial.print(q.x);
Serial.print("\t");
Serial.print(q.y);
Serial.print("\t");
Serial.println(q.z);
*/
sendData(0xAA, 16, (uint8_t *)buff1);
}
if(millis() > time_tem + 5000)
{
time_tem = millis();
for(int i = 0; i < 8; i++)
{
buff1[i] = termo[i].getTemp();
Serial.print(buff1[i]);
Serial.print(",");
}
Serial.println(" ");
sendData(0xBB, 32, (uint8_t *)buff1);
}
}
void sendData(uint8_t cmd, int _num, uint8_t *_buf)
{
uint8_t sendBuf[40];
sendBuf[0] = 0xAA;
sendBuf[1] = 0xBB;
sendBuf[2] = cmd;
if(_num > 0)
memcpy(sendBuf + 3, _buf, _num);
sendBuf[_num+3] = 0x0d;
sendBuf[_num+4] = 0x0a;
bleSerial.write(sendBuf, _num + 5);
}
视频 |