驴友花雕 发表于 2025-5-10 15:50:44

【花雕学编程】Arduino动手做(245)--DS3231模块12个小实验

本帖最后由 驴友花雕 于 2025-5-13 19:03 编辑

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器





驴友花雕 发表于 2025-5-11 14:26:27

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之八:通过 I2C 通信 接收用户输入的时间数据并更新时钟

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之八:通过 I2C 通信 接收用户输入的时间数据并更新时钟
*/

#include <DS3231.h>// 引入 DS3231 RTC 库
#include <Wire.h>    // 引入 I2C 通信库

// **创建 DS3231 RTC 对象**
DS3231 myRTC;

// **定义时间变量**
byte year, month, date, dow;// 年、月、日、星期
byte hour, minute, second;    // 时、分、秒

bool century = false;// 用于跨世纪判断
bool h12Flag;          // 12 小时制标志
bool pmFlag;         // PM 标志(仅用于 12 小时制)

/*****************************************************************************************************
* **初始化**
*- 开启串口和 I2C 通信
*- 解释程序的使用方法
*****************************************************************************************************/
void setup() {
    Serial.begin(57600);// **初始化串口,波特率 57600**
    Wire.begin();// **启动 I2C 通信**
   
    // **等待 4 秒,确保 RTC 启动稳定**
    delay(4000);

    // **向用户解释时间格式**
    Serial.println("时间格式:YYMMDDwhhmmssx");
    Serial.println("其中:");
    Serial.println("YY = 年(如 20 表示 2020 年)");
    Serial.println("MM = 月(如 04 表示 4 月)");
    Serial.println("DD = 日期(如 09 表示 9 号)");
    Serial.println("w= 星期(1-7,1=星期天,5=星期四)");
    Serial.println("hh = 24 小时制小时数(如 09 表示上午 9 点,21 表示晚上 9 点)");
    Serial.println("mm = 分钟(如 02)");
    Serial.println("ss = 秒(如 42)");
    Serial.println("例如输入:2004095090242x");
    Serial.println("-----------------------------------------------------------------------------");
    Serial.println("请在串口输入时间,并以 'x' 结尾以设置 DS3231 的时间:");
}

/*****************************************************************************************************
* **主循环**
*- 监听串口输入的时间校正数据
*- 根据输入设置 DS3231 的时钟
*- 在 5 秒内回显 DS3231 时间
*****************************************************************************************************/
void loop() {
    // **如果串口收到输入数据,则进行时间校正**
    if (Serial.available()) {
      inputDateFromSerial();// 读取串口数据并解析时间

      myRTC.setClockMode(false);// **设置 24 小时模式**
      
      // **将输入的时间写入 DS3231**
      myRTC.setYear(year);
      myRTC.setMonth(month);
      myRTC.setDate(date);
      myRTC.setDoW(dow);
      myRTC.setHour(hour);
      myRTC.setMinute(minute);
      myRTC.setSecond(second);

      // **连续 5 秒,每秒打印 DS3231 当前时间**
      for (uint8_t i = 0; i < 5; i++) {
            delay(1000);
            Serial.print(myRTC.getYear(), DEC);
            Serial.print("-");
            Serial.print(myRTC.getMonth(century), DEC);
            Serial.print("-");
            Serial.print(myRTC.getDate(), DEC);
            Serial.print(" ");
            Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);// 24 小时制
            Serial.print(":");
            Serial.print(myRTC.getMinute(), DEC);
            Serial.print(":");
            Serial.println(myRTC.getSecond(), DEC);
      }

      // **提示用户输入新时间**
      Serial.println("请在串口输入新的时间,并以 'x' 结尾以设置 DS3231:");
    }
    delay(1000);// 每秒刷新一次
}

