加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

Iot標(biāo)簽

2019/08/22
234
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
方塊圖(2)
  • 方案介紹
  • 相關(guān)文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

IoT 標(biāo) 簽

源 起:
在我們小區(qū)門口,有一家不大的店~叫“福美家超市”。主打是賣菜,兼有副食品和小百貨等。奇怪的是,旁邊有幾家類似功能的店,其他家多是冷冷清清,這一家卻總是得排隊(duì)付款。就算附近農(nóng)村賣小菜的農(nóng)民在附近圍了一圈兒又一圈兒,似乎也沒能沖淡這家店的生意!
今天,照例來到這家店里準(zhǔn)備買菜,大家伙兒自覺地站了兩排,向前推進(jìn)得似火比平常慢了點(diǎn)。正在選菜中,老板娘不知對誰發(fā)了個話,“哎,大媽,您稍等會兒啊,今天缺兩人沒來吶”。今天小兩口子一同協(xié)作:一個稱重貼標(biāo)簽,另一個掃碼收款(向多數(shù)老年人),年輕人常常是手機(jī)付款。時不時也有不想多等的年輕人離開店鋪。
我的感覺是排隊(duì)買菜的現(xiàn)象已經(jīng)有幾年了。有一次為關(guān)于他兒子學(xué)編程事聊了一會兒。他們每天3~4點(diǎn)就得起床,要趕往蔬菜集散中心采購,回到店里,還要不停地整理菜品,全家齊上陣,吃飯不定點(diǎn),直到晚上23點(diǎn)接近24點(diǎn)才能睡覺。幾乎天天如此,年年如此。所以老板的問題似乎也是我的問題,忽然自動激發(fā)了是不是可以利用最近學(xué)習(xí)人工智能技術(shù),其中之一是機(jī)器學(xué)習(xí),可以對各種菜品進(jìn)行訓(xùn)練學(xué)習(xí),達(dá)到一定次數(shù)后不難識別常見超市蔬菜瓜果等。由此制作一種能自動識別稱重貼標(biāo)的AI菜籃子。
這家店年輕的老板及老板娘怎么也不會想到,一位顧客會為他們店更高效地賣菜而想辦法。哈哈,這就是創(chuàng)客吧。
當(dāng)然,小白的我對人工智能才剛剛接觸,這個AI菜籃子當(dāng)前僅存腦海里備檔喲。

但是結(jié)合電子墨水屏制作未來超市的商品IoT標(biāo)簽并不難。

IoT標(biāo)簽:
一種在超市、便利店、藥房、甚至員工胸牌等場景顯示信息的電子類標(biāo)簽。隨著人工智能時代的來臨,將越來越多地替代傳統(tǒng)紙質(zhì)標(biāo)簽;每一個電子價簽通過無線網(wǎng)絡(luò)與商場計(jì)算機(jī)數(shù)據(jù)庫或上云互連,實(shí)時、準(zhǔn)確地顯示不同區(qū)域商品最新的基本信息。

IoT標(biāo)簽 VS 紙質(zhì)標(biāo)簽:

IoT標(biāo)簽 紙質(zhì)標(biāo)簽
1、便利性:一次到位,僅幾年后更換電池 繁瑣
2、體驗(yàn)佳:改善顧客線上線下體驗(yàn)不一致,更可實(shí)物參照 不同步
3、節(jié)約成本:人力、時間、環(huán)保 成本高,易出錯
4、易管理:隨時更新,調(diào)整,云上操作不易出錯,及時提供數(shù)據(jù)
......

