37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十四:DS1307时钟模块 Tiny RTC I2C模块 24C32存储器 时钟(带电池)
DS1307时钟模块的实验环境
1、DS1307时钟模块实验所需硬件清单
DS1307时钟模块X1
TM1637四位数码管X1
Arduino Uno开发板 X1
杜邦线 若干(备了9条)
IIC/I2C 1602 LCD液晶屏模块X1
LED发光二极管(蓝、绿色)X2
Proto Shield原型扩展板(带mini面包板)X1
程序七:查询即时时间
(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序七:查询即时时间
*/
#define countof(a) (sizeof(a) / sizeof(a[0]))
#include <Wire.h> // 导入驱动库
#include <RtcDS1307.h>
RtcDS1307<TwoWire> Rtc(Wire);
const char data[] = "现在几点?";
void setup () {
Serial.begin(57600);
Serial.print("编译:");
Serial.print(__DATE__);
Serial.println(__TIME__);
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
printDateTime(compiled);
Serial.println();
if (!Rtc.IsDateTimeValid())
{
if (Rtc.LastError() != 0)
{
Serial.print("RTC 通讯错误 =");
Serial.println(Rtc.LastError());
}
else
{
Serial.println("RTC 对 DateTime 失去信心!");
Rtc.SetDateTime(compiled);
}
}
if (!Rtc.GetIsRunning())
{
Serial.println("RTC 没有运行,现在开始");
Rtc.SetIsRunning(true);
}
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Serial.println("RTC 早于编译时间!(更新日期时间)");
Rtc.SetDateTime(compiled);
}
// 永远不要假设 Rtc 是你上次配置的,所以
// 只需将它们清除到需要的状态
Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low);
/* 注释掉第二次运行以查看信息是否长期存储 */
// 在 RTC 的内存中存储一些东西
Rtc.SetMemory(0, 13);
uint8_t written = Rtc.SetMemory(13, (const uint8_t*)data, sizeof(data) - 1); // 删除空终止符字符串 add
Rtc.SetMemory(1, written);
/* 注释掉部分结束 */
}
void loop () {
if (!Rtc.IsDateTimeValid())
{
if (Rtc.LastError() != 0)
{
Serial.print("RTC 通讯错误 = ");
Serial.println(Rtc.LastError());
}
else
{
// 常见原因:
// 设备电池电量低甚至丢失,电源线断开
Serial.println("RTC 对 DateTime 失去信心!");
}
}
RtcDateTime now = Rtc.GetDateTime();
printDateTime(now);
Serial.println();
delay(5000);
// 读取数据
// 从地址 0 获取我们存储数据的偏移量
uint8_t address = Rtc.GetMemory(0);
if (address != 13)
{
Serial.println("地址不匹配");
}
else
{
// 从地址 1 获取数据的大小
uint8_t count = Rtc.GetMemory(1);
uint8_t buff[20];
// 从给定大小的地址获取我们的数据
uint8_t gotten = Rtc.GetMemory(address, buff, count);
if (gotten != count ||
count != sizeof(data) - 1) // 移除多余的空终止符字符串 add
{
Serial.print("有些东西不匹配,count = ");
Serial.print(count, DEC);
Serial.print(", 得到 = ");
Serial.print(gotten, DEC);
Serial.println();
}
Serial.print("数据读取 (");
Serial.print(gotten);
Serial.print(") = \"");
for (uint8_t ch = 0; ch < gotten; ch++)
{
Serial.print((char)buff[ch]);
}
Serial.println("\"");
}
delay(5000);
}
void printDateTime(const RtcDateTime& dt)
{
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
dt.Month(),
dt.Day(),
dt.Year(),
dt.Hour(),
dt.Minute(),
dt.Second() );
Serial.print(datestring);
}
(2)实验串口返回情况
程序八:使用OLED有机屏显示时间
(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序八:使用OLED有机屏显示时间
*/
#include <SPI.h> //导入驱动库
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"
#define SCREEN_WIDTH 128 // OLED 显示宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED 显示高度,以像素为单位
// 连接到 I2C 的 SSD1306 显示器的声明(SDA、SCL 引脚)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, 4);
RTC_DS1307 RTC;
void setup() {
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
/ 地址 0x3C 为 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
delay(1000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 11);
// D显示静态文本
display.println("Digital Clock");
display.display();
delay(1000);
display.clearDisplay();
}
void loop() {
display.setTextSize(1);
DateTime now = RTC.now();
display.setCursor(40, 30);
display.setTextSize(1);
display.print(now.day());
display.print('/');
display.print(now.month());
display.print('/');
display.print(now.year());
display.print(' ');
display.setCursor(40, 40);
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());
delay(1000);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(10, 4);
// 显示静态文本
display.println("Digital Clock");
display.display();
delay(1000);
}
(2)实验场景图
程序九:使用1602 LCD屏显示日期和时间
(1)实验接线示意图
(2)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序九:使用1602 LCD屏显示日期和时间
*/
#include <Wire.h>
#include <DS1307.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// 运行 ic2_scanner sketch 并获取 IC2 地址,这个例子中是 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);
DS1307 rtc; // 初始化 RTC
void setup() {
//初始化串口
Serial.begin(9600);
lcd.init(); //初始化液晶屏
while (!Serial); //等待串口连接
//init RTC
Serial.println("Init RTC...");
rtc.begin();
//初始化实时时钟
rtc.set(0, 36, 17, 10, 04, 2022);//手动设置秒、分、时、日、月、年
//停止/暂停RTC
// rtc.stop();
//启动实时时钟
rtc.start();
}
void loop() {
uint8_t sec, min, hour, day, month;
uint16_t year;
//从RTC获取时间
rtc.get(&sec, &min, &hour, &day, &month, &year);
//serial output
Serial.print("nTime: ");
Serial.print(hour, DEC);
Serial.print(":");
Serial.print(min, DEC);
Serial.print(":");
Serial.print(sec, DEC);
Serial.print("nDate: ");
Serial.print(day, DEC);
Serial.print(".");
Serial.print(month, DEC);
Serial.print(".");
Serial.print(year, DEC);
// set cursor to first line
lcd.setCursor(5, 0);
lcd.backlight();
lcd.print("Hello!");
lcd.setCursor(1, 1);
lcd.print("MICRODIGISOFT");
//等一下
delay(10);
lcd.clear(); //LCD显示日期与时间
lcd.setCursor(1, 0);
lcd.print("Date:");
lcd.print(day);
lcd.print("/");
lcd.print(month);
lcd.print("/");
lcd.print(year);
lcd.setCursor(1, 1);
lcd.print("Time:");
lcd.print(hour);
lcd.print(":");
lcd.print(min);
lcd.print(":");
lcd.print(sec);
delay(1000);
lcd.clear();
}
(3)实验场景图