/*****************************************************************************************************
* **inputDateFromSerial**
*- 读取用户串口输入的时间数据
*- 解析并存储到全局变量
*****************************************************************************************************/
void inputDateFromSerial() {
    // **检查串口数据是否完整(结束字符为 'x')**
    boolean isStrComplete = false;
    char inputChar;
    byte temp1, temp2;
    char inputStr;// 存储输入的时间字符串

    uint8_t currentPos = 0;
    while (!isStrComplete) {
      if (Serial.available()) {
            inputChar = Serial.read();
            inputStr = inputChar;
            currentPos += 1;

            // **检查输入是否以 'x' 结尾**
            if (inputChar == 'x') {
                isStrComplete = true;
            }
      }
    }
    Serial.println(inputStr);// **打印用户输入的数据**

    // **查找字符串中的 'x' 位置**
    int posX = -1;
    for (uint8_t i = 0; i < 20; i++) {
      if (inputStr == 'x') {
            posX = i;
            break;
      }
    }

    // **ASCII 码 '0' 的值(用于转换字符为数字)**
    uint8_t zeroAscii = '0';

    // **解析年**
    temp1 = (byte)inputStr - zeroAscii;
    temp2 = (byte)inputStr - zeroAscii;
    year = temp1 * 10 + temp2;

    // **解析月**
    temp1 = (byte)inputStr - zeroAscii;
    temp2 = (byte)inputStr - zeroAscii;
    month = temp1 * 10 + temp2;

    // **解析日期**
    temp1 = (byte)inputStr - zeroAscii;
    temp2 = (byte)inputStr - zeroAscii;
    date = temp1 * 10 + temp2;

    // **解析星期**
    dow = (byte)inputStr - zeroAscii;

    // **解析小时**
    temp1 = (byte)inputStr - zeroAscii;
    temp2 = (byte)inputStr - zeroAscii;
    hour = temp1 * 10 + temp2;

    // **解析分钟**
    temp1 = (byte)inputStr - zeroAscii;
    temp2 = (byte)inputStr - zeroAscii;
    minute = temp1 * 10 + temp2;

    // **解析秒**
    temp1 = (byte)inputStr - zeroAscii;
    temp2 = (byte)inputStr - zeroAscii;
    second = temp1 * 10 + temp2;
}

驴友花雕 发表于 2025-5-11 17:13:14

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之九:读取当前时间、温度和闹钟状态

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之九:读取当前时间、温度和闹钟状态
*/

#include <DS3231.h>// 引入DS3231时钟库
#include <Wire.h>   // 引入I2C通信库

DS3231 myRTC;      // 创建DS3231对象
bool century = false; // 世纪标志位(20xx年为false,21xx年为true)
bool h12Flag;         // 12小时制标志
bool pmFlag;          // 下午标志(仅在12小时制下有效)
byte alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits; // 闹钟参数
bool alarmDy, alarmH12Flag, alarmPmFlag; // 闹钟日期/星期标志和12小时制标志

void setup() {
// 初始化I2C通信(SDA:A4, SCL:A5)
Wire.begin();

// 初始化串口通信,波特率57600
Serial.begin(57600);
}

void loop() {
// 向串口监视器发送当前时钟信息

// 显示年份(20xx格式)
Serial.print("2");
if (century) {      // 21世纪(此标志在未来89年内不会用到)
    Serial.print("1");
} else {
    Serial.print("0");
}
Serial.print(myRTC.getYear(), DEC);// 显示年份后两位
Serial.print(' ');

// 显示月份
Serial.print(myRTC.getMonth(century), DEC);
Serial.print(" ");

// 显示日期
Serial.print(myRTC.getDate(), DEC);
Serial.print(" ");

// 显示星期(1-7对应周日到周六)
Serial.print(myRTC.getDoW(), DEC);
Serial.print(" ");

// 显示时分秒
Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);
Serial.print(" ");
Serial.print(myRTC.getMinute(), DEC);
Serial.print(" ");
Serial.print(myRTC.getSecond(), DEC);

// 添加AM/PM指示(仅在12小时制下有效)
if (h12Flag) {
    if (pmFlag) {
      Serial.print(" PM ");
    } else {
      Serial.print(" AM ");
    }
} else {
    Serial.print(" 24h ");// 24小时制显示
}

// 显示温度(DS3231内置高精度温度传感器)
Serial.print("T=");
Serial.print(myRTC.getTemperature(), 2);// 显示温度,保留两位小数

