久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3132|回復: 0
打印 上一主題 下一主題
收起左側

STM32單片機wifi云平臺+溫度+煙霧+火焰+短信+蜂鳴器 源程序原理圖

  [復制鏈接]
跳轉到指定樓層
樓主
沒有仿真,但是程序跑實物運行了,可以借鑒部分代碼測試哦,附帶原理圖

1.     整體設計
設計由stm32f103c8t6單片機為控制核心

2.     液晶顯示
單片機通過iic接口(pa6、pa7)與oled12864的液晶顯示屏(scl、sda)連接,驅動液晶數據和閾值。

3.     Ds18b20溫度傳感器
Ds18b20溫度傳感器是單總線接口,把數據端接到單片機的pb9管腳,通過傳感器協議讀取溫度值。


4.     Mq2煙霧傳感器
Mq2傳感器輸出模電壓會隨著煙霧濃度的增大而增大。單片機通過模擬量采集管腳PA0采集mq2傳感器輸出的電壓值,然后單片機通過計算把0-vcc電壓轉化成0-100%煙霧濃度。


5.     火焰傳感器傳感器
火焰傳感器是數字量do輸出,當檢測到有明火時輸出低電平0,無明火時輸出高電平1。單片機通過io口pa6讀取火焰傳感器狀態。


6.     蜂鳴器驅動控制
如果蜂鳴器接電源3.3v和地,蜂鳴器有電就會發聲。1k電阻是限流電阻。單片機通過控制pa7管腳輸出高低電平,從而達到控制風扇轉動的效果。單片機輸出高電平1時,三極管導通,蜂鳴器接地,蜂鳴器響。輸出低電平0時,三極管截至不導通,蜂鳴器沒有接地,蜂鳴器不響。


7.     按鍵
單片機io口接按鍵,按鍵按下的接地。Io口讀取到低電平0,按鍵松開時,由于單片機有內置上拉電阻,Io口讀取到高電平1。其他兩個按鍵原理一樣。

8.     Gsm短信模塊
Sim900a gsm短信模塊是通過串口通訊的,將單片機串口1發送端pa9接到gsm模塊的接收端rxd,然后單片機通過at指令控制gsm模塊發送短信。

9.     Esp8266wifi模塊
8266是串口控制得模塊,單片機通過串口1(pa9和pa10)與wifi模塊通訊,從而控制wifi模塊工作。首先wifi模塊上電自動連接熱點,然后連接onenet云平臺得ip地址,通過mqtt協議登錄云平臺設備,訂閱app(訂閱了才能接收到app下發得信息)。單片機會定時上傳數據(以mcu得身份發布數據)到onenet云平臺,在app訂閱了mcu設備得前提下,云平臺接收到單片機上傳得數據后會自動轉發到app顯示。反之app下發數據過程也一樣。

