esp32-c3 Supermini 驱动ds3121的问题
c3 驱动ds3121 ,始终有问题,但把程序用esp32上,一点问题都没有,难道c3 的i2c库是另外的库,
下图只读取秒显示的 错误数据,更换了scl频率,针脚,还是错,但换成esp32 输出是正确连续秒数。折腾了一天,没有发现问题
后面又试了一下c3驱动i2c光传感器gy-30,能正常读出数据。
在查错中发现一个问题,如果idf抱错显示jbk编码问题,有可能是数据线松动重插一下就排除了,这个现象很奇怪。
图片
代码
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_http_server.h"
#include "esp_timer.h"
// WiFi
#define WIFI_SSID "ChinaNet-AETP5V"
#define WIFI_PASS "wf123456"
//=================================
#include "driver/gpio.h"
#include "freertos/task.h"
#include "string.h"
#include "driver/i2c.h"
#include "sdkconfig.h"
#include <stdio.h>
#include "esp_system.h"
#include "esp_log.h"
#define I2C_MASTER_SCL_IO 20
#define I2C_MASTER_SDA_IO 21
#define I2C_MASTER_NUM I2C_NUM_0
#define I2C_MASTER_FREQ_HZ 100000
#define I2C_MASTER_TX_BUF_DISABLE 0
#define I2C_MASTER_RX_BUF_DISABLE 0
#define DS3231_ADDRESS 0x68 // 68
// I2C 初始化
void i2c_master_init() {
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.scl_io_num = I2C_MASTER_SCL_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
};
ESP_ERROR_CHECK(i2c_param_config(I2C_MASTER_NUM, &conf));
ESP_ERROR_CHECK(i2c_driver_install(I2C_MASTER_NUM, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0));
}
//==========================
static EventGroupHandle_t s_wifi_event_group;
static const int WIFI_CONNECTED_BIT = BIT0;
static const char *TAG = "WiFi_HTTP";
static uint64_t n;
//
static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect(); //
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
esp_wifi_connect(); //
ESP_LOGI(TAG, "...");
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG, "IP: " IPSTR, IP2STR(&event->ip_info.ip));
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); // λ
}
}
// WiFi
void wifi_init_sta(void) {
s_wifi_event_group = xEventGroupCreate(); //
// NVS
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
// WiFi
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, NULL));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, NULL));
// WiFi
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PASS,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); //
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start()); // WiFi
ESP_LOGI(TAG, "WiFi ");
}
// 浏览器向esp32 GET信息
esp_err_t hello_get_handler(httpd_req_t *req) {
// ESP_LOGI(TAG, "Requested URI: %s", req->uri); //显示浏览器向esp32 http server 发送的信息 可以把uri的信息提取出来 控制esp32 如uri中有ds3231 则esp32控制ds3231
// ESP_LOGI(TAG, "Requested Method: %s", http_method_str(req->method));
// ESP_LOGI(TAG, "Requested URI: %d", req->content_len);
// n=esp_timer_get_time(); //esp32 从开机到运行此命令的时间(微秒)
i2c_cmd_handle_t cmd;
uint8_t data[3]={0,0,0};
uint8_t o;
uint8_t om;
uint8_t omh;
uint8_t oml;
cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (DS3231_ADDRESS << 1) | I2C_MASTER_WRITE, true);
i2c_master_write_byte(cmd, 0x00, true);
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (DS3231_ADDRESS << 1) | I2C_MASTER_READ, true);
i2c_master_read(cmd, data, 3, I2C_MASTER_ACK);
i2c_master_stop(cmd);
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
om=data[0];
omh=(om>>4)&0b00001111;
oml=om&0b00001111;
o=omh*10+oml;
printf("%d\n",o);
char resp_str[21]; // uint64_t 的最大长度是 20 位,加上结尾的 null 字符
sprintf(resp_str, "%u", o);
// snprintf(resp_str, sizeof(resp_str), "%llu", n); // 使用 snprintf 将 uint64_t 转换为字符串
httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); // 允许所有来源,此条非常重要
httpd_resp_set_type(req, "text/plain");
httpd_resp_send(req, resp_str, HTTPD_RESP_USE_STRLEN); //esp32 向浏览器发送
return ESP_OK;
}
// URI
httpd_uri_t hello = {
.uri = "/time",
.method = HTTP_GET,
.handler = hello_get_handler,
.user_ctx = NULL
};
// HTTP
static httpd_handle_t start_webserver(void) {
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
httpd_handle_t server = NULL;
if (httpd_start(&server, &config) == ESP_OK) {
httpd_register_uri_handler(server, &hello); //
}
return server;
}
void app_main(void) {
i2c_master_init();
// WiFi
wifi_init_sta();
// WiFi
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY);
if (bits & WIFI_CONNECTED_BIT) {
ESP_LOGI(TAG, "WiFi ok");
// HTTP
start_webserver();
} else {
ESP_LOGI(TAG, "WiFi no");
}
}
原文地址:https://blog.csdn.net/m0_59802969/article/details/143083227
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!