// 显示振荡器状态(O+表示正常,O-表示振荡器可能停止)
if (myRTC.oscillatorCheck()) {
    Serial.print(" O+");// 振荡器正常工作
} else {
    Serial.print(" O-");// 振荡器可能停止,时间可能不准确
}

// 显示闹钟触发状态
if (myRTC.checkIfAlarm(1)) {
    Serial.print(" A1!");// 闹钟1触发
}

if (myRTC.checkIfAlarm(2)) {
    Serial.print(" A2!");// 闹钟2触发
}

// 换行
Serial.println();

// 显示闹钟1设置信息
Serial.print("Alarm 1: ");
myRTC.getA1Time(alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
Serial.print(alarmDay, DEC);
if (alarmDy) {
    Serial.print(" DoW");// 按星期触发
} else {
    Serial.print(" Date"); // 按日期触发
}
Serial.print(' ');
Serial.print(alarmHour, DEC);
Serial.print(' ');
Serial.print(alarmMinute, DEC);
Serial.print(' ');
Serial.print(alarmSecond, DEC);
Serial.print(' ');
if (alarmH12Flag) {
    if (alarmPmFlag) {
      Serial.print("pm ");
    } else {
      Serial.print("am ");
    }
}
if (myRTC.checkAlarmEnabled(1)) {
    Serial.print("enabled");// 闹钟1已启用
}
Serial.println();

// 显示闹钟2设置信息
Serial.print("Alarm 2: ");
myRTC.getA2Time(alarmDay, alarmHour, alarmMinute, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
Serial.print(alarmDay, DEC);
if (alarmDy) {
    Serial.print(" DoW");// 按星期触发
} else {
    Serial.print(" Date"); // 按日期触发
}
Serial.print(" ");
Serial.print(alarmHour, DEC);
Serial.print(" ");
Serial.print(alarmMinute, DEC);
Serial.print(" ");
if (alarmH12Flag) {
    if (alarmPmFlag) {
      Serial.print("pm");
    } else {
      Serial.print("am");
    }
}
if (myRTC.checkAlarmEnabled(2)) {
    Serial.print("enabled");// 闹钟2已启用
}

// 显示闹钟触发条件位(二进制格式)
Serial.println();
Serial.print("Alarm bits: ");
Serial.println(alarmBits, BIN);

// 空行分隔,每秒更新一次
Serial.println();
delay(1000);
}   

驴友花雕 发表于 2025-5-11 19:06:28

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之十一:OLED 显示日期、时间、星期和温度
*/

#include <Wire.h>               // **引入 I2C 通信库**
#include <RTClib.h>             // **引入 DS3231 RTC 库**
#include <Adafruit_SSD1306.h>   // **引入 Adafruit SSD1306 OLED 显示库**

RTC_DS3231 rtc;// **创建 DS3231 RTC 对象**

#define SCREEN_WIDTH 128// **OLED 屏幕宽度(单位:像素)**
#define SCREEN_HEIGHT 64// **OLED 屏幕高度(单位:像素)**

// **创建 OLED 显示对象,使用 I2C 进行通信**
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// **定义星期数组**
char daysOfTheWeek = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup() {
    Serial.begin(9600);// **初始化串口通信**
   
    // **初始化 OLED 显示屏**
    if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {// **设置 I2C 地址为 0x3C**
      Serial.println("SSD1306 显示屏初始化失败");
      while (true);// **进入死循环,防止继续执行错误代码**
    }

    // **清除 OLED 屏幕并显示空白**
    display.clearDisplay();
    display.display();

    // **初始化 DS3231 RTC 模块**
    if (!rtc.begin()) {
      Serial.println("找不到 RTC 模块");
      while (true);// **进入死循环,避免继续执行错误代码**
    }

    // **如果 RTC 断电,自动设置时间**
    if (rtc.lostPower()) {
      Serial.println("RTC 断电!正在设置时间...");
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));// **设置 RTC 时间为编译时系统时间**
    }

    // **如果需要手动设置时间,请取消注释以下代码**
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void loop() {
    // **从 RTC 获取当前时间**
    DateTime now = rtc.now();

    // **清除 OLED 显示缓冲区**
    display.clearDisplay();

    // **显示日期**
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.print("Date: ");
    display.print(now.year());// **打印年份**
    display.print("-");
    if (now.month() < 10) display.print("0");// **补零**
    display.print(now.month());// **打印月份**
    display.print("-");
    if (now.day() < 10) display.print("0");// **补零**
    display.print(now.day());// **打印日期**

    // **显示时间**
    display.setCursor(0, 15);
    display.print("Time: ");
    if (now.hour() < 10) display.print("0");// **补零**
    display.print(now.hour());// **打印小时**
    display.print(":");
    if (now.minute() < 10) display.print("0");// **补零**
    display.print(now.minute());// **打印分钟**
    display.print(":");
    if (now.second() < 10) display.print("0");// **补零**
    display.print(now.second());// **打印秒数**

    // **显示星期**
    display.setCursor(0, 30);
    display.print("Day: ");
    display.print(daysOfTheWeek);// **获取星期名称**

    // **显示 DS3231 传感器温度**
    display.setCursor(0, 45);
    display.print("Temp: ");
    display.print(rtc.getTemperature());// **读取温度**
    display.cp437(true);
    display.write(167);// **显示摄氏度符号**
    display.print("C");

    // **刷新 OLED 显示**
    display.display();

    delay(1000);// **每秒更新数据**
}

