查看: 534|回复: 15

智能电源监测系统 写出来与大家共享。

[复制链接]

该用户从未签到

发表于 2019-7-24 21:46 | 显示全部楼层 |阅读模式
弄这个的原因:老婆整天嫌我浪费家里的电,我说我没费多少电,他说浪费了。谁也说服不了谁,我自己心里也没底,到底,我玩一些小电器能费多少电?所以我弄一个检测用电量的东西。可以把家里的用电情况时时发送到我和媳妇的手机上。这样到底我浪费了多少电,一目了然。


所要用到的硬件:
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.74162e8dA1GLZV&id=566452110298&_u=o2krn7sf454
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.74162e8dA1GLZV&id=547888873652&_u=o2krn7s9cff
Arduino板子就不用说了吧。

我弄的时候是参考这个帖子的:
http://solar4living.com/pzem-arduino-modbus.htm


在串口监视器里可以看到:
当前电压:235.90V   当前电流:0.02A   当前功率:4.80W  功率因数:92pf   累计使用电量:556Wh  
当前电压:236.00V   当前电流:0.02A   当前功率:4.80W  功率因数:92pf   累计使用电量:556Wh  
当前电压:236.00V   当前电流:0.02A   当前功率:4.80W  功率因数:92pf   累计使用电量:556Wh  
当前电压:236.00V   当前电流:0.02A   当前功率:4.90W  功率因数:94pf   累计使用电量:556Wh  
当前电压:236.10V   当前电流:0.02A   当前功率:4.80W  功率因数:92pf   累计使用电量:556Wh  






kittenblock中小学创客名师推荐的图形化编程软件

//这个代码是Arduino专用

#include <ModbusMaster.h>//引用MODBUS协议库
#include <SoftwareSerial.h> //引用软串口库

SoftwareSerial DianBiao(11, 10); //定义电表(DianBiao)所使用的针脚
ModbusMaster node;  //定义一个MODBUS协议 节点
static uint8_t pzemSlaveAddr = 0x01;//设备的开始读取地址


void setup() {
  DianBiao.begin(9600);//电表所使用的波特率
  Serial.begin(9600);//串口所使用的波特率
  node.begin(pzemSlaveAddr, DianBiao);//启动MODBUS协议 节点node  从开始地址读取 所使用的设备是DianBiao

}

/*
  RegAddr Description                 Resolution
  0x0000  DianYa value               1LSB correspond to 0.1V
  0x0001  DianLiu value low 16 bits   1LSB correspond to 0.001A
  0x0002  DianLiu value high 16 bits
  0x0003  Power value low 16 bits     1LSB correspond to 0.1W
  0x0004  Power value high 16 bits
  0x0005  DianBiaoShu value low 16 bits    1LSB correspond to 1Wh
  0x0006  DianBiaoShu value high 16 bits
  0x0007  Frequency value             1LSB correspond to 0.1Hz
  0x0008  Power factor value          1LSB correspond to 0.01
  0x0009  Alarm status  0xFFFF is alarm,0x0000is not alarm
*/

void loop() {

  uint8_t JieGuo;  //读取到的结果
  JieGuo = node.readInputRegisters(0x0000, 9); //从开始位置读取电表寄存器

  if (JieGuo == node.ku8MBSuccess) {//如果读取成功

    //电压
    float DianYa = node.getResponseBuffer(0x0000) / 10.0;
    uint32_t tempdouble = 0x00000000;

    //当前功率
    float power;
    tempdouble |= node.getResponseBuffer(0x0003);       //LowByte
    tempdouble |= node.getResponseBuffer(0x0004) << 8;  //highByte
    power = tempdouble / 10.0;

    //电流
    float DianLiu;
    tempdouble = node.getResponseBuffer(0x0001);       //LowByte
    tempdouble |= node.getResponseBuffer(0x0002) << 8;  //highByte
    DianLiu = tempdouble / 1000.0;

    //累计使用电量
    uint16_t DianBiaoShu;
    tempdouble = node.getResponseBuffer(0x0005);       //LowByte
    tempdouble |= node.getResponseBuffer(0x0006) << 8;  //highByte
    DianBiaoShu = tempdouble;


    Serial.print("当前电压:");
    Serial.print(DianYa);
    Serial.print("V   ");

    Serial.print("当前电流:");
    Serial.print(DianLiu);
    Serial.print("A   ");

    Serial.print("当前功率:");
    Serial.print(power);
    Serial.print("W  ");

    Serial.print("功率因数:");
    Serial.print(node.getResponseBuffer(0x0008));
    Serial.print("pf   ");

    Serial.print("累计使用电量:");
    Serial.print(DianBiaoShu);
    Serial.print("Wh  ");
    Serial.println();

  } else {
    Serial.println("无法读取Modbus设备");
  }
  delay(2000);
}























































