單片機源程序如下:
  1. #include "stm32f10x.h" //頭文件
  2. #include "./usart/bsp_usart1.h"
  3. #include "./OLED_I2C/OLED_I2C.h"
  4. #include "./delay/delay.h"
  5. #include "adc.h"
  6. #include "string.h"
  7. #include "bsp_ds18b20.h"
  8. #include "./TIMER/timer.h"



  9. #define  Speaker   PAout(7)//pa7接蜂鳴器


  10. #define   Key1         PBin(12)//按鍵
  11. #define   Key2         PBin(13)//按鍵
  12. #define   Key3         PBin(14)//按鍵
  13. #define   HY         PAin(6)//火焰傳感器

  14. TIM_TimeBaseInitTypeDef  TIM3_TimeBaseStructure;  
  15. TIM_OCInitTypeDef  TIM3_OCInitStructure;

  16. void DelayStm32(__IO u32 nCount)
  17. {
  18.   for(; nCount != 0; nCount--);
  19. }
  20. u16 Time_1MS=0;
  21. u16 TX_10MS=0;
  22. u16 A0Value = 0; //煙霧值
  23. u16 Ds18b20Value; //溫度
  24. u16 Cnt=0;
  25. u8 AlarmT=35; //溫度閾值
  26. u8 AlarmM=60; //煙霧閾值

  27. char dispBuff[10];

  28. u8 FlagUpData = 0;
  29. u8 FlagFS = 0;       //風扇手動標志位
  30. u8 FlagDelayA = 0;  //繼電器手動標志位
  31. u8 StateDelayA = 0; //繼電器狀態
  32. u8 StateFS = 0;     //風扇狀態

  33. u8  Stm32[17];
  34. u16 KeyCnt = 0;
  35. u8 FlagSet=0; //按鍵設置標志位
  36. u8 FlagAlarm=0; //告警標志位
  37. u8 RxBuf1[32];
  38. u8 RxBuf2[32];
  39. u8 RxBuf3[32];  //串口3數據緩存
  40. u8 pass[11];

  41. /**********************MQTTdata***********************/
  42. char MqttDataDL[37]=
  43. {         
  44.         0x10, 0x23, 0x00, 0x04, 0x4D, 0x51, 0x54, 0x54, 0x04, 0xC0,
  45.         0x00, 0x78, 0x00, 0x0A, 0x31, 0x30, 0x36, 0x35, 0x36, 0x30,
  46.         0x31, 0x35, 0x35, 0x39, 0x00, 0x06, 0x35, 0x38, 0x39, 0x35,
  47.         0x35, 0x34, 0x00, 0x03, 0x6D, 0x63, 0x75
  48.                
  49. };//mqtt登錄數組

  50. char MqttDataDY[10]=
  51. {
  52.                 0x82, 0x08, 0x00, 0x02, 0x00, 0x03, 'a', 'p', 'p', 0x00
  53. };//mqtt訂閱數組

  54. char MqttDataFB[24]=
  55. {
  56.                 0x30, 0x16, 0x00, 0x03, 0x6D, 0x63, 0x75, 0x06, 0x06, 0x06,
  57.                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  58.                 0x00, 0x00, 0x00, 0x00
  59. };//mqtt發布數組

  60. void SendASC1(u8 d) //串口1發送一個字節
  61. {
  62.         USART_SendData(USART1, d);
  63.         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);                                
  64. }

  65. void SendASC2(u8 d)   //串口2發送一個字節
  66. {
  67.         USART_SendData(USART2, d);
  68.         while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);                                
  69. }

  70. void SendASC3(u8 d)
  71. {
  72.         USART_SendData(USART3, d);
  73.         while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);                                
  74. }

  75. void DengLu(void) //mqtt登錄函數
  76. {
  77.                         u8 k=0;
  78.                         printf("AT+CIPSEND=37\r\n");
  79.                         DelayS(1);
  80.                         for(k=0; k<37; k++)
  81.                         {
  82.                                                 SendASC1(MqttDataDL[k]);
  83.                         }
  84. }

  85. void DingYue(void)  //mqtt訂閱函數
  86. {
  87.                         u8 k=0;
  88.                         printf("AT+CIPSEND=10\r\n");
  89.                         DelayS(1);
  90.                         for(k=0; k<10; k++)
  91.                         {
  92.                                                 SendASC1(MqttDataDY[k]);
  93.                         }
  94. }

  95. void FaBu(void)  //mqtt發布函數
  96. {
  97.                         u8 k=0;
  98.                         printf("AT+CIPSEND=24\r\n");
  99.                         DelayS(1);
  100.                         for(k=0; k<24; k++)
  101.                         {
  102.                                                 SendASC1(MqttDataFB[k]);
  103.                         }
  104. }

  105. /*************************************************/





  106. void GPIO_Config(void)  //io口配置
  107. {
  108.   GPIO_InitTypeDef GPIO_InitStructure;

  109.   /* GPIOA and GPIOA clock enable */ //pb8、pb12、pb13、pb14設置為輸入
  110.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);   
  111.   GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8 |GPIO_Pin_12 | GPIO_Pin_13  | GPIO_Pin_14;
  112.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         
  113.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  114.   GPIO_Init(GPIOB, &GPIO_InitStructure);  
  115.         

  116.   /* GPIOA and GPIOA clock enable */ //pa6設置為輸入
  117.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   
  118.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6  ;
  119.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         
  120.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  121.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  122.   
  123.         
  124.     /* GPIOA and GPIOA clock enable */  //pa7.pa4配置為推免輸出
  125.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  126.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 |GPIO_Pin_7;
  127.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  128.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  129.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  130.         
  131.     /* GPIOA and GPIOA clock enable */  //pc13配置為推免輸出
  132.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  133.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13;
  134.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  135.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  136.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  137.                
  138. }
  139.   

  140. void DispOled(void)//液晶顯示函數
  141. {
  142.                 //顯示溫度和閾值
  143.                 sprintf(dispBuff,"WenDu=%d%d.%dC %d%dC", Ds18b20Value %1000/100, Ds18b20Value%100/10, Ds18b20Value%10, AlarmT%100/10, AlarmT%10);  
  144.                 OLED_ShowStr(0,0,dispBuff,2);
  145.                 //顯示煙霧和閾值
  146.                 sprintf(dispBuff,"YanWu = %0.2d%% %0.2d%%",A0Value,AlarmM);  
  147.                 OLED_ShowStr(0,2,dispBuff,2);
  148.           //顯示接收短信的號
  149.                 sprintf(dispBuff,"%d%d%d%d%d%d%d%d%d%d%d",pass[10],pass[9],pass[8],pass[7],pass[6],pass[5],pass[4],pass[3],pass[2],pass[1],pass[0]);
  150.                 OLED_ShowStr(0,6,dispBuff,2);
  151.                                                 
  152. }


  153. void SendDx(void) //發送短信函數
  154. {
  155.         Uart3_printf("AT+CSCS=\"GSM\"\r\n");
  156.         DelayS(1);
  157.         Uart3_printf("AT+CMGF=1\r\n");
  158.         DelayS(1);
  159.         /*******************************************************/
  160.         //printf("AT+CMGS=\"18xxxxxxxx\"\r\n");
  161.         Uart3_printf("AT+CMGS=\"");   //按設置的號碼發送短信
  162.         SendASC3(pass[10]+0x30);
  163.         SendASC3(pass[9]+0x30);
  164.         SendASC3(pass[8]+0x30);
  165.         SendASC3(pass[7]+0x30);  
  166.         SendASC3(pass[6]+0x30);   
  167.         SendASC3(pass[5]+0x30);
  168.         SendASC3(pass[4]+0x30);
  169.         SendASC3(pass[3]+0x30);
  170.         SendASC3(pass[2]+0x30);
  171.         SendASC3(pass[1]+0x30);
  172.         SendASC3(pass[0]+0x30);
  173.         Uart3_printf("\"\r\n");
  174.         /*******************************************************/
  175.         DelayS(1);
  176.         Uart3_printf("Have a Fire!!!"); //發送短信的內容
  177.         DelayS(1);
  178.         SendASC3(0x1A);  //啟動發送短信
  179.         DelayS(1);
  180. }



  181. int main(void) //主函數
  182. {

  183.         USART1_Config();  //串口初始化
  184.         GPIO_Config();//io口初始化
  185.         Adc_Init();//ad初始化
  186.         DelayInit(); //定時函數初始化
  187.         Speaker = 0;//關閉輸出設備
  188.         I2C_Configuration();//iic初始化
  189.         OLED_Init();//液晶初始化
  190.         OLED_Fill(0xFF);
  191.                 DelayS(1);
  192.                 DelayS(1);
  193.                 DelayS(1);
  194.                 DelayS(1);
  195.                 printf("AT\r\n");
  196.                 DelayS(1);
  197.                 printf("AT\r\n");
  198.                 DelayS(1);
  199.                 printf("AT\r\n");
  200.                 DelayS(1);
  201.                 printf("AT+CWMODE=3\r\n");  //8266設置為模式3
  202.                 DelayS(1);
  203.                 printf("AT+CWJAP=\"win\",\"123123123\"\r\n");  //連接熱點
  204.                 DelayS(1);
  205.                 DelayS(1);
  206.                 DelayS(1);
  207.                 DelayS(1);
  208.                 DelayS(1);
  209.                 while(DS18B20_Init()); //溫度初始化
  210.                 DelayS(1);
  211.                 Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10); //上電連續讀取幾次溫度值使其穩定
  212.                 DelayStm32(0xFFFFF);
  213.                 Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10);
  214.                 DelayStm32(0xFFFFF);
  215.                  Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10);
  216.                 DelayStm32(0xFFFFF);
  217.                 Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10);
  218.                 DelayStm32(0xFFFFF);
  219.                 Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10);
  220.                 DelayStm32(0xFFFFF);
  221.                 DelayS(1);
  222.                 DelayS(1);
  223.                 DelayS(1);
  224.                 DelayS(1);
  225.                 DelayS(1);
  226.                 DelayS(1);
  227.                 /*******************************************************/
  228.                 printf("AT+CIPSTART=\"TCP\",\"183.230.x.x\",6002\r\n");  //連接云平臺ip和端口號
  229.                 /*******************************************************/
  230.                 DelayS(1);
  231.                 DelayS(1);
  232.                 DelayS(1);
  233.                 DelayS(1);
  234.                 DelayS(1);
  235.                 DelayS(1);
  236.                 DengLu();   //調用mqtt登錄函數
  237.                 DelayS(1);
  238.                 DelayS(1);
  239.                 DelayS(1);
  240.                 DingYue();   //調用mqtt訂閱函數
  241.                 DelayStm32(0xFFFFF);
  242.                 OLED_Fill(0x00);
  243.                 DelayStm32(0xFFFFF);
  244.                 TIM4_Int_Init(9,7199); //定時器初始化
  245.         while(1)
  246.         {

  247.                 Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10);//讀取穩定
  248.                 A0Value = (Get_Adc_Average(0,20)*100/4096);//讀取煙霧
  249.                 DispOled(); //調用顯示函數

  250.                                         MqttDataFB[10] = Ds18b20Value/100;  //把要上傳得數據填進mqtt發布數據
  251.                                         MqttDataFB[11] = Ds18b20Value%100/10;
  252.                                         MqttDataFB[12] = Ds18b20Value%10;
  253.                                         MqttDataFB[13] = A0Value;
  254.                                         MqttDataFB[14] = 0;
  255.                                         MqttDataFB[15] = 0;
  256.                                         MqttDataFB[16] = FlagAlarm;
  257.                
  258.                                         if(FlagUpData==1)  //上傳數據時間到,上傳數據
  259.                                         {
  260.                                                                 FlagUpData = 0;
  261.                                                                 FaBu();  //發布數據
  262.                                         }        
  263.                                 
  264.                
  265.                 if( (Ds18b20Value>(AlarmT*10))||(A0Value>AlarmM)||(HY) ) //如果溫度或者煙霧大于閾值或者有火焰
  266.                 {
  267.                                 Speaker = 1; //蜂鳴器響
  268.                                 if(FlagAlarm==0) //每個告警值發送一次短信
  269.                                 {
  270.                                                 SendDx(); //調用發送短信函數
  271.                                 }
  272.                                 FlagAlarm = 1;
  273.                 }
  274.                 else
  275.                 {
  276.                                 FlagAlarm = 0;
  277.                                 Speaker = 0;
  278.                 }
  279.                
  280.                
  281.                         if(!Key1) //按鍵1
  282.                 {
  283.                                 while(!Key1);
  284.                                                 pass[0]++;
  285.                                                         if(pass[0]>=10) pass[0]=0;
  286.                 }
  287.                
  288.                 if(!Key2)//按鍵2
  289.                 {
  290.                                 while(!Key2);
  291.                                                 pass[10] = pass[9];
  292.                                                         pass[9] = pass[8];
  293.                                                         pass[8] = pass[7];
  294.                                                         pass[7] = pass[6];
  295.                                                         pass[6] = pass[5];
  296.                                                         pass[5] = pass[4];
  297.                                                         pass[4] = pass[3];
  298.                                                         pass[3] = pass[2];
  299.                                                         pass[2] = pass[1];
  300.                                                         pass[1] = pass[0];
  301.                                                         pass[0] = 0;
  302.                                 
  303.                 }        
  304.                
  305.                         

  306. /**************************************************************************************/
  307. /**************************************************************************************/
  308.         }                        
  309. }

  310. void TIM4_IRQHandler(void) //定時中斷每1ms中斷一次
  311. {         
  312.         if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//?????
  313.         {                                    
  314.                                 TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //??TIM4??????  
  315.                                 
  316.                                 TX_10MS++;
  317.                                 if(TX_10MS>=5000)
  318.                                 {
  319.                                                 TX_10MS = 0;
  320.                                                 FlagUpData = 1;
  321.                                 }        
  322.                  

  323.                
  324.                                                 
  325.                                 
  326.                                 

  327.         }            
  328. }

  329. void USART1_IRQHandler(void)
  330. {
  331.           uint8_t ucTemp;
  332.         if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
  333.         {        
  334.                 ucTemp = USART_ReceiveData(USART1);
  335.                 RxBuf1[0] = RxBuf1[1];
  336.                 RxBuf1[1] = RxBuf1[2];
  337.                 RxBuf1[2] = RxBuf1[3];
  338.                 RxBuf1[3] = ucTemp;
  339.                                 if( (RxBuf1[0]=='F')&&(RxBuf1[1]=='t') )  //Ftxx 設置溫度閾值
  340.                                         {
  341.                                                         AlarmT = (RxBuf1[2]-0x30)*10 + (RxBuf1[3]-0x30);
  342.                                         }
  343.                                         else if( (RxBuf1[0]=='F')&&(RxBuf1[1]=='m') )  //Fmxx  設置煙霧閾值
  344.                                         {
  345.                                                         AlarmM = (RxBuf1[2]-0x30)*10 + (RxBuf1[3]-0x30);
  346.                                         }
  347.         }         
  348. }

  349. void USART2_IRQHandler(void)
  350. {
  351.           uint8_t ucTemp2;
  352.         if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
  353.         {        
  354.                         ucTemp2= USART_ReceiveData(USART2);
  355.                         RxBuf2[0] = RxBuf2[1];
  356.                         RxBuf2[1] = RxBuf2[2];
  357.                         RxBuf2[2] = RxBuf2[3];
  358.                         RxBuf2[3] = ucTemp2;
  359.                         if( (RxBuf2[0]=='F')&&(RxBuf2[1]=='T') )
  360.                         {        

  361.                         }

  362.         
  363.         }         
  364. }

  365. void USART3_IRQHandler(void)
  366. {
  367.           uint8_t ucTemp3;
  368.         if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
  369.         {        
  370.                                 ucTemp3= USART_ReceiveData(USART3);
  371.                                 RxBuf3[0] = RxBuf3[1];
  372.                                 RxBuf3[1] = RxBuf3[2];
  373.                                 RxBuf3[2] = RxBuf3[3];
  374.                                 RxBuf3[3] = ucTemp3;


  375.                 }

  376.                                 

  377. }