驴友花雕 发表于 2025-5-10 17:33:55

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块




驴友花雕 发表于 2025-5-10 17:35:21

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块






驴友花雕 发表于 2025-5-10 17:38:01

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块




驴友花雕 发表于 2025-5-10 17:40:23

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块




驴友花雕 发表于 2025-5-10 17:41:55

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块




驴友花雕 发表于 2025-5-10 17:43:22

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块




驴友花雕 发表于 2025-5-10 17:44:43

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验模块接线示意图




驴友花雕 发表于 2025-5-11 05:55:11

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

库安装
为了在我们的项目中使用 DS3231 模块,我们将使用一个名为 uRTCLib 的特殊库。该库使从 RTC 读取时间数据变得超级简单。
尽管 uRTCLib 易于使用,但它也非常强大。与许多其他 RTC 库不同,它支持昼夜闹钟,并允许您控制 SQW(方波)输出。

要安装库
1. 首先打开您的 Arduino IDE 程序。然后点击 库管理器 左侧边栏上的图标。
2. 在搜索框中键入 “urtclib” 以筛选结果。
3. 查找 Naguissa 的 uRTCLib 库。
4. 单击 Install 按钮将其添加到您的 Arduino IDE。



驴友花雕 发表于 2025-5-11 06:16:53

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之一:读取日期、时间和温度

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之一:读取日期、时间和温度
*/

#include "Arduino.h"
#include "uRTCLib.h"

// 初始化 RTC 模块(I2C 地址 0x68)
uRTCLib rtc(0x68);

// 定义星期名称数组
char daysOfTheWeek = {
    "Sunday", "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday"
};

void setup() {
    Serial.begin(9600);// 初始化串口通讯

    URTCLIB_WIRE.begin();// 初始化 I2C

    // 设置 RTC 时间(仅需要设置一次,设置后可注释掉)
    // 例如:2025年5月11日 12:56
    rtc.set(0, 00, 6, 7, 11, 5, 25);
    // rtc.set(秒, 分钟, 小时, 星期, 日期, 月份, 年份)
    // 星期: 1=星期天, 7=星期六
}

void loop() {
    rtc.refresh();// 更新 RTC 数据

    // 打印当前日期和时间
    Serial.print("Current Date & Time: ");
    Serial.print(rtc.year());
    Serial.print('/');
    Serial.print(rtc.month());
    Serial.print('/');
    Serial.print(rtc.day());
    Serial.print(" (");
    Serial.print(daysOfTheWeek);// 显示星期
    Serial.print(") ");
    Serial.print(rtc.hour());
    Serial.print(':');
    Serial.print(rtc.minute());
    Serial.print(':');
    Serial.println(rtc.second());

    // 打印温度数据
    Serial.print("Temperature: ");
    Serial.print(rtc.temp() / 100);// 温度除以 100 获取实际值
    Serial.println("°C");

    Serial.println();
    delay(1000);// 每秒更新一次
}

