糖果分配器
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
应用和在线服务
|
关于这个项目
项目
这是一种创建糖果分配器的简单方法,仅使用:红外传感器、伺服器和按钮。它可以分为以下步骤:
- 制作和使用 Arduino Uno R3
- 编码和设置 Arduino
- 制作外壳和机械零件
- 安装电子设备
- 测试和使用
这是一个简短的演示视频:
编写代码对我来说是最难的部分,因为我仍然是编写代码语言的新手,但在多次错误和 Google 先生和朋友的帮助后,我设法做到了。写代码是这部分项目时间最长的。
感谢启发我做这个糖果分配器的人!这是以下的简化版本: https://www.hackster.io/gatoninja236/candy-dispenser-with-google-assistant-564724
创建盒子和机械零件
这是创建项目的有趣部分。在多次错误和不合适的部分之后,我至少花了一整天的时间才完全完成。
第一步
布局组件
这可能看起来很乱,但这是整理每个组件并测试运行每个部分以查看是否有任何错误的最简单方法。我布置了不同颜色的电线,以便于查看。我将所有组件放在一张纸板上,并找出先使用哪个。
步骤 2
创建盒子
我画了一张关于盒子应该是什么样子的技术图。大多数零件由纸板制成,有些零件由亚克力制成。然后我测量每个部分。
- 正面和背面 =20 厘米 x 16 厘米(背面是亚克力)
- 侧面 - 侧面 =12cm x 16cm
- 顶部和底部 =20 厘米 x 12 厘米
步骤 3
这是将它们全部连接在一起后的样子(首先使用遮蔽胶带)。
然后我剪掉了组件的位置:
- 液晶显示屏 =7.2 厘米 x 2.5 厘米
- 按钮 =1.2cm x 1.2cm
对于杯子:
- 长 x 高 =9 厘米 x 12 厘米
- 宽 x 深 =9cm x 9cm
不要忘记切掉传感器:
我把分配器做成阶梯状,这样糖果就不会马上掉下来:
第 4 步
我将面包板和 Arduino 放在一起。我用亚克力把它们粘在一起。这样它会节省很多空间。
第五步
开始将组件连接到板上。我从 LCD 和按钮开始。
接下来,在将所有电缆连接到组件上后,我将它们连接在盒子中间。
连接舵机:
这是从后面看的样子。我还添加了一个电源按钮来使用电池为分配器供电。
步骤 6
完成的样子。
代码
- 糖果分配器
糖果分配器Arduino
//------LIBRARIES-----#include#include #include //------LIBRARIES--- --// 将 LCD 地址设置为 0x27,用于 16 个字符和 2 行显示LiquidCrystal_I2C lcd(0x27, 16, 2);Servo myservo;int pos =90; // 伺服开始位置int buttonCLK =7; //buttonClockwise pinint buttonAntiCLK =6; //buttonAntiClockwise pin//int sensorPin =2; // 红外传感器连接到数字引脚 NO.2//int sensorState =0; // 变量sensorState 用于存储有关sensorint 状态的统计信息 set =0;const int avoidPin =5; //红外障碍传感器连接到引脚 5void setup(){ lcd.begin(); // 初始化 LCD lcd.clear(); myservo.attach(9); // 伺服数字 9 pinMode(buttonCLK, INPUT); pinMode(buttonAntiCLK, INPUT); pinMode(避免Pin,输入); //设置avoidPin为INPUT Serial.begin(9600);液晶背光(); // 打开黑光 lcd.setCursor(3,0); lcd.print("欢迎来到"); lcd.setCursor(3,1); lcd.print("糖果乐园");延迟(2000);液晶显示器(); lcd.setCursor(0,0); lcd.print("多少糖?"); lcd.setCursor(0,1); lcd.print("有点多"); delay(5000);}void loop(){ //-----------这是按钮的 IF 函数----------- if(digitalRead(buttonCLK) ==HIGH ) // buttonClockwise 被按下 { //TurnClockwise(); //传感器检测();液晶显示器(); lcd.print("请放杯子");延迟(2000);液晶显示器();设置 =设置 + 1; } if(digitalRead(buttonAntiCLK) ==HIGH) // buttonAntiClockwise 被按下 { //TurnAntiClockwise(); //传感器检测();液晶显示器(); lcd.print("请放杯子");延迟(2000);液晶显示器();设置 =设置 + 2; } if(set ==1) { IRCLK(); } if(set ==2) { IRAntiCLK(); } //-----------这是按钮的 IF 函数----------- }void TurnClockwise(){ Serial.println("Candy 1 Being Dispensed");糖果文本1(); //显示糖果类型文本 for(pos =90; pos <180; pos +=1) // 从 0 度到 180 度 { myservo.write(pos); // 告诉伺服器转到变量“pos”延迟(15)中的位置; // 等待 15 毫秒让舵机到达位置 } if(pos ==180) { delay(2000);谢谢你文本(); // 显示感谢文本 }}void TurnAntiClockwise(){ Serial.println("Candy 2 Being Dispensed"); CandyText2(); //显示糖果类型文本 for(pos =90; pos <180; pos +=1) // 从 0 度到 180 度 { myservo.write(pos); // 告诉伺服器转到变量“pos”延迟(20)中的位置; // 等待 15 毫秒让舵机到达位置 } if(pos ==180) { delay(3000);谢谢你文本(); // 显示感谢文本 } }void IRCLK(){ delay(1000); //创建一个 1 秒的延迟 boolean avoidVal =digitalRead(avoidPin); //读取pin4的值 lcd.setCursor(0,0); lcd.print("检测杯子"); lcd.setCursor(0,14); lcd.print("..."); if(avoidVal ==LOW) //如果值为低电平 { lcd.clear(); lcd.print("杯子放好");延迟(2000);顺时针转动(); }}无效IRAntiCLK(){延迟(1000); //创建一个 1 秒的延迟 boolean avoidVal =digitalRead(avoidPin); //读取pin4的值 lcd.setCursor(0,0); lcd.print("检测杯子"); lcd.setCursor(0,14); lcd.print("..."); if(avoidVal ==LOW) //如果值为低电平 { lcd.clear(); lcd.print("杯子放好");延迟(2000); TurnAntiClockwise(); } }void CandyText1(){ lcd.clear(); lcd.setCursor(4,0); lcd.print("浇注"); lcd.setCursor(1,1); lcd.print("Little Candy");}void CandyText2(){ lcd.clear(); lcd.setCursor(4,0); lcd.print("浇注"); lcd.setCursor(3,1); lcd.print("Lot Candy");}voidThankYouText(){ lcd.clear(); lcd.setCursor(5,0); lcd.print("谢谢"); lcd.setCursor(6,1); lcd.print("你");延迟(15); software_Reset();}void software_Reset() // 从头重新启动程序但不重置外设和寄存器{ asm volatile ("jmp 0"); }
示意图
看起来有点复杂,但按照颜色布线的方式。制造工艺