最近居家办公,孩子则在上网课。我总是将房门关上,然后转动我的番茄钟,使用番茄钟工作法(25分钟专注工作💨5分钟休息💨25分钟工作💨5分钟休息。。。)这种方式是我在工作上保持高效率的秘诀。
但是因为现在在家里,孩子网课课间总想找我,而且老婆也时不时想找我说点事。一开始他们都是直接敲门找我,但发现我在番茄钟时间里,就赶紧退出去了,但其实我的思路已经被打断了。这件事对于我和家人来说感受都不太好,我对于被打断感到苦恼,而老婆和孩子也会因为不敢打扰我而不来找我了,这也不是我想要的效果。毕竟我是有休息的时间,这时大家一起聊几句,玩些小游戏还是不错的体验,这才是居家办公应有的节奏。
作为一个想成为创客的人,我知道这时是要解决问题的时候了。
视频
代码
代码也放在了Github上供大家参考啦:
目录
一、选型分析
Q1 我在房间里是有一个计时器的,但是25分钟是否已结束,房间外的家人看不见。怎么样才能让他们看见呢?
A1 我需要一种方式让向面的家人看见我的时间到哪了,还要多久才会结束番茄钟时间。或者其实我已经在休息,可以大胆过来找我。所以我要有一个小小的设备放在房间外,让家人看见。
Q2 这个小设备跟我的计时器之间要怎么连接呢?我怎么样才能在房间内启动房间外的设备呢?
A2 其实这很简单,只要用无线就行了。但选用Wifi还是蓝牙?蓝牙的操作会简单得多,不用去考虑IP地址之类的,连上后就可以直接发信息了。同时,蓝牙的理论距离是10米,从房间内到房间外距离很短,中间虽然隔了墙,但厚度还好,应该不会影响到最终的传输效果。
所以,我就选用了蓝牙啦。当然也是因为这段时间在做的公交乘车相关的系统有用到蓝牙,对于蓝牙模块已经有些了解,手上也还有几个开始时买错了的CC41蓝牙模块(只是功能比较简单)也正好可以用上。
二、基本思路
🚥设备A 放在房间里我来操作,基于Arduino,使用1个按钮、1个CC41蓝牙模块、1个绿色LED、1个红色LED。(我偷懒没有加电阻)
- 设备A🚥知道设备B🧭的蓝牙模块地址,所以设备A🚥启动时直接连接设备B🧭。
- 使用者按按钮启动设备A🚥内的计时器功能,亮起红色,并通过蓝牙模块发送当前计时时间给设备B🧭。
- 当计时器正在计时的过程中,使用者按动按钮,计时器停止,亮起绿灯,并通过蓝牙模块发送0给设备B🧭。
🧭设备B 放在房间外给家人看,基于于Arduino,使用1个CC41蓝牙模块、1个基于TM1637的数码管。
- 设备B🧭收到设备A🚥发来的时间信息,并将它转化为数字,并显示到数码管上。
- 如果收到的数字为0,则显示"Done"。
三、接线图
🚥设备A
🧭设备B
四、2个关键
基于TM1637的数码管怎么用?
我手上的这个数码管其实是儿子小学时学校信息课上发的,疫情期间也没办法去买别的管,所以将就用着。
- 打开Arduino的IDE,打开菜单“工具”=>“管理库”。
- 搜索TM1637,你会发现有很多可用的库,但我选用的是TM1637这个库。(因为我已经安装了,所以“安装”按钮消失了)
- 根据代码显示,这个数码管上的CLK针接D2,DIO针接D3。
// Module connection pins (Digital Pins) #define CLK 2 #define DIO 3
- 大家可以通过找到示例去查看怎么用。
- 不想看示例的朋友,可以看一看以下我简化了的代码。
#include <TM1637Display.h> /***************************数码管开始**********************************/ // Module connection pins (Digital Pins) #define CLK 2 #define DIO 3 TM1637Display display(CLK, DIO); /***************************数码管结束**********************************/ void setup() { //将亮度设置为1 display.setBrightness(0x01); //显示“00 00” display.showNumberDecEx(0, 0, true); //显示“24:59”,64表示要显示:,true表示如果给的数字不足4位,就在前面补上0 display.showNumberDecEx(2459, 64, true); } void loop() { }
Arduino计时器怎么做?
- 打开Arduino的IDE,打开菜单“工具”=>“管理库”。
- 找到Arduino-timer,并安装
- 简化代码如下
#include <arduino-timer.h> /***************************Timer开始**********************************/ auto timer = timer_create_default(); //create a timer with default settings int theTime = 0; /***************************Timer结束**********************************/ void setup() { //设置1000毫秒(1秒)跳一次,countDown对应的是后面自定义的方法,就是每1秒运行一次这个自定义的方法 timer.every(1000, countDown); } void loop() { timer.tick();//让Timer保持变化 } /***************************Timer开始**********************************/ void countDown(void) { if (theTime > 0) { theTime--; } } /***************************Timer结束**********************************/
五、代码
🚥设备A 代码公开
#include <arduino-timer.h>
#include <SoftwareSerial.h>
/***************************蓝牙开始**********************************/
SoftwareSerial mySerial(10, 11); // RX, TX
char val; //存储接收的变量
String fromBT;
String sendStr;
/***************************蓝牙结束**********************************/
/***************************Timer开始**********************************/
auto timer = timer_create_default(); //create a timer with default settings
int theTime = 0;
/***************************Timer结束**********************************/
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
/***************************蓝牙开始**********************************/
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
connectDevice();
/***************************蓝牙结束**********************************/
pinMode(2, INPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
timer.every(1000, countDown); //Timer
}
void loop() {
if (digitalRead(2) == HIGH)
{
if (theTime > 0)
{
theTime = 0;
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
else
{
theTime = 25 * 60;
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
}
sendTime();
delay(1000);
}
if (theTime == 0)
{
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
readBT();
//将调试工具里发的内容转发给蓝牙模块
if (Serial.available()>0) {
val = Serial.read();
mySerial.write(val);
}
timer.tick();//tick the timer
}
/***************************蓝牙开始**********************************/
void readBT()
{
if (mySerial.available()>0) {
fromBT = mySerial.readString();
Serial.println(fromBT);
}
}
void connectDevice()
{
sendMessage("at+cona0x882583F3A998\r\n");
Serial.println("Try to connect to the device.");
delay(1000);
}
void sendTime()
{
sendStr = String((int)(theTime/60)*100 + theTime%60);
Serial.println(sendStr);
sendMessage(sendStr);
}
//通用的发送信息方法
void sendMessage(String msg)
{
mySerial.print(msg);
delay(100);
}
/***************************结束开始**********************************/
void countDown(void)
{
if (theTime > 0)
{
theTime--;
if (theTime%5 == 0)
{
sendTime();
}
}
Serial.println(theTime);
}
🧭设备B 代码公开
#include <Arduino.h>
#include <TM1637Display.h>
#include <SoftwareSerial.h>
/***************************数码管开始**********************************/
// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
// The amount of time (in milliseconds) between tests
#define TEST_DELAY 2000
const uint8_t SEG_DONE[] = {
SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // O
SEG_C | SEG_E | SEG_G, // n
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G // E
};
TM1637Display display(CLK, DIO);
/***************************数码管结束**********************************/
/***************************蓝牙开始**********************************/
SoftwareSerial mySerial(10, 11); // RX, TX
char val; //存储接收的变量
String fromBT;
/***************************蓝牙结束**********************************/
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Hello Thomas!");
/***************************蓝牙开始**********************************/
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
/***************************蓝牙结束**********************************/
display.setBrightness(0x01);
display.showNumberDecEx(0, 0, true);
}
void loop()
{
// display.showNumberDecEx(301, 64, true);
// delay(TEST_DELAY);
// Done!
// display.setSegments(SEG_DONE);
// delay(TEST_DELAY);
readBT();
//将调试工具里发的内容转发给蓝牙模块
if (Serial.available()>0) {
val = Serial.read();
mySerial.write(val);
}
}
/***************************蓝牙开始**********************************/
void readBT()
{
if (mySerial.available()>0) {
fromBT = mySerial.readString();
Serial.println(fromBT);
showInt(fromBT);
}
}
void showInt(String &sTime)
{
int theTime = sTime.toInt();
Serial.println(String(theTime));
if (theTime == 0)
{
// Done!
display.setSegments(SEG_DONE);
delay(TEST_DELAY);
}
else
{
display.showNumberDecEx(theTime, 64, true);
}
}
/***************************蓝牙结束**********************************/