驴友花雕 发表于 2025-5-11 06:20:43

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

代码简单解读

这段代码使用 RTC(实时时钟)模块 获取 当前日期、时间和温度数据,并通过 串口输出,核心逻辑如下:

1. 初始化 RTC
✅ uRTCLib rtc(0x68); → 创建 RTC 对象,使用 I2C 地址 0x68
✅ URTCLIB_WIRE.begin(); → 初始化 I2C 通信
✅ rtc.set(0, 56, 12, 2, 14, 4, 25); → 设置 RTC 初始时间(只需运行一次)

2. 读取数据
✅ rtc.refresh(); → 从 RTC 读取最新数据
✅ rtc.year(), rtc.month(), rtc.day() → 获取年、月、日
✅ rtc.hour(), rtc.minute(), rtc.second() → 获取小时、分钟、秒
✅ daysOfTheWeek → 从数组获取星期名称

3. 打印时间与温度
✅ Serial.print() → 格式化打印日期、时间和星期
✅ Serial.print(rtc.temp() / 100); Serial.println("°C"); → 转换并输出温度

4. 采集间隔
✅ delay(1000); → 每秒更新一次数据

这段代码让 RTC 模块不断采集时间和温度,并在串口监视器显示。


驴友花雕 发表于 2025-5-11 06:22:32

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验串口返回情况


驴友花雕 发表于 2025-5-11 06:38:22

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验场景图


驴友花雕 发表于 2025-5-11 06:41:26

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

读取和写入板载 24C32 EEPROM 芯片,还需要安装另一个名为 uEEPROMLib 的库。


驴友花雕 发表于 2025-5-11 06:56:07

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之二:读取和写入 24C32 EEPROM

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之二:读取和写入 24C32 EEPROM
*/

#include "Arduino.h"
#include "Wire.h"
#include "uEEPROMLib.h"

// 创建 EEPROM 实例,I2C 地址为 0x57
uEEPROMLib eeprom(0x57);

void setup() {
    Serial.begin(9600);// 初始化串口通信
    Wire.begin();// 初始化 I2C 通信

    // 定义存储的数据
    int inttmp = 32123;// 整型数据
    float floattmp = 3.1416;// 浮点型数据
    char chartmp = 'A';// 单个字符
    char c_string[] = "https://mc.dfrobot.com.cn";// 长字符串
    int string_length = strlen(c_string);// 计算字符串长度

    Serial.println("写进存储记忆......");

    // **存储整型数据**
    if (!eeprom.eeprom_write(0, inttmp)) {
      Serial.println("Failed to store int.");
    } else {
      Serial.println("int was stored correctly.");
    }

    // **存储浮点型数据**
    if (!eeprom.eeprom_write(4, floattmp)) {
      Serial.println("Failed to store float.");
    } else {
      Serial.println("float was stored correctly.");
    }

    // **存储单字符**
    if (!eeprom.eeprom_write(8, chartmp)) {
      Serial.println("Failed to store char.");
    } else {
      Serial.println("char was stored correctly.");
    }

    // **存储长字符串**(从地址 33 开始,未对齐 EEPROM 32 字节页)
    if (!eeprom.eeprom_write(33, (byte *)c_string, string_length)) {
      Serial.println("Failed to store string.");
    } else {
      Serial.println("string was stored correctly.");
    }

    Serial.println("\nReading memory...");

    // **读取并打印存储数据**
    Serial.print("int: ");
    eeprom.eeprom_read(0, &inttmp);
    Serial.println(inttmp);

    Serial.print("float: ");
    eeprom.eeprom_read(4, &floattmp);
    Serial.println((float)floattmp);

    Serial.print("char: ");
    eeprom.eeprom_read(8, &chartmp);
    Serial.println(chartmp);

    Serial.print("string: ");
    eeprom.eeprom_read(33, (byte *)c_string, string_length);
    Serial.println(c_string);

    Serial.println();
}

void loop() {
    // EEPROM 只需在 setup() 进行读写,loop() 为空
}

驴友花雕 发表于 2025-5-11 07:01:02

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

本帖最后由 驴友花雕 于 2025-5-11 08:09 编辑

