迪文科技论坛

 找回密码
 立即注册
搜索
查看: 292|回复: 0

【2024.6.29获奖项目】便携功率计

[复制链接]

567

主题

167

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11957
发表于 2024-7-2 10:10:32 | 显示全部楼层 |阅读模式
【开源】便携功率计

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

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



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




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





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



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













4.代码设计
这次代码只有ESP32,ESP32通过IIC采集INA226的数据,电流,电压和功率,将以上数据通过串口发送给迪文屏,同时通过UDP将数据发送至上位机。主要代码如下:

  1. <font face="宋体">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. }</font>
复制代码

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

演示视频效果:



备注说明:如需源码,请参考此链接:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=10600&extra=&_dsign=e227a7c6



本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 04:11 , Processed in 0.088782 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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