目前制作IoT標(biāo)簽的最佳選擇是電子墨水屏。什么是電子墨水屏?(參考:電子發(fā)燒友網(wǎng)~"傳感器技術(shù)")
電子墨水屏(E-link):
電子墨水屏技術(shù)最早可以追溯到 1996 年,它基于美國麻省理工學(xué)院媒體實(shí)驗(yàn)室(MIT Media Lab)的一項(xiàng)研究,利用電泳技術(shù)(EPD)實(shí)現(xiàn)顯示,這類屏幕的顯示效果十分接近傳統(tǒng)紙張,因此也被成為“電子紙”。1997 年,麻省理工學(xué)院的教授 Joseph Jacobson 創(chuàng)立 E_Ink 公司,開始推動電子紙技術(shù)走向商業(yè)化,電子墨水技術(shù)成為電子紙的主流。
電子墨水與印刷使用的墨水很相似,都是用顏料所制,這也是為什么我們看到電子墨水屏和傳統(tǒng)紙張顯示效果相似的原因。電子墨水通常會制成薄膜,由大量微膠囊﹙microcapsules﹚組成,這些微膠囊只有人類頭發(fā)的直徑大小。微膠囊中的黑白小球是帶不同電荷的色素顆粒,初始狀態(tài)下,色素顆粒懸浮在微膠囊中,當(dāng)施加一定方向的電場后,相應(yīng)的色素顆粒被推到頂部,微膠囊就會顯示不同的顏色,而不同顏色的微膠囊組成了各種文字和圖案。電子紙顯示屏是靠反射環(huán)境光來顯示圖案的,不需要背光,即使是在陽光底下,電子紙顯示屏依然清晰可視,可視角度幾乎達(dá)到了 180°。因此,電子紙顯示屏非常適合閱讀。

電子墨水屏基本結(jié)構(gòu)如下圖所示:

⒈上層;⒉透明電極層;⒊透明微膠囊;⒋帶正電荷的白色顏料;⒌帶負(fù)電荷的黑色顏料;⒍透明液體(油);⒎電極像素層;⒏基板;⒐光線;⒑白色;⒒黑色。
電子墨水屏是由許多電子墨水組成,它是融合化學(xué),物理和電子學(xué)的整體產(chǎn)生的一種新材料。電子墨水可以看成一個個膠囊的樣子(如上圖所示)。每一個膠囊(位置6)里面有液體電荷,其中正電荷染白色,負(fù)電荷染黑色。當(dāng)在一側(cè)(位置8)給予正負(fù)電壓,帶有電荷的液體就會被分別吸引和排斥。這樣,每一個像素點(diǎn)就可以顯示白色或者黑色了。因?yàn)殡娮幽乃⑿率遣贿B續(xù)的,每一次刷新完成就可以保持現(xiàn)在的圖形,即使拔掉電池也依舊保存,因?yàn)殡娮幽哂须p穩(wěn)態(tài)效應(yīng)(磁滯效應(yīng))。
電子墨水屏的優(yōu)點(diǎn):
1、省電(可用于低功耗場景)
2、護(hù)眼(未來很可能替代紙質(zhì)閱讀)
電子墨水屏當(dāng)前的缺點(diǎn):
1、目前主要只有黑白產(chǎn)品,彩色有三色(黑白紅)/(黑白黃)/4096色。
2、不能快速響應(yīng)一些動畫類需求。
3、彩色屏刷新過程中會閃屏。
4、成本高。

微雪的柔性墨水屏祼屏(黑白):
尺寸: 2.13 inch
工作電壓:3.3V/5V
通信接口SPI
點(diǎn)距:0.229* 0.228
分辨率:212*104
顯示顏色:黑、白
灰度等級:2
局部刷新 :0.3s
全局刷新 :2s
注意事項(xiàng)(摘自微雪):
1. 支持局刷的屏幕,注意使用的時候不能一直用局刷對屏幕進(jìn)行刷新,需要在做幾次局刷之后,對屏幕進(jìn)行一次全刷清屏。否則會造成屏幕顯示效果異常,無法修復(fù)。
2. 三色的墨水屏,建議將屏幕刷白朝上存放,使用前,先上電做幾次刷白操作。
3. 注意屏幕不能長時間上電,在屏幕不刷新的時候,要將屏幕設(shè)置成睡眠模式,或者進(jìn)行斷電處理。否則屏幕長時間保持高電壓狀態(tài),會損壞膜片,無法修復(fù)。
4. 使用墨水屏的時候,建議刷新時間間隔至少是 180s, 并且至少每 24 小時做一次刷新,如果長期不使用墨水屏的話,要將墨水屏刷白存放。
5. 屏幕進(jìn)入睡眠模式之后,會忽略發(fā)送的圖片數(shù)據(jù),只有重新初始化才能正常刷新。
6. 屏幕的 FPC 排線比較脆弱,注意使用的時候沿屏幕水平方向彎曲排線,不可以沿屏幕垂直方向彎曲排線。
7. 墨水屏屏幕較為脆弱,注意盡量避免跌落,碰撞,用力按壓。

