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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

INA226-USB電壓電流表 功率計程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:1093542 發表于 2023-9-14 15:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
INA226-USB電壓電流表   設計可行性資料,親測可用

  1. /*
  2. 程序完善中,我自己本身也沒學過C/C++,完全就是靠感覺寫的代碼,若有BUG屬正常現象
  3. V1.0版本視頻鏈接https://www.bilibili.com/video/BV1Ev411k7jA
  4. V3.0版本視頻鏈接https://www.bilibili.com/video/BV1Ea411w7dj
  5. V5.0版本視頻鏈接https://www.bilibili.com/video/BV11a411F7mX

  6. 自2020.12.9開始記錄更新歷史

  7. 2020.12.9-----添加低電流關閉屏幕按鍵代碼并掉電保存狀態
  8. 2020.12.24----平安夜快樂!優化三個按鍵EEPROM保存部分代碼,避免新的328P芯片第一次上電EEPROM數據問題
  9. */


  10. #include <Wire.h>
  11. #include <INA226.h>
  12. #include <Adafruit_SSD1306.h>
  13. #include <EEPROM.h>

  14. #define SCREEN_WIDTH 128
  15. #define SCREEN_HEIGHT 32
  16. #define OLED_RESET    -1
  17. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

  18. #define NUMFLAKES

  19. static const uint8_t PROGMEM qidong[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xE0,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x02,0x00,0xE0,0x00,0x03,0x00,0x00,0x03,0x80,0xE0,0x3E,0x0F,0xE0,0x00,0x0C,0x00,0x07,0x00,0x60,0x00,0x03,0x00,0x00,0x03,0x80,0xE0,0xFF,0x0F,0xF8,0x00,0x0C,0x00,0x03,0xFF,0xFF,0x87,0xFF,0xFF,0x80,0x03,0x80,0xE1,0xC1,0x0E,0x3C,0x0F,0xFF,0xF8,0x01,0xBF,0xFF,0x87,0xFF,0xFF,0x80,0x03,0x80,0xE3,0x80,0x0E,0x0E,0x0F,0xFF,0xF8,0x00,0x81,0x00,0x00,0x03,0x00,0x00,0x03,0x80,0xE3,0x80,0x0E,0x0E,0x0C,0x0C,0x18,0x00,0x03,0x98,0x00,0x03,0x00,0x00,0x03,0x80,0xE3,0x80,0x0E,0x0E,0x0C,0x0C,0x18,0x0C,0x06,0x0C,0x01,0xFF,0xFF,0x00,0x03,0x80,0xE3,0xC0,0x0E,0x0C,0x0C,0x0C,0x18,0x0F,0xAC,0x1E,0x01,0xFF,0xFF,0x00,0x03,0x80,0xE1,0xE0,0x0E,0x1C,0x0F,0xFF,0xF8,0x03,0x1F,0xFF,0x80,0x03,0x00,0x00,0x03,0x80,0xE0,0xF8,0x0F,0xF8,0x0F,0xFF,0xF8,0x01,0x1C,0x01,0x0F,0xFF,0xFF,0xC0,0x03,0x80,0xE0,0x7E,0x0F,0xFC,0x0C,0x0C,0x18,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xC0,0x03,0x80,0xE0,0x1F,0x0E,0x1E,0x0C,0x0C,0x18,0x00,0x0C,0xCC,0x00,0x0E,0x00,0x00,0x03,0x80,0xE0,0x07,0x0E,0x0F,0x0C,0x0C,0x18,0x01,0x0C,0xCC,0x00,0x1D,0x82,0x00,0x03,0x80,0xE0,0x03,0x8E,0x07,0x0F,0xFF,0xF8,0x03,0x8C,0xCC,0x00,0x39,0x87,0x80,0x03,0x80,0xE0,0x03,0x8E,0x07,0x0F,0xFF,0xF8,0x03,0x0C,0xCC,0x00,0x70,0xCE,0x00,0x03,0x80,0xC0,0x03,0x8E,0x07,0x0C,0x0C,0x18,0x03,0x0C,0xCC,0x01,0xF0,0xF8,0x00,0x01,0xC1,0xC0,0x03,0x8E,0x0E,0x0C,0x0C,0x02,0x07,0x0C,0xCC,0x0F,0xB0,0x70,0x00,0x01,0xE3,0x83,0x0F,0x0E,0x1E,0x00,0x0C,0x01,0x86,0x18,0xCC,0x87,0x30,0x38,0x00,0x00,0xFF,0x03,0xFE,0x0F,0xFC,0x00,0x0C,0x03,0x8E,0x38,0xCC,0xC4,0x31,0x1E,0x00,0x00,0x3C,0x00,0xF8,0x0F,0xE0,0x00,0x0F,0xFF,0x0E,0xF0,0xCF,0xC0,0x3F,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFE,0x02,0x60,0xCF,0x80,0x7E,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};

  20. INA226 ina;

  21. unsigned long previousMillis = 0;
  22. unsigned long interval = 50;
  23. float shuntvoltage = 0;
  24. float busvoltage = 0;
  25. float current_mA = 0;
  26. float loadvoltage = 0;
  27. int SECONDS;
  28. int MINUTES;
  29. int HOURS;
  30. char flag1=1;
  31. char flag2=1;
  32. char flag3=1;
  33. bool temp1=0;
  34. bool temp2=0;
  35. double lasttime;
  36. double mah = 0;
  37. double mwh = 0;
  38. bool screen = 1;
  39. double screentime;
  40. bool state = 0;
  41. int page = 0;
  42. bool eeprom = 0;
  43. bool AlwayOn =0;

  44. int ShuaXinShiJian = 0;


  45. void setup() {
  46.   int value;
  47.   int address = 0;
  48. //  EEPROM.get(512,value);
  49.   value = EEPROM.read(512);
  50.     if (value ==255){
  51.       Serial.print(value);Serial.println("test");
  52.       while(address<=512)
  53.     {
  54.       EEPROM.write(address,0);
  55.       address++;
  56.     }
  57.   }
  58.   
  59.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C, false, false);
  60.   EEPROM.get(0,temp1);
  61.   EEPROM.get(2,temp2);
  62.   EEPROM.get(4,AlwayOn);
  63.   
  64.   pinMode(A0,INPUT);
  65.   pinMode(A1,INPUT);

  66. //********************啟動畫面***********************
  67.   setContrast (&display, 0);
  68.   display.clearDisplay();
  69.   display.drawBitmap(0,0,qidong,128,62,WHITE);
  70.   display.drawRect(0,0,128,32,WHITE);
  71.   display.display();
  72.   delay(1000);

  73. //**************************************************
  74.   Serial.begin(115200);

  75.   ina.begin();

  76.   ina.configure(INA226_AVERAGES_1, INA226_BUS_CONV_TIME_1100US, INA226_SHUNT_CONV_TIME_1100US, INA226_MODE_SHUNT_BUS_CONT);

  77.   ina.calibrate(0.01, 4);

  78.   ina.enableOverPowerLimitAlert();
  79.   ina.setPowerLimit(0.130);
  80.   ina.setAlertLatch(true);
  81. }

  82. //--------------主循環函數----------------
  83. void loop() {

  84.   unsigned long currentMillis = millis();
  85.   if (currentMillis - previousMillis >= interval)
  86.   {
  87.     previousMillis = currentMillis;
  88.     ina226values();
  89.     displaydata();
  90. }

  91.   SECONDS = (millis () / 1000) % 60;
  92.   MINUTES = (millis () / 1000) % 3600/60;
  93.   HOURS = (millis () / 1000) % (24*3600)/3600;

  94.   setbright();      
  95.   Page();
  96.   SAOn();
  97.   if (AlwayOn){
  98.     screenstate();
  99.   }



  100. //  Serial.print("     ");
  101. //  Serial.print(millis() - screentime);
  102. //  Serial.print("     ");
  103. //  Serial.print(current_mA);
  104. //  Serial.print("     ");
  105. //  Serial.print(screen);
  106. //  Serial.print("     ");
  107. //  Serial.println(state);
  108. //  Serial.println("     ");
  109.   
  110. }

  111. //-------------------屏幕顯示部分------------------
  112. void displaydata() {
  113.   if (screen){

  114.   display.clearDisplay();
  115.   display.setTextSize(2);
  116.   display.setTextColor(SSD1306_WHITE);

  117. if (loadvoltage < 10){
  118.   display.setCursor(0,0);
  119.   display.print(loadvoltage ,3);
  120.   display.println("V");
  121. }
  122. else {
  123.   display.setCursor(0,0);
  124.   display.print(loadvoltage);
  125.   display.println("V");
  126. }
  127.   
  128.   display.setCursor(0, 18);
  129.   display.print(current_mA / 1000,3);
  130.   display.println("A");


  131.   display.setTextSize(1);
  132.   display.setTextColor(SSD1306_WHITE);
  133.   
  134.   display.setCursor(74, 0);
  135.   display.print(loadvoltage * current_mA / 1000,4);
  136.   display.println("W");

  137.   if (!AlwayOn){
  138.     display.drawLine(0,15,69,15,WHITE);
  139.   }

  140. //———————————————————————————————

  141.   if (page==0){
  142.     if (mah < 100){
  143.     display.setCursor(74, 8);
  144.     display.print(mah,2);
  145.     display.println("mAh");
  146.     }
  147.     else if (mah < 1000){
  148.     display.setCursor(74, 8);
  149.     display.print(mah,1);
  150.     display.println("mAh");
  151.     }
  152.     else {
  153.     display.setCursor(74, 8);
  154.     display.print(mah / 1000,3);
  155.     display.println("Ah");
  156.     }
  157.   
  158.   
  159.     if (mwh < 100){
  160.     display.setCursor(74, 16);
  161.     display.print(mwh,2);
  162.     display.println("mWh");
  163.     }
  164.       else if (mwh < 1000){
  165.     display.setCursor(74, 16);
  166.     display.print(mwh ,1);
  167.     display.println("mWh");
  168.       }
  169.       else {
  170.     display.setCursor(74, 16);
  171.     display.print(mwh / 1000 ,3);
  172.     display.println("Wh");
  173.       }
  174.   }
  175.   else {
  176.     display.setCursor(74, 8);
  177.     display.print("D+:");
  178.     int V1 = analogRead(A0);               
  179.     float vol1 = V1*(3.966 / 1023.0);
  180.     display.print(vol1);
  181.     display.println("V");
  182.     Serial.println(digitalRead(A0));

  183.     display.setCursor(74, 16);
  184.     display.print("D-:");
  185.     int V2 = analogRead(A1);               
  186.     float vol2 = V2*(3.966 / 1023.0);
  187.     display.print(vol2);
  188.     display.println("V");
  189.   }

  190. //----------------運行時間顯示----------------

  191.   display.setCursor(74, 24);
  192.   
  193.   if (HOURS < 10){
  194.     display.print("0");
  195.     display.print(HOURS);
  196.     }
  197.     else{display.print(HOURS);}
  198.     display.print(":");
  199.   if (MINUTES < 10){
  200.     display.print("0");
  201.     display.print(MINUTES);
  202.     }
  203.     else{display.print(MINUTES);}
  204.     display.print(":");
  205.   if (SECONDS < 10){
  206.     display.print("0");
  207.     display.print(SECONDS);
  208.     }
  209.     else{display.print(SECONDS);}
  210.   
  211.   
  212.     display.display();
  213.   
  214.     }
  215.     else {
  216.     display.clearDisplay();
  217.     display.display();
  218.     }
  219. }

  220. //--------------------數據計算---------------------

  221. void ina226values() {
  222.   shuntvoltage = ina.readShuntVoltage();
  223.   busvoltage = ina.readBusVoltage();
  224.   current_mA = ina.readShuntCurrent() * 1000;
  225.   loadvoltage = busvoltage + (shuntvoltage / 1000);

  226.     if (loadvoltage < 0){
  227.     loadvoltage = - loadvoltage;
  228.   }
  229.   if (current_mA < 0){
  230.     current_mA = -current_mA;
  231.   }

  232.   if (millis() - lasttime >= 500 ){

  233.   if ((current_mA >= 5)){
  234.     mah = mah + (current_mA * ((millis() - lasttime)) / 1000)/3600;
  235.     mwh = mwh +(loadvoltage * ((current_mA * ((millis() - lasttime)) / 1000)/3600));
  236.     lasttime = millis();
  237.    
  238.     }
  239.   }
  240. }



  241. void setContrast(Adafruit_SSD1306 *display, uint8_t contrast) {
  242.     display->ssd1306_command(SSD1306_SETCONTRAST);
  243.     display->ssd1306_command(contrast);
  244. }


  245. //---------------屏幕亮度按鍵控制--------------

  246. void setbright(){
  247.   if(digitalRead(8)==0&&flag1==1)
  248.   {
  249.     delay(5);flag1=0;
  250.     if(digitalRead(8)==0){
  251.     temp1=!temp1;
  252.     EEPROM.put(0,temp1);
  253.     }
  254.   }
  255.   else if(digitalRead(8)==1){
  256.   flag1=1;
  257.   }
  258.   switch (temp1){
  259.     case 1:setContrast (&display, 255);break;
  260.     case 0:setContrast (&display, 0);break;
  261.   }
  262. }

  263. //-----------------頁面切換------------------
  264. void Page(){
  265.   if(digitalRead(9)==0&&flag2==1)
  266.   {
  267.     delay(5);flag2=0;
  268.     if(digitalRead(9)==0){
  269.     temp2=!temp2;
  270.     EEPROM.put(2,temp2);
  271.     }
  272.   }
  273.   else if(digitalRead(9)==1){
  274.   flag2=1;
  275.   }
  276.   switch (temp2){
  277.     case 0:page=0;break;
  278.     case 1:page=1;break;
  279.   }
  280. }
  281. //-------------按鍵切換是否開啟低電流屏幕保護-------------
  282. void SAOn(){
  283.   if(digitalRead(10)==0&&flag3==1)
  284.   {
  285.     delay(5);flag3=0;
  286.     if(digitalRead(10)==0){
  287.     AlwayOn=!AlwayOn;
  288.     screen = 1;
  289.     screentime = millis();
  290.     EEPROM.put(4,AlwayOn);
  291.     }
  292.   }
  293.   else if(digitalRead(10)==1){
  294.     flag3=1;
  295.   }
  296.   switch (AlwayOn){
  297.     case 0:;break;
  298.     case 1:;break;
  299.   }
  300. }
  301. //-------------電流低于5mA  5s后關閉屏幕-------------
  302. void screenstate(){
  303.   if (current_mA <= 5){
  304.     if (millis() - screentime > 5000){
  305.       screen = 0;
  306.     }
  307.     if (state){
  308.     screentime = millis();
  309.     state = 0;
  310.     }
  311.     if (millis() - screentime < 5000){
  312.       screen = 1;
  313.     }
  314.   }
  315.   else {
  316.     screen = 1;
  317.     state = 1;
  318.   }
  319. }