復制代碼

所有資料51hei附件下載:
Keil代碼原理圖.7z (2.73 MB, 下載次數: 247)

51hei截圖_20230515144420.png (21.21 KB, 下載次數: 105)

51hei截圖_20230515144420.png

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂1 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级大片免费看 | 日韩国产中文字幕 | 狠狠爱视频 | 国产精品成人av | 日韩欧美久久 | 一区二区三区四区免费在线观看 | 99re热精品视频 | 91精品久久久久久久久久 | 久久一区二区三区免费 | 亚洲欧美综合精品久久成人 | 激情三区 | 国产精品成人一区二区三区 | 夜夜夜操 | 午夜天堂精品久久久久 | 欧美一区二不卡视频 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美国产免费 | 欧美日本一区二区 | 91偷拍精品一区二区三区 | 国内久久 | 日韩精品一区二区三区在线观看 | 久久久久久久av | 性一交一乱一透一a级 | 国产成人叼嘿视频在线观看 | 在线婷婷| 国产一区二区三区四区 | 日韩欧美在线观看 | 日韩欧美在线免费观看视频 | 美女爽到呻吟久久久久 | 欧美一区二区三区在线视频 | 亚洲国产一区二区三区在线观看 | 久久久久久亚洲精品 | 国产精品免费观看 | 久久久久国产精品一区 | 欧美老少妇一级特黄一片 | 欧美精品一区二区三区四区五区 | 亚洲天堂中文字幕 | 秋霞电影院午夜伦 | 日韩一区二区久久 | 伊人精品在线 | 国产精品99久久久久久动医院 |