DF~FireBeetle 三色電子墨水屏(黑白紅)
工作電壓:3.3V
數(shù)據(jù)總線:SPI
顏色:黑白紅三色
屏幕尺寸:2.13 inch
像素:212×104
刷新時間:12~15s 背面(下角白色方塊與微控制器上一致,是防呆防反插標(biāo)志喲^_^):

DF~FireBeetle 低功耗系列之一螢火蟲 ESP32微控制器 (支持WiFi&Bluetooth)
可以較方便地控制FireBeetle電子墨水屏。

DF為FireBeetle(三色)電子墨水屏提供的API列表:

#include "DFRobot_IL0376F_SPI.h"
DFRobot_IL0376F_SPI eink; //創(chuàng)建一個ePaper對象

函數(shù)功能:設(shè)定字庫和墨水屏片選引腳并初始化。
void begin(const char cs_W21, const char cs_GT30, const char dc, busy);

函數(shù)功能:清除屏幕為指定顏色。
InkScreen_Error clear(uint8_t color);

函數(shù)功能:顯示圖片(212*104),可以是紅色、黑白、紅白黑三色圖片。
void drawPicture(const unsigned char *pic_bw, const unsigned char *pic_red);

函數(shù)功能:刷新屏幕顯示。
void flush(void);

函數(shù)功能:顯示字符串。
void disString(uint8_t x, uint8_t y, char *ch, uint8_t color);

函數(shù)功能:畫點(diǎn)。
InkScreen_Error drawPoint(const unsigned char x, const unsigned char y, const unsigned char color);

函數(shù)功能:畫線。
InkScreen_Error drawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color);

函數(shù)功能:畫矩形框。
InkScreen_Error drawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color)

函數(shù)功能:畫圓形邊框或者填充圓形。
InkScreen_Error drawFillRect(uint16_t x1, uint16_t y1, uint16_t width, uint16_t length, uint8_t color);