復制代碼


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

使用道具 舉報

沙發
ID:301191 發表于 2024-10-23 04:13 | 只看該作者
頂一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜在线免费观看 | 亚洲aⅴ精品 | 一区二区三区在线免费观看 | 久久蜜桃av| 97精品一区二区 | 99视频在线免费观看 | 先锋资源站 | 干干天天 | 久久精品国产一区老色匹 | 黄色高清视频 | 亚洲国产一区二区三区 | 亚洲一区二区电影网 | 亚洲精品久久久一区二区三区 | 日韩精品极品视频在线观看免费 | 国产成人精品综合 | 免费观看一级特黄欧美大片 | 91秦先生艺校小琴 | 一区二区三区高清 | 欧美精品一区二区三区蜜桃视频 | 国产一区二 | 免费观看一级特黄欧美大片 | 久久久久久久久久久久久久国产 | 一区二区三区免费观看 | 热久久久久 | 电影午夜精品一区二区三区 | 91视频久久| 国产一区二区 | 999精品在线观看 | 久久久久久久久久久久久久国产 | 在线免费观看黄a | 国产精品国产精品国产专区不片 | 91在线精品视频 | 天天综合永久入口 | 国产一区久久 | 天天天插 | 天天操 夜夜操 | 精品成人一区二区 | 成人黄色av | 日韩中文在线视频 | 久久久片 | 大伊人久久 |