迪文科技论坛

 找回密码
 立即注册
搜索
查看: 469|回复: 4

【开源】便携功率计

[复制链接]

17

主题

114

回帖

1283

积分

金牌会员

Rank: 6Rank: 6

积分
1283
QQ
发表于 2024-6-29 12:09:22 | 显示全部楼层 |阅读模式
1、介绍

最近在研究测功率,正好用迪文屏做了一个功率计的Demo。

2、硬件准备
选择了2英寸迪文屏,型号如下:


电流电压检测传感器采用INA226模块


设计了一块主板,结合ESP32、INA226和迪文屏,增加一些检测接口。



3、界面设计
采用Adobe Illustrator设计界面UI,素材如下:

一共有6个界面,界面设计如下:







4、代码设计
这次代码只有ESP32,ESP32通过IIC采集INA226的数据,电流,电压和功率,将以上数据通过串口发送给迪文屏,同时通过UDP将数据发送至上位机。主要代码如下:
  1. static void wifi_event_handler(void* arg, esp_event_base_t event_base,
  2.                                     int32_t event_id, void* event_data)
  3. {
  4.     if (event_id == WIFI_EVENT_AP_STACONNECTED) {
  5.         wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
  6.         ESP_LOGI(TAG, "station "MACSTR" join, AID=%d",
  7.                  MAC2STR(event->mac), event->aid);
  8.     } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {
  9.         wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
  10.         ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d",
  11.                  MAC2STR(event->mac), event->aid);
  12.     }
  13. }

  14. void wifi_init_softap(void)
  15. {
  16.     ESP_ERROR_CHECK(esp_netif_init());
  17.     ESP_ERROR_CHECK(esp_event_loop_create_default());
  18.     esp_netif_create_default_wifi_ap();

  19.     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  20.     ESP_ERROR_CHECK(esp_wifi_init(&cfg));

  21.     ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
  22.                                                         ESP_EVENT_ANY_ID,
  23.                                                         &wifi_event_handler,
  24.                                                         NULL,
  25.                                                         NULL));

  26.     wifi_config_t wifi_config = {
  27.         .ap = {
  28.             .ssid = EXAMPLE_ESP_WIFI_SSID,
  29.             .ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),
  30.             .channel = EXAMPLE_ESP_WIFI_CHANNEL,
  31.             .password = EXAMPLE_ESP_WIFI_PASS,
  32.             .max_connection = EXAMPLE_MAX_STA_CONN,
  33.             .authmode = WIFI_AUTH_WPA_WPA2_PSK
  34.         },
  35.     };
  36.     if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) {
  37.         wifi_config.ap.authmode = WIFI_AUTH_OPEN;
  38.     }

  39.     ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
  40.     ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));
  41.     ESP_ERROR_CHECK(esp_wifi_start());

  42.     ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s channel:%d",
  43.              EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS, EXAMPLE_ESP_WIFI_CHANNEL);
  44. }

  45. esp_ip4_addr_t ip_addr;

  46. static void udp_server_task(void *pvParameters)
  47. {
  48.     // 将IPv4地址转换为字符串格式的IP地址
  49.     char ip_addr_str[INET_ADDRSTRLEN];
  50.     inet_ntoa_r(ip_addr.addr, ip_addr_str, sizeof(ip_addr_str));

  51.     // 设置广播地址和接收方的端口号
  52.     struct sockaddr_in broadcast_addr = {
  53.         .sin_addr.s_addr = ip_addr.addr | htonl(0xFF), //广播地址,其类型为uint32_t
  54.         .sin_family = AF_INET,
  55.         .sin_port = htons(BROADCAST_PORT),
  56.     };
  57.     // 将广播地址转换为字符串
  58.     ESP_LOGI(TAG, "broadcast_addr IP: %s", inet_ntoa(broadcast_addr.sin_addr.s_addr));

  59.     // Create a socket for UDP broadcast
  60.     int broadcast_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  61.     if (broadcast_socket < 0) {
  62.         ESP_LOGE(TAG, "Failed to create socket: %d", broadcast_socket);
  63.         goto error;
  64.     }


  65.     // 设置套接字选项以启用地址重用
  66.     int reuseEnable = 1;
  67.     setsockopt(broadcast_socket, SOL_SOCKET, SO_REUSEADDR, &reuseEnable, sizeof(reuseEnable));

  68.     // 使能广播
  69.     int broadcast_enable = 1;
  70.     if (setsockopt(broadcast_socket, SOL_SOCKET, SO_BROADCAST, &broadcast_enable, sizeof(broadcast_enable)) < 0) {
  71.         ESP_LOGE(TAG, "Failed to enable broadcasting");
  72.         close(broadcast_socket);
  73.         goto error;
  74.     }

  75.     // Send the broadcast message every BROADCAST_INTERVAL_MS milliseconds
  76.     while (1) {
  77.         // 创建一个 JSON 对象,并添加三个属性
  78.         cJSON *json = cJSON_CreateObject();
  79.         cJSON_AddStringToObject(json, "device", "EZPower");
  80.         cJSON_AddStringToObject(json, "ip", ip_addr_str);
  81.         cJSON_AddNumberToObject(json, "port", 3334);

  82.         // 将 JSON 数据转换为字符串
  83.         char *json_str = cJSON_Print(json);

  84.         ESP_LOGI(TAG, "Broadcasting message: %s", json_str);
  85.         dwin_screen_send(json_str, strlen(json_str));
  86.         int ret = sendto(broadcast_socket, json_str, strlen(json_str), 0, (struct sockaddr *)&broadcast_addr, sizeof(broadcast_addr));
  87.         if (ret < 0) {
  88.             ESP_LOGE(TAG, "Failed to send broadcast message: %d", ret);
  89.         }
  90.         cJSON_Delete(json);
  91.         free(json_str);
  92.         vTaskDelay(2000 / portTICK_PERIOD_MS);
  93.     }

  94. error:
  95.     vTaskDelete(NULL);
  96. }

  97. void app_main(void)
  98. {
  99.     //Initialize NVS
  100.     esp_err_t ret = nvs_flash_init();
  101.     if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  102.       ESP_ERROR_CHECK(nvs_flash_erase());
  103.       ret = nvs_flash_init();
  104.     }
  105.     ESP_ERROR_CHECK(ret);

  106.     ESP_LOGI(TAG, "ESP_WIFI_MODE_AP");
  107.     wifi_init_softap();

  108.     ip_addr.addr = 0xFF04A8C0;

  109.     dwin_init();

  110.     xTaskCreate(udp_server_task, "udp_server", 4096, (void*)AF_INET, 5, NULL);
  111. }
