仓储物联网监控项目分享
作为蘑粉很荣幸参加了英特尔的物联网创客竞赛,参加了蘑菇云4次培训,决定做仓储物联网项目,这里要感谢蘑菇云的大力支持,给我们培训,提供套件还有场地,无偿的帮助很感动!特别感谢其中的一个帅哥老师,问了一百多人只有他手里有打火机,每次从他那里找到打火机(测试火焰)的那种幸福感是难以言表的!整个文章前面讲场地后面讲我们做的东西,文字上比较活跃,由于我们都是做软件的,所以不能像其他创客那样有很多操作步骤上的讲解,更多的是给大家讲系统实现的方法。敬请担待:handshake!废话不多说,直接上图!让没去的蘑粉也感受下现场的热烈氛围!比赛场地一角旁边这桌也做的热火朝天,感谢他们带了一款众筹产品给我们试用。
这个应该是某个大学的学生,一看就是朝气蓬勃,看到他们才感觉到我们真的老了,真的老了:(。
这桌现场修理电磁炉,带着锅准备做饭,知道为什么吗?因为中午的饭分量太少,把我们这群IT狗饿得受不了了:lol!(这里我扯的),他们应该做的智能电器,能看得出来做的很用心。
做android端的哥们,帅的一塌糊涂。哥们特意给我说过,上传的他的照片要打马赛克,一定要打马赛克!我按他说的做了;P!
我怕你们看到我之后就得我队友不帅,所以就只上传有蘑菇云定制版联想笔记本。
上面讲了那么多热烈的画面,接下来给大家讲点降温的东西。
好了!接下来讲讲我们做的东西,其实很简单了!真的很简单!我都不好意思讲了!此处省略一百句谦虚。。。。。。。我们的做这个的想法来源于XX港的xx事件。
从官方的报道发现了这两个让我这个吃瓜群众觉得不可思议的地方
1.消防队员到了之后无法得知堆场集装箱装载货物种类
2.仓储区特殊货物对环境有比较高的要求,居然没有相关调控措施
做为IT吃瓜群众,我们几个是很难接受这个现实的,抄起家伙就干:victory:。设计了仓储物联网监控系统,下面是框架
用intel的物联网模块Edison作为HUB,此处再次感谢蘑菇云的场地套件培训,由于接线比较多,拍照看起来比较凌乱,下面的接线图就截的老师的此处感谢乔老师的无私奉献,吃瓜群众再次拜谢:$!偷拍乔老师的画面,超级敬业啊!
接线图
功能实现:
1.HUB每20S上传一次温度,湿度,火警状态到服务器,手机端定时访问服务器获取信息并显示。
2.当温度,湿度,大于设定的阀值手机端和PC端都会发出报警提示音。
3.当火警状态时,手机端和PC会报警。HUB端会发出声光报警,工作人员查看没有火警情况下,按下复位键系统复位,继续监控场地信息,火警状态下,上传数据频率为1S/次。
各位大神原谅我吧!表达能力不行,程序上传共享,大神们看一眼就知道怎么回事。
首先上PC端登陆界面,输入用户名密码
进入设备信息列表
点击查看可以查看温湿度历史记录,各个时间点的,我觉得我哥们做的挺漂亮,我这哥们没女朋友,这里我给他发个征婚启示,张江IT男,憨厚老实,吃苦耐劳,居家过日子必备,好了又扯远了。下面是历史记录截图。
重点讲下通信协议:
Edison上传传感器数据到服务器我们用的HTTP协议GET方法,具体实现如下
void httpRequest() {
// close any connection before send a new request.
// This will free the socket on the WiFi shield
lastConnectionTime = millis();
client.stop();
Serial.println("connecting...");
// if there's a successful connection:
if (client.connect(server, 80)) {
Serial.println("connected");
client.println("GET /eservice/device.action?&action=saveDevRecord&sign=WlwebByRebel&devCode=" +String(devId) + "&temperature=" + String(temperature) + "&humidity=" + String(humidityValue) + "&fireStatus=" + String(fireStatus) + " HTTP/1.1");
client.println("Host:xxx.xxx.xxx.163");
client.println();
if (client.available()) {
char c = client.read();
Serial.println();
Serial.println(c);
Serial.println();
}
// Serial.println("GET /eservice/device.action?&action=saveDevRecord&sign=WlwebByRebel&devCode=" +String(devId) + "&temperature=" + String(temperature) + "&humidity=" + String(humidityValue) + "&fireStatus=" + String(fireStatus) + " HTTP/1.1");
client.stop();
} else {
// if you couldn't make a connection:
Serial.println("connection failed");
}
}上面这段代码主要实现HTTP的GET方法,上传了温度,湿度,火警状态,设备编号信息。上传信息的接口要和做服务器的协商好,按照要求上传信息即可,如果不是团队做可以用第三方IOT服务器,像中国移动的OneNET按照预定协议格式上传而且还有APK模版,基本都是拿来修修改改就能用的。
void fireWaring() {
int i = 1;
int ledNum = 0;
int keyFlag = 0;
int sensorValue = analogRead(0);//火焰传感器连到模拟口,并从模拟口读值
//Serial.println(sensorValue);
delay(1);
if(sensorValue > 500){ //如果数大于500,说明有火源,蜂鸣器响 这里的设定值根据实际情况赋值
fireStatus = 1;
while(fireStatus == 1){
//fireStatus = 1;
for(int x=0; x<180; x++){
//将 sin函数角度转化为弧度
sinVal = (sin(x*(3.1412/180)));
//用 sin函数值产生声音的频率
toneVal = 2000+(int(sinVal*1000));
//给引脚 8一个
tone(8, toneVal);
delay(15);
buttonState = digitalRead(buttonPin); //读取按键引脚的状态值
Serial.println("w5 "+ String(buttonState));
// 检测按键是否按下,如果是的话,按键状态值为 HIGH
if (buttonState == HIGH) {
// digitalWrite(ledPin, LOW);// 打开 LED
// noTone(8); //关闭蜂鸣器
// fireStatus = 0;
keyFlag = 1;
break;
}
}
if(ledNum > 100){
digitalWrite(ledPin, ~i); // 关闭 LED
ledNum=0;
}else{
ledNum++;
}
if(keyFlag == 1)
{
digitalWrite(ledPin, LOW);// 打开 LED
noTone(8); //关闭蜂鸣器
fireStatus = 0;
keyFlag = 0;
break;
}
if(millis() - lastConnectionTime > 2000) {
//lastConnectionTime = millis();
httpRequest();
//Serial.println(Mystring);
}
}
} else { // 如果数据小于等于500,没有火源,关闭蜂鸣器
noTone(8); //关闭蜂鸣器
}
}
上面这段代码当时难住我的地方是满足判断条件后蜂鸣器一直不响,后来尝试加大延长时间到15ms问题就解决了。
下面这段是主函数逻辑部分,大部分都注释了,其实整个逻辑很简单。
void loop() {
char bufferChar;
char bufferChar1;
static unsigned long readSensorTimer=0;
fireWaring();
if(millis()-readSensorTimer>300)
{
readSensorTimer=millis();
temperatureValue=analogRead(TemperaturePin); //读取温度的模拟量
humidityValue=analogRead(HumidityPin); //读取湿度的模拟量
temperature=(500 * temperatureValue) /1024; //通过模拟量计算出实际温度
Serial.print("humidityValue: ");
Serial.println(humidityValue);
Serial.print("temperature: ");
Serial.println(temperature);
//LCD显示当前温度
lcd.setCursor(0, 0); //光标移到第一行,第一个字符
lcd.print("T:");
lcd.print(temperature);
lcd.print("C");
lcd.print(" ");
//LCD现实当前湿度
lcd.setCursor(6, 0); //光标移动到第一行,第七个字符
lcd.print("H:");
//lcd.print("");
lcd.print(humidityValue);
if(humidityValue < 99)
lcd.print("");//如果humidityValue大于99,下一次输出的数据小于100的话就会造成LCD上显示的数字不正确,所以有效数字后做了清空处理
//显示当前土壤情况
lcd.setCursor(0, 1); //光标移动到第二行,第一个字符
if (humidityValue<300) {
lcd.print("Soil: Dry");
}
else if (humidityValue>=300 && humidityValue<700){
lcd.print("Soil: Humid");
}
else{
lcd.print("Soil: Water");
}
}
// if you're not connected, and ten seconds have passed since
if(millis() - lastConnectionTime > postingInterval) {
//lastConnectionTime = millis();
httpRequest();
//Serial.println(Mystring);
}
}
关于服务器不很我也不是很懂,以前自己做的是按照这个搭建的,链接如下
ubuntu下搭建服务器
大家可以看下,不过还是比较推荐个人创客用大公司的开发接口,这样开发难度会小一点,附上中国移动OneNET链接供参考中国移动OneNET
到此为止简单讲了我们做的东西,面太广,太杂了,讲的也没什么深度,请各位见谅!:handshake:handshake:handshake:handshake:handshake:handshake:handshake
蘑菇云物联特工队 @Ash
8 错 你们做得好快,,这么快就上传教程了。。 记录得好详细~ 还不忘征婚 哈哈Hi,当时登记的团队成员名字可以给我一下吗?
页:
[1]