【教程分享】Arduino uno R3接入機智雲,快速實現智能設備開發

【教程分享】Arduino接入機智雲,實現物聯網開發html

 

 
準備工做:
  • 1.雲端數據點建立。
  • 2.Ardunio UNO R3一塊,某寶10來塊錢一塊。
  • 3.ESP12F(32Mbit)一個(須要給模塊下載GAgent固件,固件下載,按照文件裏面地址對應下載,固件下載地址http://goms-1251025085.cosgz.myqcloud.com/GAgent_00ESP826_04020029-1524657141995.rar
  • 4.2.DHT11
  • 5.RGB_LED(共陰)
  • 6.微動開關
  • 7. 5V繼電器一個
接線方法:
  • Ardunio      esp8266
  • Txd              Rxd
  • Rxd              Txd
  • 3.3V              VCC
  • Gnd              Gng

  • Ardunio      RGB_LED
  • pin9                  R
  • pin10                G
  • pin11                B
  • GND             COM

  • Ardunio      DHT11
  • A0               data
  • 5V               VCC
  • Gnd             Gng

  • Ardunio      繼電器
  • pin2             in
  • 5V                VCC
  • Gnd              Gng

  • Ardunio      LED
  • 5V               陽極
  • pin3            陰極

  • Ardunio      按鍵
  • A4                K1
  • A5                K2



教程開始


建立完全部數據點以後。點擊MCU開發,按照下圖完成設置以後生成ardunio uno r3代碼。生成好代碼以後下載代碼
<ignore_js_op>
解壓代碼,導入到項目到開發環境之中(須要把文件解壓到軟件的庫目錄下,不然會編譯不過)
<ignore_js_op>
導入項目以後修改程序,對於程序介紹,此處我挑重點,其他代碼請自行下載附件查看。爲了方便查看增長的代碼,這個地方我就再也不增長庫,而是所有用驅動的方式來實現。


首先來看一下DHT11。咱們使用的是A0引腳,也就是第PC5引腳,驅動pin14代碼以下
  1. int temp;//溫度
  2. int humi;//溼度
  3. int tol;//校對碼
  4. int j;
  5. unsigned int loopCnt;
  6. int chr[40] = {0};//建立數字數組,用來存放40個bit
  7. unsigned long time;
  8. #define DHT11 14
  9. //溫溼度採集
  10. void read_dht11()
  11. {
  12.   //delay(1000);//注意採集間隔應該大於1秒
  13.   //設置19號接口模式爲:輸出
  14.   //輸出低電平20ms(>18ms)
  15.   //輸出高電平40μs
  16.   pinMode(DHT11,OUTPUT);
  17.   digitalWrite(DHT11,LOW);
  18.   delay(20);
  19.   digitalWrite(DHT11,HIGH);
  20.   delayMicroseconds(40);
  21.   digitalWrite(DHT11,LOW);
  22.   //設置2號接口模式:輸入
  23.   pinMode(DHT11,INPUT);
  24.   //高電平響應信號
  25.   loopCnt=10000;
  26.   while(digitalRead(DHT11) != HIGH)
  27.   {
  28.     if(loopCnt-- == 0)
  29.     {
  30.           //若是長時間不返回高電平,跳出程序。
  31.       break;
  32.     }
  33.   }
  34.   //低電平響應信號
  35.   loopCnt=30000;
  36.   while(digitalRead(DHT11) != LOW)
  37.   {
  38.     if(loopCnt-- == 0)
  39.     {
  40.     //若是長時間不返回低電平,跳出程序。
  41.       break;
  42.     }
  43.   }
  44.   //開始讀取bit1-40的數值  
  45.     for(int i=0;i<40;i++)
  46.   {
  47.     while(digitalRead(DHT11) == LOW)
  48.     {}
  49.           //當出現高電平時,記下時間「time」
  50.     time = micros();
  51.     while(digitalRead(DHT11) == HIGH)
  52.     {}
  53. //當出現低電平,記下時間,再減去剛纔儲存的time
  54. //得出的值若大於50μs,則爲‘1’,不然爲‘0’
  55. //並儲存到數組裏去
  56.     if (micros() - time >50)
  57.     {
  58.       chr=1;
  59.     }else{
  60.       chr=0;
  61.     }
  62.   }
  63.     //溼度,8位的bit,轉換爲數值
  64.     humi=chr[0]*128+chr[1]*64+chr[2]*32+chr[3]*16+chr[4]*8+chr[5]*4+chr[6]*2+chr[7];
  65.     //溫度,8位的bit,轉換爲數值
  66.     temp=chr[16]*128+chr[17]*64+chr[18]*32+chr[19]*16+chr[20]*8+chr[21]*4+chr[22]*2+chr[23];
  67.     //校對碼,8位的bit,轉換爲數值
  68.     tol=chr[32]*128+chr[33]*64+chr[34]*32+chr[35]*16+chr[36]*8+chr[37]*4+chr[38]*2+chr[39];
  69.     //輸出:溫度、溼度、校對碼
  70.     //校對碼,我這裏沒用上
  71.     //理論上,溼度+溫度=校對碼
  72.     //若是數值不相等,說明讀取的數據有錯。  
  73.    bgn;//跳出程序,多是沒查DHT11可修改爲報警或者故障
  74. }
複製代碼
 
接下來修改按鍵,按鍵要把管腳修改過去,按鍵的管腳分別是A4 A5 對應18  19,修改事後:
  1. #define   KEY1              18
  2. #define   KEY2              19
  3. bool led = 0;//LED狀態,控制的時候進行取反
  4. bool gdq = 0;//繼電器狀態控制的時候進行取反
複製代碼
同時修改長短按鍵。
  1. void KEY_Handle(void)
  2. {
  3.   /*  Press for over than 3 second is Long Press  */
  4.   switch (gokit_keydown())
  5.   {
  6.       case KEY1_SHORT_PRESS:
  7.       if(led)
  8.       {
  9.         led=0;
  10.         mySerial.println(F("KEY1_SHORT_PRESS LED OFF"));
  11.       }
  12.         else
  13.         {
  14.           led=1;
  15.           mySerial.println(F("KEY1_SHORT_PRESS LED ON"));
  16.         }
  17.       break;
  18.     case KEY1_LONG_PRESS:
  19.       mySerial.println(F("KEY1_LONG_PRESS Soft AP mode"));
  20.       myGizwits.setBindMode(WIFI_SOFTAP_MODE);
  21.       //Soft AP mode
  22.       break;
  23.     case KEY2_SHORT_PRESS:
  24.       if(gdq)
  25.       {
  26.         gdq=0;
  27.         mySerial.println(F("KEY2_SHORT_PRESS LED OFF"));
  28.       }
  29.         else
  30.         {
  31.           gdq=1;
  32.           mySerial.println(F("KEY2_SHORT_PRESS LED ON"));
  33.         }
  34.       break;
  35.     case KEY2_LONG_PRESS:
  36.       mySerial.println(F("KEY2_LONG_PRESS ,AirLink mode"));
  37.       myGizwits.setBindMode(WIFI_AIRLINK_MODE);
  38.       //AirLink mode
  39.       break;
  40.     default:
  41.       break;
  42.   }
  43. }
複製代碼
到此按鍵就修改完了,接下來修改用戶處理函數,沒安裝notepad++的最好安裝一個,用記事本也行,我的習慣用notepad++。修改其餘代碼須要用到。利用
notepad++打開
gizwits_protocol.h文件,修改數據上報時間爲1秒或者2秒,此處我修改成2秒#define REPORT_TIME_MAX 2000 //2S,打開gizwits_product.c文件,裏面絕大部分程序思惟按照類上一篇帖子的思惟進行修改。
將如下內容補充完整。在gizwits_product.c裏面

  1. case EVENT_switch_led:
  2.         currentDataPoint.valueswitch_led = dataPointPtr->valueswitch_led;
  3.         attrFlags.flagswitch_led = 1;
  4.                 if(0x01 == currentDataPoint.valueswitch_led)
  5.                 {
  6.                         led=1;//打開大功率LED
  7.                 }
  8.                 else
  9.                 {
  10.                         led=0;//關閉大功率LED
  11.                 }
  12.         break;
  13.       case EVENT_switch_relay:
  14.         currentDataPoint.valueswitch_relay = dataPointPtr->valueswitch_relay;
  15.         attrFlags.flagswitch_relay = 1;
  16.                 if(0x01 == currentDataPoint.valueswitch_led)
  17.                 {
  18.                         gdq=1;//打開繼電器
  19.                 }
  20.                 else
  21.                 {
  22.                         gdq=0;//關閉繼電器
  23.                 }               
  24.         break;
  25.       case EVENT_color_controls:
  26.         currentDataPoint.valuecolor_controls = dataPointPtr->valuecolor_controls;
  27.         attrFlags.flagcolor_controls = 1;
  28.                 mode_Cloud_data[0]=currentDataPoint.valuecolor_controls;
  29.         break;
  30.       case EVENT_LED_R:
  31.         currentDataPoint.valueLED_R = dataPointPtr->valueLED_R;
  32.         attrFlags.flagLED_R = 1;
  33.                 mode_Cloud_data[1]=currentDataPoint.valueLED_R;//紅色值
  34.                 if(mode_Cloud_data[1]!=1)mode_Cloud_data[0]=1;//自定義
  35.         break;
  36.       case EVENT_LED_G:
  37.         currentDataPoint.valueLED_G = dataPointPtr->valueLED_G;
  38.         attrFlags.flagLED_G = 1;
  39.                 mode_Cloud_data[2]=currentDataPoint.valueLED_G;//綠色值
  40.                 if(mode_Cloud_data[2]!=1)mode_Cloud_data[0]=1;//自定義
  41.         break;
  42.       case EVENT_LED_B:
  43.         currentDataPoint.valueLED_B = dataPointPtr->valueLED_B;
  44.         attrFlags.flagLED_B = 1;
  45.                 mode_Cloud_data[3]=currentDataPoint.valueLED_B;//藍色值
  46.                 if(mode_Cloud_data[0]!=1)mode_Cloud_data[0]=1;//自定義
  47.         break;
複製代碼
在文件開頭全局一個int mode_Cloud_data[4]={0};//雲端數據緩存  0模式 1R 2G 3B


接下來回到Ardunio軟件,增長RGB驅動函數。
定義管腳
  1. int redPin = 9 ;
  2. int greenPin = 10;
  3. int bluePin = 11;
  4. 初始化
  5.   pinMode(redPin ,OUTPUT);
  6.   pinMode(greenPin ,OUTPUT);
  7.   pinMode(bluePin ,OUTPUT);
  8. RGB控制函數
  9. //rgb控制
  10. void RGB_light_set_color(int red,int green,int blue)
  11. {
  12.     analogWrite(redPin,red);
  13.     analogWrite(greenPin,green);
  14.     analogWrite(bluePin,blue);
  15. }
複製代碼
接下來咱們須要新增用戶處理的函數
  1. //用戶處理函數
  2. void setsystem()
  3. {
  4.   if(led) digitalWrite(LED_SW,LOW);
  5.     else digitalWrite(LED_SW,HIGH);
  6.   if(gdq) digitalWrite(GDQ_SW,LOW);
  7.     else digitalWrite(GDQ_SW,HIGH);
  8.   switch(mode_Cloud_data[0])
  9.   {
  10.     case 0 :
  11.       RGB_light_set_color(0,0,0);//關閉燈
  12.       currentDataPoint.valuecolor_controls = 0;
  13.       currentDataPoint.valueLED_R = 0;
  14.       currentDataPoint.valueLED_G = 0;
  15.       currentDataPoint.valueLED_B = 0;
  16.       break;
  17.     case 1 :
  18.       RGB_light_set_color(mode_Cloud_data[1],mode_Cloud_data[2],mode_Cloud_data[3]);//自定義
  19.       currentDataPoint.valuecolor_controls = 1;
  20.       currentDataPoint.valueLED_R = mode_Cloud_data[1];
  21.       currentDataPoint.valueLED_G = mode_Cloud_data[2];
  22.       currentDataPoint.valueLED_B = mode_Cloud_data[3];
  23.       break;
  24.     case 2 :
  25.       RGB_light_set_color(255,0,0);//紅色
  26.       currentDataPoint.valuecolor_controls = 2;
  27.       currentDataPoint.valueLED_R = 255;
  28.       currentDataPoint.valueLED_G = 0;
  29.       currentDataPoint.valueLED_B = 0;
  30.       break;
  31.     case 3 :
  32.       RGB_light_set_color(0,255,0);//綠色
  33.       currentDataPoint.valuecolor_controls = 3;
  34.       currentDataPoint.valueLED_R = 0;
  35.       currentDataPoint.valueLED_G = 255;
  36.       currentDataPoint.valueLED_B = 0;
  37.       break;
  38.     case 4 :
  39.       RGB_light_set_color(0,0,255);//藍色
  40.       currentDataPoint.valuecolor_controls = 4;
  41.       currentDataPoint.valueLED_R = 0;
  42.       currentDataPoint.valueLED_G = 0;
  43.       currentDataPoint.valueLED_B = 255;
  44.       break;
  45.     case 5 :
  46.       RGB_light_set_color(255,255,0);//黃色
  47.       currentDataPoint.valuecolor_controls = 5;
  48.       currentDataPoint.valueLED_R = 255;
  49.       currentDataPoint.valueLED_G = 255;
  50.       currentDataPoint.valueLED_B = 0;
  51.       break;
  52.     case 6 :
  53.       RGB_light_set_color(255,0,255);//紫色
  54.       currentDataPoint.valuecolor_controls = 6;
  55.       currentDataPoint.valueLED_R = 255;
  56.       currentDataPoint.valueLED_G = 0;
  57.       currentDataPoint.valueLED_B = 255;
  58.       break;
  59.     case 7 :
  60.       RGB_light_set_color(255,52,179);//粉色(估計不是粉色)
  61.       currentDataPoint.valuecolor_controls = 7;
  62.       currentDataPoint.valueLED_R = 255;
  63.       currentDataPoint.valueLED_G = 52;
  64.       currentDataPoint.valueLED_B = 179;
  65.       break;
  66.     case 8 :
  67.       RGB_light_set_color(255,255,255);//白色
  68.       currentDataPoint.valuecolor_controls = 8;
  69.       currentDataPoint.valueLED_R = 255;
  70.       currentDataPoint.valueLED_G = 255;
  71.       currentDataPoint.valueLED_B = 255;
  72.       break;
  73.     default:
  74.       break;
  75.   }  
  76. }
複製代碼
將setsystem();函數放在loop裏面,同時吧DHT11
也放進去
  1.   setsystem();
  2.   read_dht11();
  3.   currentDataPoint.valuetemperature = temp;
  4.   currentDataPoint.valuehumidity = humi;
複製代碼
相關文章
相關標籤/搜索