厕所状态指示旋转牌

给卫生间门外做了一个旋转指示牌,arduino pro mini读取屋内的光敏电阻阻值判断光线亮度,来旋转屋外的指示牌,显示‘使用中’或者‘空闲’两种状态。

自己设计打印了支架,对建模软件更加熟悉了,还巧妙的用光敏电阻替换了之前充电器上的指示灯,插在厕所内的墙上,将电源和传感器合二为一😎。

控制六颗红色led状态灯用了一个relay,可能有些overkill了,还有如果只是180度旋转状态盘的话,步进电机应该完全能用servo代替掉,下次多买些。这次电路图用fritzing画的,感觉挺专业,还把代码和3d模型文件都传到了github,方便以后迭代,链接:https://github.com/hardihuang/toilet-light-rotating-sign

 

一个5V 500mA的旧充电头,把指示灯换成了光敏电阻,然后usb的两根线供电,另外一根走光敏电阻的信号线,好巧妙!

version 1.0


这是可怜的第一版,字都是手写上去的,就是为了看下效果

白板设计图,当初想“使用中”三个字用led灯拼出来,但发现电流太大,而且因为在转的盘上,空间也不允许,最后决定在顶部照几个红色led代替

这是最初的设计思路,当时计划用类似大广告牌的那种trivision billboard的那种原理去做,最后发现机械传动部分太复杂,目前阶段还无法完成,所以换成了旋转式的

 


代码部分:


#include "Stepper.h"

//stepper setting
#define STEPS 32 // Number of steps per revolution of Internal shaft
int Steps2Take; // 2048 = 1 Revolution
Stepper small_stepper(STEPS,3, 5, 4, 6);

//photocell setting
int photocellPin = 3;
int photocellReading;
int lightOnValue=200;

//global setting
int peopleState = false;
int ledRelay = 10;

void setup(){
Steps2Take = 1024;
pinMode(ledRelay,OUTPUT);
digitalWrite(ledRelay,1); //turn of the relay
//Serial.begin(9600);
}

void loop(){
photocellReading = analogRead(photocellPin);
//Serial.println(photocellReading);

if(photocellReading > lightOnValue && peopleState ==false){ //toilet light on
peopleState = true;
small_stepper.setSpeed(700); //Max seems to be 700
small_stepper.step(Steps2Take);
delay(800);
digitalWrite(ledRelay,0);
}else if(photocellReading < lightOnValue && peopleState ==true){ //toilet light off
delay(5000);
peopleState = false;
small_stepper.setSpeed(700); //Max seems to be 700

digitalWrite(ledRelay,1);
small_stepper.step(-Steps2Take);

}
}

 

遇到的问题:


  • 夏天写的代码,lightOnValue=200 这个值设置的是在当时的光照强度下、温度下实验出来的,但到了冬天,气温变了,光照强度变了,自然这个数值也应该相应变化,所以或许可以设置一个button,每过一段时间按下自动校准一下,相当于一个学习的功能,黑暗的时候按下记录一个数值,开灯的时候再按下记录下来,然后取两个数值的平均值作为这个lightOnValue的新值,这样的话就需要用到eeprom存储光照数据了
  • 转盘没有机械结构的反馈,所以有时候会糊涂,转到一半就停了,所以应该给转盘加一个限位开关,让系统知道当前转盘转到什么位置了,这样不管开机时转盘在什么位置,都可以自动归位,也不会很尴尬的出现转一般的情况了

“厕所状态指示旋转牌”的一个回复

发表回复