查看: 362|回复: 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-8-23 04:44
  • 签到天数: 873 天

    [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-8-18 10:23
  • 签到天数: 101 天

    [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-8-23 07:40
  • 签到天数: 115 天

    [LV.6]常住居民II

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

    该用户从未签到

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

    该用户从未签到

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

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

    本版积分规则

    热门推荐

    一直显示'Serial' was not declared in this scope,求前辈解答谢谢
    一直显示'Serial'
    做了一个温控装置的蓝牙模块时遇到的问题,
    [限时福利]5分钟带你快速了解新一代开发板:M5STACK
    [限时福利]5分钟带你快速
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    【Arduino】108种传感器模块系列实验(97)---0.96寸OLED液晶屏
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    教你让OLED动起来!多重字符串版!
    教你让OLED动起来!多重字
    大家都知道:arduino单片机是单线程的 而上次教程中的多段字符串的运行速度必须一致
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表