复制代码


5、总结
其实很多地方都会用到功率计,尤其是一些低功耗的产品,这个便携功率计其实就是为了记录和检验这些产品存在的。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
二哲科技,欢迎联系,帮你解决问题,为你提供方案~
VX:erzhekeji
QQ:1002866443
回复

使用道具 举报

0

主题

4

回帖

49

积分

新手上路

Rank: 1

积分
49
发表于 2024-7-3 17:06:50 | 显示全部楼层
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
发表于 2024-8-6 10:37:34 | 显示全部楼层
Adobe Illustrator这个软件不免费吧
回复

使用道具 举报

17

主题

114

回帖

1283

积分

金牌会员

Rank: 6Rank: 6

积分
1283
QQ
 楼主| 发表于 2024-8-7 09:31:46 | 显示全部楼层
lihui163 发表于 2024-8-6 10:37
Adobe Illustrator这个软件不免费吧

看怎么耍咯
二哲科技,欢迎联系,帮你解决问题,为你提供方案~
VX:erzhekeji
QQ:1002866443
回复

使用道具 举报

17

主题

114

回帖

1283

积分

金牌会员

Rank: 6Rank: 6

积分
1283
QQ
 楼主| 发表于 2024-8-8 15:55:31 | 显示全部楼层
原理图和电路工程补充。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
二哲科技,欢迎联系,帮你解决问题,为你提供方案~
VX:erzhekeji
QQ:1002866443
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-9-8 08:37 , Processed in 0.071908 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表