參數(shù)1 (xc,yc): 圓心坐標(biāo) (xc∈(0,211),yc∈(0,103)。
InkScreen_Error drawCircle(uint16_t xc, uint16_t yc, uint16_t r, uint16_t fill, uint8_t color);

結(jié)合例程及上API對電子墨水屏~IoT貨架標(biāo)簽進(jìn)行界面布局:
主要是在程序中對各種元素進(jìn)行坐標(biāo)定位、字號選擇、顏色確定、圖形繪制等。

測試電子墨水屏程序(Arduino):

[C++] 純文本查看 復(fù)制代碼

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

/*!* 08/19/2019測試電子墨水屏程序 * from file FigureDemo.ino* 分辨率:212*104

*/

#include "Arduino.h"

#include "DFRobot_IL0376F_SPI.h"

#define STOCK_PIN A2 // 這里可以利用環(huán)境光線傳感器收集數(shù)據(jù)模擬商品“美福記”庫存狀態(tài)變化

DFRobot_IL0376F_SPI epaper;

#define EPAPER_CS D3

#define Font_CS D6

#define EPAPER_DC D8

#define EPAPER_BUSY D7

char foodName[]="";

float price = 0.0;

int stock_per = 100;

void setup(void)

{

Serial.begin(115200);

//Select the corresponding pins

epaper.begin(EPAPER_CS, Font_CS, EPAPER_DC, EPAPER_BUSY);

}

void loop(void)

{

epaper.fillScreen(WHITE);

//Displays a string, black font

epaper.disString(1,5, 2,"食",BLACK);

epaper.disString(1,45, 2,"品",BLACK);

epaper.disString(0,83, 1,"FOOD",BLACK);

//Let me draw 2 red dotLines

for(uint8_t x=33,y=0; y<103; y+=2)

{

epaper.drawPixel(x,y,RED);

epaper.drawPixel(x+1,y,RED);

}

epaper.disString(35,1, 1,"品名:",BLACK);

epaper.disString(35,18, 1,"Name",BLACK);

epaper.disString(35,35, 1,"價格:",BLACK);

epaper.disString(35,52, 1,"Price",BLACK);

epaper.disString(35,69, 1,"庫存:",BLACK);

epaper.disString(35,86, 1,"Stock",BLACK);

epaper.disString(78,1, 1,"美福記",RED);

epaper.disString(78,30, 2,"29.8",RED);

epaper.disString(140,45, 1,"¥/Kg",RED);

epaper.disString(185,1, 1,"20%",RED);

// Draw a down arrow

epaper.fillRect(191,18, 12,40,RED);

epaper.fillTriangle(184,50, 210,50, 197,70,RED);

//Draw a black rectangle(x,y,l,r,c)

epaper.drawRoundRect(75,75, 135,23,8,BLACK);

epaper.drawRoundRect(76,76, 133,21,8,WHITE);

epaper.drawRoundRect(77,77, 131,19,8,WHITE);

stock_per =map(analogRead(A2),0,1023,0,100);

epaper.fillRoundRect(78,78, 129*stock_per/100,17,7,RED);

epaper.disString(185,1, 1,"20%",RED);

//Refresh screen display

epaper.flush();

delay(10000);

}

測試IoT程序(ARDUINO):

[C++] 純文本查看 復(fù)制代碼

?

001002003

004

005

006

007

008

009

010

011

012

013

014

015

016

017

018

019

020

021

022

023

024

025

026

027

028

029

030

031

032

033

034

035

036

037

038

039

040

041

042

043

044

045

046

047

048

049

050

051

052

053

054

055

056

057

058

059

060

061

062

063

064

065

066

067

068

069

070

071

072

073

074

075

076

077

078

079

080

081

082

083

084

085

086

087

088

089

090

091

092

093

094

095

096

097

098

099

100

101

102

103

104

105

106

107

108

109

110

111

112

#include <WiFi.h>#include <PubSubClient.h>#include <ArduinoJson.h>

#include "DFRobot_Aliyun.h"

#include "DFRobot_DHT11.h"

#define DHT11_PIN D2 //定義傳感器引腳,用于收集數(shù)據(jù)模擬庫存數(shù)據(jù)

/*配置WIFI名和密碼*/

const char * WIFI_SSID = "your ssid";

const char * WIFI_PASSWORD = "your password";

/*配置設(shè)備證書信息*/

String ProductKey = "xxxxxxxxxx";

String ClientId = "12345";

String DeviceName = "STOCK";

String DeviceSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxx";

/*配置域名和端口號*/

String ALIYUN_SERVER = "iot-as-mqtt.cn-shanghai.aliyuncs.com";

uint16_t PORT = 1883;

/*需要操作的產(chǎn)品標(biāo)識符(溫度和濕度兩個標(biāo)識符)*/

String TempIdentifier = "xxxxxxx";

String HumiIdentifier = "xxxxxxxx";

/*需要上報和訂閱的兩個TOPIC*/

const char * subTopic = "xxxxxxxxxxxxxxxxxxxxxxxxx/property/set";//****set

const char * pubTopic = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/property/post";//******post

DFRobot_Aliyun myAliyun;

WiFiClient espClient;

PubSubClient client(espClient);

DFRobot_DHT11 DHT;

void connectWiFi(){

Serial.print("Connecting to ");

Serial.println(WIFI_SSID);

WiFi.begin(WIFI_SSID,WIFI_PASSWORD);

while(WiFi.status() != WL_CONNECTED){

delay(500);

Serial.print(".");

}

Serial.println();

Serial.println("WiFi connected");

Serial.print("IP Adderss: ");

Serial.println(WiFi.localIP());

}

void callback(char * topic, byte * payload, unsigned int len){

Serial.print("Recevice [");

Serial.print(topic);

Serial.print("] ");

for (int i = 0; i < len; i++){

Serial.print((char)payload[i]);[/i]

[i] }[/i]

[i] Serial.println();[/i]

[i]}[/i]

[i]void ConnectAliyun(){[/i]

[i] while(!client.connected()){[/i]

[i] Serial.print("Attempting MQTT connection...");[/i]

[i] /*根據(jù)自動計(jì)算的用戶名和密碼連接到Alinyun的設(shè)備,不需要更改*/[/i]

[i] if(client.connect(myAliyun.client_id,myAliyun.username,myAliyun.password)){[/i]

[i] Serial.println("connected");[/i]

[i] client.subscribe(subTopic);[/i]

[i] }else{[/i]

[i] Serial.print("failed, rc=");[/i]

[i] Serial.print(client.state());[/i]

[i] Serial.println(" try again in 5 seconds");[/i]

[i] delay(5000);[/i]

[i] }[/i]

[i] }[/i]

[i]}[/i]

[i]void setup(){[/i]

[i] Serial.begin(115200);[/i]

[i] /*連接WIFI*/[/i]

[i] connectWiFi();[/i]

[i] /*初始化Alinyun的配置,可自動計(jì)算用戶名和密碼*/[/i]

[i] myAliyun.init(ALIYUN_SERVER,ProductKey,ClientId,DeviceName,DeviceSecret);[/i]

[i] client.setServer(myAliyun.mqtt_server,PORT);[/i]

[i] /*設(shè)置回調(diào)函數(shù),當(dāng)收到訂閱信息時會執(zhí)行回調(diào)函數(shù)*/[/i]

[i] client.setCallback(callback);[/i]

[i] /*連接到Aliyun*/[/i]

[i] ConnectAliyun();[/i]

[i]}[/i]

[i]uint8_t tempTime = 0;[/i]

[i]void loop(){[/i]

[i] if(!client.connected()){[/i]

[i] ConnectAliyun();[/i]

[i] }[/i]

[i] /*一分鐘上報兩次溫濕度(模擬福美記和福美佳兩種商品的庫存狀態(tài)數(shù)據(jù))信息*/[/i]

[i] if(tempTime > 60){[/i]

[i] tempTime = 0;[/i]

[i] DHT.read(DHT11_PIN);[/i]

[i] Serial.print("DHT.temperature=");[/i]

[i] Serial.println(DHT.temperature);[/i]

[i] Serial.print("DHT.humidity=");[/i]

[i] Serial.println(DHT.humidity);[/i]

[i] client.publish(pubTopic,("{"id":"+ClientId+","params":{""+TempIdentifier+"":"+DHT.temperature+",""+HumiIdentifier+"":"+DHT.humidity+"},"method":"thing.event.property.post"}").c_str());[/i]

[i] }else{[/i]

[i] tempTime++;[/i]

[i] delay(500);[/i]

[i] }[/i]

[i] client.loop();[/i]

[i]}

利用阿里云生成安卓APP:
本應(yīng)用采取 DHT11 溫濕度傳感器獲取環(huán)境溫度和濕度模擬商品庫存狀態(tài),并將數(shù)據(jù)傳輸給手機(jī) App 顯示,從而實(shí)現(xiàn)遠(yuǎn)程實(shí)時監(jiān)控庫存的功能。
應(yīng)用目標(biāo):通過手機(jī) App 實(shí)時監(jiān)測超市商品庫存情況。
所需元件:
DHT11 溫濕度傳感器 x1
FireBettle Board-ESP32 x1
FireBettle Gravity 擴(kuò)展板 x1
DHT11x1
智能手機(jī) x1
硬件連接:
把 FireBettle Gravity 擴(kuò)展板直插在 FireBettle Board-ESP32 主板上,再把 DHT11 溫濕
度模塊接在擴(kuò)展板的 D2 數(shù)字引腳上,確保電源引腳、接地引腳和信號引腳都連接正確。
按以下我親自成功的步驟進(jìn)行即可:(或者參考官方教程
1.打開瀏覽器,輸入網(wǎng)址 https://iot.aliyun.com,登錄并進(jìn)入物聯(lián)網(wǎng)平臺.
2.創(chuàng)建一個名為“庫存監(jiān)測”的產(chǎn)品,如下圖所示,若產(chǎn)品創(chuàng)建成功,會自動出現(xiàn)在產(chǎn)品列表中;

3. 為庫存監(jiān)測產(chǎn)品定義功能名分別為“美福記”和“美福佳”的屬性,自定義產(chǎn)品標(biāo)識符,美福記取值范圍為0~100,美福佳為 0~100,如下圖所示。功能添加完畢后,會自動出現(xiàn)在自定義功能欄下。

4.為庫存監(jiān)測產(chǎn)品添加一個名為 STOCK 的設(shè)備,如下圖所示,設(shè)備添加完畢后,會自動出現(xiàn)在設(shè)備列表中。

5.將庫存監(jiān)測產(chǎn)品導(dǎo)入“我的智能云家庭管理”項(xiàng)目中,如下圖所示:

6.創(chuàng)建移動應(yīng)用開發(fā)APP:
選中左側(cè)導(dǎo)航欄的移動應(yīng)用開發(fā)在右側(cè)單擊打開“新增可視化應(yīng)用”,如下圖所示:

7.點(diǎn)擊自定義頁面后的+號,編輯,將“自定義新增頁 1”改為庫存監(jiān)測,用鼠標(biāo)將可視化組建下的實(shí)時曲線控件拖動到中間的頁面上,如下圖所示:

8.選中其中一個實(shí)時曲線,點(diǎn)擊數(shù)據(jù)->配置數(shù)據(jù),在彈出的選項(xiàng)框里選擇相應(yīng)的選項(xiàng),并點(diǎn)擊確定。

9.修改樣式,常常保存。

10.配置首頁模塊。這一步是為了設(shè)置一個導(dǎo)航欄,鏈接到上面設(shè)計(jì)的“庫存監(jiān)測”。選中[功能]首頁模塊->列表,如下圖所示,選中新增頁面入口,在彈出的“頁面入口 1”下,完成相應(yīng)信息的選擇,將其鏈接到剛才設(shè)計(jì)的“庫存監(jiān)測“頁面,如下圖所示,點(diǎn)擊確定完成配置后,別忘了點(diǎn)擊保存。

11.安裝包生成。在編輯頁面,點(diǎn)擊構(gòu)建,選擇 Andriod 構(gòu)建或 iOS 發(fā)構(gòu)建,如下圖所示:

12.手機(jī)掃碼,APP到手了!

13.我定義的APP~“IoT標(biāo)簽”界面:

以上測試程序合并為最終程序(ARDUINO):

[C++] 純文本查看 復(fù)制代碼

?

001002003

004

005

006

007

008

009

010

011

012

013

014

015

016

017

018

019

020

021

022

023

024

025

026

027

028

029

030

031

032

033

034

035

036

037

038

039

040

041

042

043

044

045

046

047

048

049

050

051

052

053

054

055

056

057

058

059

060

061

062

063

064

065

066

067

068

069

070

071

072

073

074

075

076

077

078

079

080

081

082

083

084

085

086

087

088

089

090

091

092

093

094

095

096

097

098

099

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

#include "Arduino.h"#include <WiFi.h>#include <PubSubClient.h>

#include <ArduinoJson.h>

#include "DFRobot_Aliyun.h"

#include "DFRobot_DHT11.h"

#include "DFRobot_IL0376F_SPI.h"

/////////////////////////////////////////////

DFRobot_IL0376F_SPI epaper;

#define DHT11_PIN D2 //定義傳感器引腳,用于收集數(shù)據(jù)模擬庫存數(shù)據(jù)

#define EPAPER_CS D3 //定義電子墨水屏相關(guān)

#define Font_CS D6

#define EPAPER_DC D8

#define EPAPER_BUSY D7

//////////////////////////////////////////////

/*配置WIFI名和密碼*/

const char * WIFI_SSID = "XXXXXXX";

const char * WIFI_PASSWORD = "XXXXXXXXXX";

/*配置設(shè)備證書信息*/

String ProductKey = "XXXXXXXXXXX";

String ClientId = "12345";

String DeviceName = "STOCK";

String DeviceSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

/*配置域名和端口號*/

String ALIYUN_SERVER = "iot-as-mqtt.cn-shanghai.aliyuncs.com";

uint16_t PORT = 1883;

/*需要操作的產(chǎn)品標(biāo)識符(溫度和濕度兩個標(biāo)識符)*/

String TempIdentifier = "meifuji";

String HumiIdentifier = "meifujia";

/*需要上報和訂閱的兩個TOPIC*/

const char * subTopic = "/sys/XXXXXXXXXXX/STOCK/thing/service/property/set";//****set

const char * pubTopic = "/sys/XXXXXXXXXXX/STOCK/thing/event/property/post";//******post

DFRobot_Aliyun myAliyun;

WiFiClient espClient;

PubSubClient client(espClient);

DFRobot_DHT11 DHT;

///////////////////////////////////////////////

void connectWiFi(){

Serial.print("Connecting to ");

Serial.println(WIFI_SSID);

WiFi.begin(WIFI_SSID,WIFI_PASSWORD);

while(WiFi.status() != WL_CONNECTED){

delay(500);

Serial.print(".");

}

Serial.println();

Serial.println("WiFi connected");

Serial.print("IP Adderss: ");

Serial.println(WiFi.localIP());

}

///////////////////////////////////////////////

void callback(char * topic, byte * payload, unsigned int len){

Serial.print("Recevice [");

Serial.print(topic);

Serial.print("] ");

for (int i = 0; i < len; i++){

Serial.print((char)payload[i]);[/i]

}

Serial.println();

}

///////////////////////////////////////////////

void ConnectAliyun(){

while(!client.connected()){

Serial.print("Attempting MQTT connection...");

/*根據(jù)自動計(jì)算的用戶名和密碼連接到Alinyun的設(shè)備,不需要更改*/

if(client.connect(myAliyun.client_id,myAliyun.username,myAliyun.password)){

Serial.println("connected");

client.subscribe(subTopic);

}else{

Serial.print("failed, rc=");

Serial.print(client.state());

Serial.println(" try again in 5 seconds");

delay(5000);

}

}

}

///////////////////////////////////////////////////

void setup(){

Serial.begin(115200);

//Select the corresponding pins

epaper.begin(EPAPER_CS, Font_CS, EPAPER_DC, EPAPER_BUSY);

/*連接WIFI*/

connectWiFi();

/*初始化Alinyun的配置,可自動計(jì)算用戶名和密碼*/

myAliyun.init(ALIYUN_SERVER,ProductKey,ClientId,DeviceName,DeviceSecret);

client.setServer(myAliyun.mqtt_server,PORT);

/*設(shè)置回調(diào)函數(shù),當(dāng)收到訂閱信息時會執(zhí)行回調(diào)函數(shù)*/

client.setCallback(callback);

/*連接到Aliyun*/

ConnectAliyun();

}

//////////////////////////////////////////////////

uint8_t tempTime = 0;

uint8_t stock_per = 100;

void loop(){

if(!client.connected()){

ConnectAliyun();

}

/*上報溫濕度(模擬福美記和福美佳兩種商品的庫存狀態(tài)數(shù)據(jù))信息*/

DHT.read(DHT11_PIN);

Serial.print("DHT.temperature= ");

Serial.println(DHT.temperature);

Serial.print("DHT.humidity= ");

Serial.println(DHT.humidity);

client.publish(pubTopic,("{"id":"+ClientId+","params":{""+TempIdentifier+"":"+DHT.temperature+",""+HumiIdentifier+"":"+DHT.humidity+"},"method":"thing.event.property.post"}").c_str());

client.loop();

/*借用DH11傳感器的溫度數(shù)據(jù)顯示福美記商品的庫存狀態(tài)信息*/

stock_per = DHT.temperature;

epaper.fillScreen(WHITE);

//Displays a string, black font

epaper.disString(1,5, 2,"食",BLACK);

epaper.disString(1,45, 2,"品",BLACK);

epaper.disString(0,83, 1,"FOOD",BLACK);

//Let me draw 2 red dotLines

for(uint8_t x=33,y=0; y<103; y+=2)

{

epaper.drawPixel(x,y,RED);

epaper.drawPixel(x+1,y,RED);

}

epaper.disString(35,1, 1,"品名:",BLACK);

epaper.disString(35,18, 1,"Name",BLACK);

epaper.disString(35,35, 1,"價格:",BLACK);

epaper.disString(35,52, 1,"Price",BLACK);

epaper.disString(35,69, 1,"庫存:",BLACK);

epaper.disString(35,86, 1,"Stock",BLACK);

epaper.disString(78,1, 1,"美福記",RED);

epaper.disString(78,30, 2,"29.8",RED);

epaper.disString(140,45, 1,"¥/Kg",RED);

epaper.disString(185,1, 1,"20%",RED);

// Draw a down arrow

epaper.fillRect(191,18, 12,40,RED);

epaper.fillTriangle(184,50, 210,50, 197,70,RED);

//Draw a black rectangle(x,y,l,r,c)

epaper.drawRoundRect(75,75, 135,23,8,BLACK);

epaper.drawRoundRect(76,76, 133,21,8,WHITE);

epaper.drawRoundRect(77,77, 131,19,8,WHITE);

epaper.fillRoundRect(78,78, 129*stock_per/100,17,7,RED);

epaper.disString(185,1, 1,"20%",RED);

//Refresh screen display

epaper.flush();

delay(12000);

}

運(yùn)行代碼串口顯示溫度(庫存)28:

再看電子墨水屏顯示庫存(指紅色部分約28%):

  • arduino.txt
    描述:arduino

相關(guān)推薦

電子產(chǎn)業(yè)圖譜