代码简单解读

这段代码使用 EEPROM(电子可擦除存储器) 通过 I2C 读取和存储数据,核心逻辑如下:

1. 初始化 EEPROM
✅ uEEPROMLib eeprom(0x57); → 创建 EEPROM 实例,I2C 地址为 0x57
✅ Wire.begin(); → 初始化 I2C 通信
✅ Serial.begin(9600); → 启动串口通信

2. 写入数据
✅ eeprom.eeprom_write(address, data); → 将数据存入 EEPROM
✅ 存储不同类型的数据(整型、浮点数、字符、字符串)
✅ 字符串存储 → (byte *)c_string, strlen(c_string) 确保正确写入

3. 读取数据
✅ eeprom.eeprom_read(address, &data); → 从 EEPROM 读取数据
✅ 按照原地址读出 int、float、char、string
✅ 格式化输出,确保数据存储正确

4. 循环结构
✅ loop() 为空 → 仅在 setup() 进行读写操作

这段代码让 EEPROM 通过 I2C 存储和读取数据,并在串口输出结果。




驴友花雕 发表于 2025-5-11 07:03:26

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

本帖最后由 驴友花雕 于 2025-5-11 08:09 编辑

实验串口返回情况




驴友花雕 发表于 2025-5-11 08:08:32

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之三:使用 DS3231.h 库的应用案例


安装DS3231.h 库(https://github.com/NorthernWidget/DS3231/tree/master)



驴友花雕 发表于 2025-5-11 08:15:10

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之三:使用 DS3231.h 库的应用案例

实验开源代码

/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之三:使用 DS3231.h 库的应用案例
*/

#include <Wire.h>
#include <DS3231.h>// 使用 DS3231 库

// 创建 DS3231 RTC 对象
DS3231 rtc;

void setup() {
    Serial.begin(115200);// 初始化串口通信
    Wire.begin();// 启动 I2C
}

void loop() {
    rtc.getTemperature();// 确保数据更新

    // 读取时间(确保传入参数)
    bool h12, PM_time;
    Serial.print("时间: ");
    Serial.print(rtc.getHour(h12, PM_time));
    Serial.print(":");
    Serial.print(rtc.getMinute());
    Serial.print(":");
    Serial.println(rtc.getSecond());

    // 读取日期
    bool centuryFlag;
    Serial.print("日期: ");
    Serial.print(rtc.getYear());
    Serial.print("/");
    Serial.print(rtc.getMonth(centuryFlag));
    Serial.print("/");
    Serial.println(rtc.getDate());

    // 获取 DS3231 内部温度
    Serial.print("温度: ");
    Serial.print(rtc.getTemperature());
    Serial.println("°C");

    Serial.println();// 美化输出
    delay(1000);// 每秒刷新
}

驴友花雕 发表于 2025-5-11 08:17:03

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

简单解读

这段代码使用 DS3231 实时时钟(RTC)模块 通过 I2C 通信 获取 当前时间、日期和温度,核心逻辑如下:

1. 初始化 RTC
✅ DS3231 rtc; → 创建 DS3231 实例(I2C 默认地址)
✅ Wire.begin(); → 启动 I2C 通信

2. 读取时间
✅ rtc.getHour(h12, PM_time); → 获取小时(24小时制)
✅ rtc.getMinute(); → 获取分钟
✅ rtc.getSecond(); → 获取秒

3. 读取日期
✅ rtc.getYear(); → 获取年份
✅ rtc.getMonth(centuryFlag); → 获取月份(需要参数)
✅ rtc.getDate(); → 获取当天日期

4. 读取温度
✅ rtc.getTemperature(); → 获取 DS3231 内置温度传感器的值

5. 串口输出
✅ 格式化打印时间、日期、星期和温度,确保显示清晰

6. 采集间隔
✅ delay(1000); → 每秒更新一次数据

这段代码让 DS3231 RTC 模块不断读取当前时间、日期和温度,并在串口显示。





驴友花雕 发表于 2025-5-11 08:18:08

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验串口返回情况


页: [1] 2 3
查看完整版本: 【花雕学编程】Arduino动手做(245)--DS3231模块12个小实验