Arduino 厨房定时器和温度计





5.00/5 (8投票s)
如何防止您的 KD 在锅里烧焦
引言
你是否曾经坐在你的焊接台旁,把意大利面放在锅里煮,却忘记关火,而感到饥饿?你最终连续几周吃冷麦片,因为消防部门警告了你的房东,没人再信任你用电热板了。至少你不用洗那么多碗,而且你在富含糖分的钙质饮食中获得了所需的核黄素和烟酸。
或者,如果你厌倦了 Frootie-O's 或者你没有牛奶了,现在你可以再次信任自己在厨房里了,这要归功于全新的、带有一个糟糕蜂鸣器的烹饪温度计。它不会切片或切丁,但它会警告你直到电池没电,然后你就只能靠自己了。
背景
我曾经烧焦过果冻......我不想谈论它。
你需要的东西
- Arduino Nano - 或其他微控制器
- OLED 128x32 屏幕
- DS18B20 防水温度传感器
- 压电蜂鸣器
- 拨动开关
- 按钮
- 电池、电线和各种电阻器
- 少许牛至
按钮控制器
该项目使用了五个按钮,它们与电阻器组合在一起,使用分压器产生不同的电压,然后微控制器通过输入模拟引脚测量这些电压。与不同按钮相关的分压器产生的不同电压水平意味着 Arduino 可以仅使用一个模拟引脚来确定按下哪个按钮。要了解更多关于此方法的信息,请查看我的Arduino 运动次数计数器文章。
Using the Code
虽然我构建这个项目一半是出于无聊,一半是因为我有一个来自我的Arduino 家庭酿酒器项目的备用温度计,但第三个原因是必要性(我用完了 Kam),这激励我最终完成所有工作。就花费的总时间而言,我估计大约花了五个小时来构建,持续了几周的时间。但随后,在我的办公桌旁……几周过去了,一切都变得模糊,所以我真的不太确定。这一切并不难,尽管 OLED 需要被告知“把它放在该死的屏幕上”,当你告诉它在哪里绘制什么但仍然看不到任何东西时,我诅咒了一段时间。
注意:如果您忽略发出命令,作者不负责您的 OLED 保持不变。
display.display();
您可能会觉得有趣的一件事是用户可以编辑的几个参数的方式。有低温、高温、定时器设置和两个屏幕命令启动和重置。五个按钮中的一个除了循环这些不同的参数之外什么也不做。当用户循环浏览这些选项时,它们依次被突出显示。以下是可用的不同选择...
#define DFN_State_EditUpper 0
#define DFN_State_EditLower 1
#define DFN_State_EditTimer_Hour 2
#define DFN_State_EditTimer_Minute 3
#define DFN_State_EditTimer_Second 4
#define DFN_State_EditTimer_Start 5
#define DFN_State_EditTimer_Reset 6
#define DFN_State_Num 7
...当做出新的选择时,所有高亮显示器都会被绘制出来,告诉用户他们将要更改哪个选项。屏幕上的所有不同区域都使用类似的 #define
预处理器标签进行映射,并且在需要绘制时调用它们自己的方法。
void EditSelector_Draw()
{
display.fillRect(0,
DFN_Th_Target_Upper_Rec_Top,
1,
DFN_Th_Target_Upper_Rec_Height,
intEditState == DFN_State_EditUpper ? WHITE : BLACK);
display.fillRect(0,
DFN_Th_Target_Lower_Rec_Top,
1,
DFN_Th_Target_Lower_Rec_Height,
intEditState == DFN_State_EditLower ? WHITE : BLACK);
display.fillRect(DFN_Ti_Hour_Rec_Left,
DFN_Ti_Hour_Rec_Top + DFN_Ti_Hour_Rec_Height,
DFN_Ti_Hour_Rec_Width,
1,
intEditState == DFN_State_EditTimer_Hour ? WHITE : BLACK);
display.fillRect(DFN_Ti_Minute_Rec_Left,
DFN_Ti_Minute_Rec_Top + DFN_Ti_Minute_Rec_Height,
DFN_Ti_Minute_Rec_Width,
1,
intEditState == DFN_State_EditTimer_Minute ? WHITE : BLACK);
display.fillRect(DFN_Ti_Second_Rec_Left,
DFN_Ti_Second_Rec_Top + DFN_Ti_Second_Rec_Height,
DFN_Ti_Second_Rec_Width,
1,
intEditState == DFN_State_EditTimer_Second ? WHITE : BLACK);
display.fillRect(DFN_Ti_Start_Left,
DFN_Ti_Start_Top + DFN_Ti_Start_Height - 1,
DFN_Ti_Start_Width ,
1,
intEditState == DFN_State_EditTimer_Start ? WHITE : BLACK);
display.fillRect(DFN_Ti_Reset_Left,
DFN_Ti_Reset_Top + DFN_Ti_Start_Height - 1,
DFN_Ti_Reset_Width ,
1,
intEditState == DFN_State_EditTimer_Reset ? WHITE : BLACK);
display.display();
}
在上图中,绿线代表用户参数编辑选择高亮显示器,它们由上面显示的 EditSelector_Draw()
绘制。
用于接受用户输入(使用按钮)的去抖动方法允许用户按住一个按钮并逐渐加速条目的速度,方法是计算在按住同一按钮时执行 loop()
方法的次数。
#define DFN_LoopDelay_Max 15
int intButtonPressed = -1;
int intButtonPressed_Last = -1;
int intLoopDelay_Max = DFN_LoopDelay_Max;
int intLoopDelay_Reset = DFN_LoopDelay_Max;
int intLoopDelay_Counter = DFN_LoopDelay_Max;
void Handle_Buttons()
{
delay(50);
intButtonPressed = GetButtonPressed();
if (intButtonPressed == intButtonPressed_Last)
{
intLoopDelay_Counter --;
if (intLoopDelay_Counter <= 0)
{
intLoopDelay_Reset -= 5;
intLoopDelay_Counter = intLoopDelay_Reset;
}
else
return;
}
else
{
intLoopDelay_Reset
= intLoopDelay_Counter
= intLoopDelay_Max;
}
intButtonPressed_Last = intButtonPressed;
历史
- 2021年8月22日:初始版本
这里没什么其他的了……现在,如果我能弄清楚煮一个两分钟鸡蛋需要多长时间……