一.硬件方案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
! 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. ^
, 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
' 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 _
- int main(void)1 g% c5 N% M% h8 N/ s, ]& E
- { - s m; P2 y. h1 M: }/ e. @( ?
- u16 adcx;
$ V7 ]# N, V9 }0 g+ I- N# O - float temp;2 e+ D* n, ]/ N1 i9 ?; G1 G
- delay_init(); //延时函数初始化
+ ?3 u( h& T# X8 _9 w/ U) f! C( z - uart_init(9600); //串口初始化为115200/ I6 [- K7 b' ?8 K a6 w
- TIM3_Int_Init(499,7199);//50ms
1 q% l5 u- q) `3 r7 ~- F' g [* n - LED_Init(); //初始化与LED连接的硬件接口
* F/ b6 {! r) ]7 R - LED0=0;
8 j* X! E# W% i$ {0 ~8 z - Adc_Init(); //ADC初始化
" f/ ^; D' N5 @5 r
" F' `! Q5 v8 ?) B: d- RELAY=1; //继电器打开
; Z0 B1 u) O$ w* s( S! V/ [ - relayFlag=1; //继电器状态标识 }1 h" g- c% z4 W* ^
- delay_ms(4000); * W7 `* @2 U$ z" F7 _# n
- " _7 ~' a' n) A: e$ V" b
- printf("AT+CIPMUX=1\r\n"); //允许链接5 T& P* ?1 w) u3 H- o. m2 `
- delay_ms(1000);
# s9 a' _) h$ o2 C7 Z0 z. B - printf("AT+CIPSERVER=1,8080\r\n"); //创建端口号8080( W" W5 x# l* p4 h0 A
- delay_ms(1000);
7 S* N2 g- c6 p' ] - while(1)0 x' Y7 m C) S; x
- {
/ c' K$ q' f8 m& W4 t7 `: [ - adcx=Get_Adc_Average(ADC_Channel_1,10);// PA1 交流电压检测口 ad转换10次求平均值0 s, R; N- o" d5 D
- temp=(float)adcx*(3.3/4096);7 ?7 j& W* }: r. v( ^+ S
- ACvolt=(unsigned int)(temp*303);//*303 互感器计算获取 以及1K电阻 用示波器检测校准得到
- A3 X* w" J5 ?& z1 e7 F - if(ACvolt<15) ACvolt=0;' B3 o. l4 O3 A# F6 `7 ^5 g8 Q% c; E& e
-
( T3 z6 e; b. m+ E" \' ~4 { - adcx=Get_Adc_Average(ADC_Channel_2,10); // PA2 求平均值
- w6 m* V. P7 W9 @ - temp=(float)adcx*(3.3/4096);
- t* H1 D2 W& ~ ^ - if(temp>0.02)
2 Z# Z' e* r9 \" Y9 E - {
7 E& P5 m1 r% \ - ACcurrent=(unsigned int)((temp-0.02)*3100);//*3950 互感器计算获取扩大1000倍 以及1K电阻 用示波器检测校准得到 0.02去除波动 防止误判断- {" e+ W( p' v: N, H
- }1 i: a% z; D/ L4 A$ y5 ?
- else
3 |; q# q" c6 W5 a2 u0 @- F" x0 n - {
5 n7 l: p7 \# P e& ^( m% G - ACcurrent=0;
: u" y( n7 t+ N$ V! I% m7 A3 J - }
3 Y6 w/ Z6 R: @7 V6 C- l( J - if(ACcurrent<50)ACcurrent=0;//滤除电流) F+ q3 G" C, K) \, I6 n% X/ a
- PowerWt=ACvolt*ACcurrent; //功率. D& H& I1 N5 c" ^
- 9 b# M0 f9 _" F6 _; K; S2 m
- if(dealFlag==1)//处理标志
: { x$ i( T+ ?4 F - {
K3 k1 v5 [8 w; U8 x% w+ e1 }9 L - dealFlag=0;: k' E7 n8 t/ f( _* i- w& Q* n4 d3 X
- 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 \ - }
' L7 I9 r L/ B6 t5 L* g) m G4 s - ( ?- t. h' h- n; p# \6 ~2 S
- if(times>=9999)
1 R5 D# ]/ H% C5 r6 L/ d - {times=0;}
' V3 a" O3 E: ^# }: I -
# V, i/ l0 w- Q( Q* \ - if(PowerWt/1000>200)' o- ^! t& s6 R/ r; m# v' s+ J* ~
- {
' F8 e8 a8 R4 j$ s& [ - RELAY=0; //关闭继电器
7 p2 R+ v- |; R! }1 l" t2 h* |+ X5 a - relayFlag=0;6 k, q( e0 l \1 g6 J
- }
4 i7 H, C. W5 F
5 a( m" H" Z0 r5 J* L- sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:1",ACvolt,ACcurrent,PowerWt,PowerQd,times); 5 U- s# S6 ]1 L' V: [+ I
- if(relayFlag==1)5 [" G# }6 O/ V( q7 U. G
- {sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:1",ACvolt,ACcurrent,PowerWt,PowerQd,times); }//打印数据 j* C9 E* [# F3 x" \7 c
- else , }" m( y# q5 w: g
- {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
- ' G. w; u3 S- y& Z7 k1 b) n+ d
-
! a8 o2 A" N6 t0 @" Z - printf("AT+CIPSEND=0,42\r\n"); //发送固定字节数据的at命令8 _: m$ I4 T( x) h! x; I Q
- delay_ms(200);
! B6 S; B# e0 G, L- z( v - printf(tabData); //发送数据
" p/ u2 P W8 }7 n/ c+ u: A - delay_ms(200);* g& T/ Z$ q5 e% }8 H3 F) ^/ I6 {5 u
7 M7 w3 `# e$ Y6 p# \- LED0=!LED0; //数据发送 0 O- Y2 H- N8 u1 V$ _' N6 U
- delay_ms(200); //延时) L6 M+ R& C! ?6 o: _
- } 3 n( I) X3 J/ Y, ~$ P9 J6 S7 x
- } ; m5 B2 H5 H9 I6 M+ O' L6 k
3 \% l" j$ E+ Y+ g8 x- 3 c9 {9 K( h3 I
复制代码
/ A1 R, L; k% [ |