void resetEnergy(uint8_t slaveAddr) {//重置设备
  //The command to reset the slave's DianBiaoShu is (total 4 bytes):
  //Slave address + 0x42 + CRC check high byte + CRC check low byte.
  uint16_t u16CRC = 0xFFFF;
  static uint8_t resetCommand = 0x42;
  u16CRC = crc16_update(u16CRC, slaveAddr);
  u16CRC = crc16_update(u16CRC, resetCommand);
  Serial.println("Resetting DianBiaoShu");
  DianBiao.write(slaveAddr);
  DianBiao.write(resetCommand);
  DianBiao.write(lowByte(u16CRC));
  DianBiao.write(highByte(u16CRC));
  delay(1000);
}

void changeAddress(uint8_t OldslaveAddr, uint8_t NewslaveAddr)//更改地址
{
  static uint8_t SlaveParameter = 0x06;
  static uint16_t registerAddress = 0x0002; // Register address to be changed
  uint16_t u16CRC = 0xFFFF;
  u16CRC = crc16_update(u16CRC, OldslaveAddr);
  u16CRC = crc16_update(u16CRC, SlaveParameter);
  u16CRC = crc16_update(u16CRC, highByte(registerAddress));
  u16CRC = crc16_update(u16CRC, lowByte(registerAddress));
  u16CRC = crc16_update(u16CRC, highByte(NewslaveAddr));
  u16CRC = crc16_update(u16CRC, lowByte(NewslaveAddr));

  Serial.println("Changing Slave Address");

  DianBiao.write(OldslaveAddr);
  DianBiao.write(SlaveParameter);
  DianBiao.write(highByte(registerAddress));
  DianBiao.write(lowByte(registerAddress));
  DianBiao.write(highByte(NewslaveAddr));
  DianBiao.write(lowByte(NewslaveAddr));
  DianBiao.write(lowByte(u16CRC));
  DianBiao.write(highByte(u16CRC));
  delay(1000);
}

  • TA的每日心情
    奋斗
    2019-7-12 09:03
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-7-25 11:28 | 显示全部楼层
    你这投入不少哇
  • TA的每日心情
    开心
    2019-10-20 00:16
  • 签到天数: 931 天

    [LV.10]以坛为家III

    发表于 2019-7-25 15:23 | 显示全部楼层
    这个理由我服

    该用户从未签到

     楼主| 发表于 2019-7-26 20:04 | 显示全部楼层

    当交学费,其实不多

    该用户从未签到

     楼主| 发表于 2019-7-26 20:09 | 显示全部楼层

    今天晚上回去再调试一下数据就可以弄到电脑上了。

    最主要需要弄到手机上,一直不会写android app   研究了一段时间E4A感觉BUT太多了,也可能是我自己的问题。今天研究了一天Android Studio   屁都弄不出来。研究Android Studio已经不下20次了,这么多年,但一直没弄成功过。今天弄了一天,连个环境都没弄好。这鸡巴玩意也太麻烦了。我用VS几乎可以随心写任何数据库软件。但这个Android Studio全英文,看了N多教程,怂都不顶。这次看来又要放弃了。还是找找其它能写APP的软件吧。看来Android Studio这个软件和我无缘分了。
  • TA的每日心情
    擦汗
    2019-10-5 13:52
  • 签到天数: 111 天

    [LV.6]常住居民II

    发表于 2019-7-26 23:52 | 显示全部楼层
    ws9528 发表于 2019-7-26 20:09
    今天晚上回去再调试一下数据就可以弄到电脑上了。

    最主要需要弄到手机上,一直不会写android app   研究 ...

    你还不如做个网页?全平台通用
    你今天的打赏,是我明天学习Arduino的动力!

    该用户从未签到

     楼主| 发表于 2019-8-13 22:20 | 显示全部楼层
    Creeper666 发表于 2019-7-26 23:52
    你还不如做个网页?全平台通用

    有道理,关键我不会弄
  • TA的每日心情
    开心
    2019-10-16 06:31
  • 签到天数: 168 天

    [LV.7]常住居民III

    发表于 2019-8-14 15:05 | 显示全部楼层
    用的是什么传感器,能测量市电的?

    该用户从未签到

    发表于 2019-8-15 10:13 | 显示全部楼层
    可以试试processing软件,也能开发APP

    该用户从未签到

     楼主| 发表于 2019-8-21 13:35 | 显示全部楼层
    eagler8 发表于 2019-8-14 15:05
    用的是什么传感器,能测量市电的?

    就是测量220V市电的,我现在主要用在测量家里的用电情况,当成一个智能电表来用。可以和监控一样,看两个小时前几点分分几秒的用电情况
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    Blink——Arduino的Hello World!
    Blink——Arduino的Hello
    本教程节选自《Arduino程序设计基础》 Arduino编程基础(零)——Blink,Arduino的He
    ATmega2560-16AU刷BootLoader好慢
    ATmega2560-16AU刷BootLoa
    各位朋友,ATmega2560-16AU刷BootLoader好慢,有没有比较快的办法,一块板子要5分钟左
    【Arduino】108种传感器模块系列实验(104)---MAX30102手腕心率
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表