你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】基于STM32单片机的WIFI智能电表设计

[复制链接]
STMCU小助手 发布时间:2022-5-12 11:26
一.硬件方案6 U& T! M$ p5 c) m$ [' O: x3 C
本设计由STM32单片机核心板电路、交流电压电流检测模块电路、WIFI模块电路组成。通过电压互感器TV1005M和电流互感器TA1005M分别检测交流电压和交流电流值,手机APP和WiFi模块互联后,可以实时显示交流电压、交流电流、功率和电量实时显示在手机上。当功率超过200W时,继电器自动断开。功率不超过200W时,可以手动控制继电器的开关。手机和WiFi模块连接后,手机上显示计时时间。* \9 {+ g# G9 E+ u! [
主要由STM32单片机核心板、交流电压电流检测模块、WIFI模块、指示灯组成;如图:
5 H6 `  z6 P+ ?% {+ e+ c
7 }' y, \5 U* R5 `. F# I: j1 w" l P{D7NN)F4}W65UP0]7T9$YY.png
! v0 v# `, a, h% Q
# I1 t0 u# F% l2 T7 I2 c  q9 q9 l二.设计功能* J8 D# T$ @& j  k
(1)220V市电经过互感器后产生微弱交流电,经过整流滤波后变为直流,然后通过单片机AD转换,然后换算出实际值。电压电流采集分别使用电压互感器TV1005M和电流互感器TA1005M。. P7 f6 i: J8 c" h9 U
(2)220V市电经过互感器后产生微弱交流电,经过整流滤波后变为直流,然后通过单片机AD转换,然后换算出实际值。电压电流采集分别使用电压互感器TV1005M和电流互感器TA1005M。
% V3 u: r1 @% X2 r(3)当功率超过200W时,继电器自动断开。功率不超过200W时,可以手动控制继电器的开关。
& Q" l5 H; ~! A8 L) b, o5 \" k(4)手机APP和设备WiFi模块连接后,手机上显示计时时间。) M& W/ h7 W: {3 l) R
: n( v! }; h) W
三.设计原理图

' C$ |8 H0 Q( I2 Y$ M(1)原理图主要采用AD软件进行设计,如图:! S; y2 J/ O+ [$ A7 `

5 U- i- p" Q/ J. ^ YXF@O5JNLT)$`}]M{O$G5EW.png
, T' p5 L1 Z0 n* M* J1 `$ M
" q  j  O+ ?8 N% i四.软件设计
1 P6 E1 S" h. b, o6 }: }(1)程序流程图% H; X0 _7 q  ]
0 D/ f9 \  c6 m3 e! [) P6 q
9}HTZGL6IJ(RK4NG)3}83NN.png ' d: t3 `9 n! c7 o
! Z& H; e! @/ B
(2)主程序源码- f/ L7 j+ g" y$ b5 m: ^$ ]
" i$ i1 G3 j, B& O- G3 _
  1. int main(void)1 g% c5 N% M% h8 N/ s, ]& E
  2. { - s  m; P2 y. h1 M: }/ e. @( ?
  3.         u16 adcx;
    $ V7 ]# N, V9 }0 g+ I- N# O
  4.         float temp;2 e+ D* n, ]/ N1 i9 ?; G1 G
  5.         delay_init();                     //延时函数初始化         
    + ?3 u( h& T# X8 _9 w/ U) f! C( z
  6.         uart_init(9600);                 //串口初始化为115200/ I6 [- K7 b' ?8 K  a6 w
  7.   TIM3_Int_Init(499,7199);//50ms           
    1 q% l5 u- q) `3 r7 ~- F' g  [* n
  8.         LED_Init();                                  //初始化与LED连接的硬件接口
    * F/ b6 {! r) ]7 R
  9.   LED0=0;
    8 j* X! E# W% i$ {0 ~8 z
  10.          Adc_Init();                                  //ADC初始化            
    " f/ ^; D' N5 @5 r

  11. " F' `! Q5 v8 ?) B: d
  12.         RELAY=1; //继电器打开
    ; Z0 B1 u) O$ w* s( S! V/ [
  13.         relayFlag=1;        //继电器状态标识  }1 h" g- c% z4 W* ^
  14.         delay_ms(4000); * W7 `* @2 U$ z" F7 _# n
  15.         " _7 ~' a' n) A: e$ V" b
  16.         printf("AT+CIPMUX=1\r\n");                   //允许链接5 T& P* ?1 w) u3 H- o. m2 `
  17.         delay_ms(1000);
    # s9 a' _) h$ o2 C7 Z0 z. B
  18.         printf("AT+CIPSERVER=1,8080\r\n");           //创建端口号8080( W" W5 x# l* p4 h0 A
  19.         delay_ms(1000);
    7 S* N2 g- c6 p' ]
  20.         while(1)0 x' Y7 m  C) S; x
  21.         {
    / c' K$ q' f8 m& W4 t7 `: [
  22.                 adcx=Get_Adc_Average(ADC_Channel_1,10);// PA1 交流电压检测口 ad转换10次求平均值0 s, R; N- o" d5 D
  23.                 temp=(float)adcx*(3.3/4096);7 ?7 j& W* }: r. v( ^+ S
  24.                 ACvolt=(unsigned int)(temp*303);//*303 互感器计算获取 以及1K电阻 用示波器检测校准得到
    - A3 X* w" J5 ?& z1 e7 F
  25.                 if(ACvolt<15) ACvolt=0;' B3 o. l4 O3 A# F6 `7 ^5 g8 Q% c; E& e
  26.                
    ( T3 z6 e; b. m+ E" \' ~4 {
  27.                 adcx=Get_Adc_Average(ADC_Channel_2,10);        // PA2                                                       求平均值
    - w6 m* V. P7 W9 @
  28.                 temp=(float)adcx*(3.3/4096);
    - t* H1 D2 W& ~  ^
  29.                 if(temp>0.02)
    2 Z# Z' e* r9 \" Y9 E
  30.                 {
    7 E& P5 m1 r% \
  31.                         ACcurrent=(unsigned int)((temp-0.02)*3100);//*3950 互感器计算获取扩大1000倍 以及1K电阻 用示波器检测校准得到 0.02去除波动 防止误判断- {" e+ W( p' v: N, H
  32.                 }1 i: a% z; D/ L4 A$ y5 ?
  33.                 else
    3 |; q# q" c6 W5 a2 u0 @- F" x0 n
  34.                 {
    5 n7 l: p7 \# P  e& ^( m% G
  35.                                 ACcurrent=0;
    : u" y( n7 t+ N$ V! I% m7 A3 J
  36.                 }
    3 Y6 w/ Z6 R: @7 V6 C- l( J
  37.                 if(ACcurrent<50)ACcurrent=0;//滤除电流) F+ q3 G" C, K) \, I6 n% X/ a
  38.                 PowerWt=ACvolt*ACcurrent;                 //功率. D& H& I1 N5 c" ^
  39.                 9 b# M0 f9 _" F6 _; K; S2 m
  40.                 if(dealFlag==1)//处理标志
    : {  x$ i( T+ ?4 F
  41.                 {
      K3 k1 v5 [8 w; U8 x% w+ e1 }9 L
  42.                         dealFlag=0;: k' E7 n8 t/ f( _* i- w& Q* n4 d3 X
  43.                         PowerQd=(float)PowerWt*1/60.0/60.0+PowerQd;        //累计电量 1表示1s 因为电流扩大了1000倍 因此该处也扩大了1000倍 且此处功率单位为W 除以1000为千瓦 结果为度 1度=1千瓦时
    2 }9 L& V$ `0 o- u5 o9 \
  44.                 }
    ' L7 I9 r  L/ B6 t5 L* g) m  G4 s
  45.                 ( ?- t. h' h- n; p# \6 ~2 S
  46.                 if(times>=9999)
    1 R5 D# ]/ H% C5 r6 L/ d
  47.                 {times=0;}
    ' V3 a" O3 E: ^# }: I
  48.                
    # V, i/ l0 w- Q( Q* \
  49.                 if(PowerWt/1000>200)' o- ^! t& s6 R/ r; m# v' s+ J* ~
  50.                 {        
    ' F8 e8 a8 R4 j$ s& [
  51.                         RELAY=0;                        //关闭继电器
    7 p2 R+ v- |; R! }1 l" t2 h* |+ X5 a
  52.                         relayFlag=0;6 k, q( e0 l  \1 g6 J
  53.                 }               
    4 i7 H, C. W5 F

  54. 5 a( m" H" Z0 r5 J* L
  55.                 sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:1",ACvolt,ACcurrent,PowerWt,PowerQd,times);                5 U- s# S6 ]1 L' V: [+ I
  56.                 if(relayFlag==1)5 [" G# }6 O/ V( q7 U. G
  57.                 {sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:1",ACvolt,ACcurrent,PowerWt,PowerQd,times);                }//打印数据  j* C9 E* [# F3 x" \7 c
  58.                 else , }" m( y# q5 w: g
  59.                 {sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:0",ACvolt,ACcurrent,PowerWt,PowerQd,times);                }//打印数据0 A! d. d  Y+ l4 p# p# g8 K
  60.         ' G. w; u3 S- y& Z7 k1 b) n+ d
  61.                
    ! a8 o2 A" N6 t0 @" Z
  62.                 printf("AT+CIPSEND=0,42\r\n");                //发送固定字节数据的at命令8 _: m$ I4 T( x) h! x; I  Q
  63.                 delay_ms(200);
    ! B6 S; B# e0 G, L- z( v
  64.                 printf(tabData);                                        //发送数据
    " p/ u2 P  W8 }7 n/ c+ u: A
  65.                 delay_ms(200);* g& T/ Z$ q5 e% }8 H3 F) ^/ I6 {5 u

  66. 7 M7 w3 `# e$ Y6 p# \
  67.                 LED0=!LED0;                //数据发送        0 O- Y2 H- N8 u1 V$ _' N6 U
  68.                 delay_ms(200);                //延时) L6 M+ R& C! ?6 o: _
  69.         }                                                                                            3 n( I) X3 J/ Y, ~$ P9 J6 S7 x
  70. }        ; m5 B2 H5 H9 I6 M+ O' L6 k

  71. 3 \% l" j$ E+ Y+ g8 x
  72. 3 c9 {9 K( h3 I
复制代码

/ A1 R, L; k% [
赞 收藏 评论0 发布时间:2022-5-12 11:26

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版