esp32 读 ds3231 时间模块 并通过pc 串口 在串口调试软件显示

参照chatgpt,软件备份,下一步用spi协议的显示屏显示。这样就学习了串口uart, i2c,spi三种通信协议。


#include <stdio.h>
#include "driver/i2c.h"
#include "esp_system.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include "driver/uart.h"
#include <string.h>
#include "driver/gpio.h"

#define UART_NUM UART_NUM_2
#define TXD_PIN  17   //17
#define RXD_PIN   16    //16
#define BUF_SIZE 1024



// I2C 配置参数
#define I2C_EXAMPLE_MASTER_SDA_IO           21  // I2C 数据引脚
#define I2C_EXAMPLE_MASTER_SCL_IO           22  // I2C 时钟引脚
#define I2C_EXAMPLE_MASTER_NUM              I2C_NUM_0
#define I2C_EXAMPLE_MASTER_FREQ_HZ          100000
#define I2C_EXAMPLE_MASTER_TX_BUF_DISABLE   0
#define I2C_EXAMPLE_MASTER_RX_BUF_DISABLE   0
#define DS3231_ADDR                         0x68  // DS3231 的 I2C 地址

#define WRITE_BIT                           I2C_MASTER_WRITE
#define READ_BIT                            I2C_MASTER_READ

void init_uart() {
    const uart_config_t uart_config = {
        .baud_rate = 115200,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE
    };
    uart_param_config(UART_NUM, &uart_config);
    uart_set_pin(UART_NUM, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
    uart_driver_install(UART_NUM, BUF_SIZE * 2, 0, 0, NULL, 0);
}


// 初始化 I2C
esp_err_t i2c_master_init() {
    esp_err_t ret;

    i2c_config_t conf;
    conf.mode = I2C_MODE_MASTER;
    conf.sda_io_num = I2C_EXAMPLE_MASTER_SDA_IO;
    conf.scl_io_num = I2C_EXAMPLE_MASTER_SCL_IO;
    conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
    conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
    conf.master.clk_speed = I2C_EXAMPLE_MASTER_FREQ_HZ;
    ret = i2c_param_config(I2C_EXAMPLE_MASTER_NUM, &conf);
    if (ret != ESP_OK) {
        return ret;
    }
    ret = i2c_driver_install(I2C_EXAMPLE_MASTER_NUM, conf.mode, I2C_EXAMPLE_MASTER_RX_BUF_DISABLE, I2C_EXAMPLE_MASTER_TX_BUF_DISABLE, 0);
    return ret;
}

// 读取 DS3231 时间
esp_err_t ds3231_read_time(uint8_t *data, size_t length) {
    esp_err_t ret;
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (DS3231_ADDR << 1) | WRITE_BIT, true);
    i2c_master_write_byte(cmd, 0x00, true);  // 从 DS3231 的寄存器 0 开始读取时间
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (DS3231_ADDR << 1) | READ_BIT, true);
    i2c_master_read(cmd, data, length, I2C_MASTER_LAST_NACK);
    i2c_master_stop(cmd);
    ret = i2c_master_cmd_begin(I2C_EXAMPLE_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);
    return ret;
}

void app_main() {
	   init_uart();
    //   uint8_t data[128];
    //   int length =100;
	 //  int len;
	
    esp_err_t ret;
    uint8_t data[7];  // DS3231 返回 7 字节数据

    // 初始化 I2C
    ret = i2c_master_init();
    if (ret != ESP_OK) {
        ESP_LOGE("I2C", "Failed to initialize I2C");
        return;
    }

    // 读取时间
	while(1){
        ret = ds3231_read_time(data, sizeof(data));
        if (ret == ESP_OK) {
           printf("DS3231 Time Data: ");
           for (int i = 0; i < 7; i++) {
              printf("%02x", data[i]);  
        }
	     uint8_t out=data[0];
		 uart_write_bytes(UART_NUM,&out,1);     //向pc串口发送秒数字
         printf("\n");
         } else {
              ESP_LOGE("DS3231", "Failed to read time");
        }

         vTaskDelay(pdMS_TO_TICKS(1000));
	}
}

 

 

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过IIC协议获取DS3231的数据,需要先连接ESP32DS3231,然后在ESP32上编写代码。 以下是获取DS3231时间数据的代码示例: ```c #include <Wire.h> //引入Wire库 #define DS3231_ADDRESS 0x68 //DS3231的I2C地址 void setup() { Wire.begin(); //初始化Wire库 Serial.begin(9600); //初始化串口通信 } void loop() { Wire.beginTransmission(DS3231_ADDRESS); //开始I2C通信 Wire.write(0); //发送寄存器地址,0表示获取秒数 Wire.endTransmission(); //结束I2C通信 Wire.requestFrom(DS3231_ADDRESS, 7); //请求取7个字节的数据 int second = Wire.read(); //秒 int minute = Wire.read(); //分 int hour = Wire.read(); //时 int dayOfWeek = Wire.read(); //星期几 int dayOfMonth = Wire.read(); //月份中的第几天 int month = Wire.read(); //月份 int year = Wire.read(); //年份 //打印获取到的时间数据 Serial.print(year); Serial.print("/"); Serial.print(month); Serial.print("/"); Serial.print(dayOfMonth); Serial.print(" "); Serial.print(hour); Serial.print(":"); Serial.print(minute); Serial.print(":"); Serial.println(second); delay(1000); //延时1秒钟 } ``` 需要注意的是,DS3231的I2C地址是0x68,可以通过Wire库的beginTransmission函数开始I2C通信,然后通过Wire.write函数发送寄存器地址,再通过Wire.requestFrom函数请求取7个字节的数据,最后通过Wire.read函数获取每个字节的数据。获取到时间数据后,可以通过串口打印出来,也可以根据需要进行其他操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值