所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开
【暖冬行动】无接触测温&洗手魔盒
白凡 白凡 2020-11-13 00:14:14
9
5
简单
projectImage

【灵感来源】

       随着冬天的到来,新冠病毒在海外有一次掀起了一波大传染。国内也出现了零星的输入病例,学校里面的防控力度也逐步开始恢复。

       某次在班级里看学生排队测温以及使用免水洗洗手液时,学生一个接着一个连着去按洗手液,各种交叉接触。于是产生了一个想法,怎么让学生真正意义上的“无接触”使用洗手液呢?

projectImage

【设计原理】

       测温模块——红外线传感器反馈室温和提问,通过arduino开发板导入对应脚本,在OLED上实时显示。

       洗手模块——超声波传感器感应手靠近,在arduino开发板中导入对应脚本,控制舵机旋转实现洗手液容器自动挤压出水,同时在LCD显示器上显示提示信息。

projectImage
projectImage

【图片说明】

projectImage
projectImage
projectImage
projectImage

【模型展示】

projectImage

【视频演示】

(录了一段学生排队使用的视频,这里就不放出来了,毕竟都露脸的,涉及到学生的隐私。(放个图吧))

projectImage
材料清单 材料清单
2x
arduino开发板(nano和uno)
2x
电池组
1x
LCD显示器
1x
OLED显示器
1x
红外测温模块
1x
180度舵机
1x
超声波传感器
1x
免水洗消毒洗手液
1x
蜂鸣器

【测温部分程序】

代码 代码
	                    					#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <stdint.h>
#include <Adafruit_MLX90614.h>

#define SCREEN_WIDTH 128 // OLED屏的宽,128个像素点
#define SCREEN_HEIGHT 64 // OLED屏的高,64个像素点
#define OLED_RESET 4
 
Adafruit_SSD1306 display(OLED_RESET);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
int z = 4.0 ;

 
void setup()   
{                
  Serial.begin(9600);
  pinMode(7, OUTPUT);
  
  Serial.println("Adafruit MLX90614 test");  
  mlx.begin();  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //屏幕的IIC地址为0X3C
}
 
 
void loop() 
{


  Serial.println("Temperature from MLX90614:");
  Serial.print("Ambient:      ");
  Serial.print(mlx.readAmbientTempC());
  Serial.println(" °C");
  Serial.print("Contactless: ");
  Serial.print(mlx.readObjectTempC());
  Serial.println(" °C");
  Serial.println();
  delay(1000);


  
  display.clearDisplay(); //清屏
 
  display.setTextSize(1); //设置字体大小
  display.setTextColor(WHITE); //设置颜色
  display.setCursor(0,0);
  display.print("Ambient: ");
  display.print(mlx.readAmbientTempC()); //显示环境温度
  display.print("C");
  display.setCursor(0,10);
  display.print("Object: ");
  display.print(mlx.readObjectTempC()+ z);  //显示目标温度
  display.print("C");
  display.display();

  if(mlx.readObjectTempC()+z > 34.5 && mlx.readObjectTempC()+z<37.5)     //传感器测出的目标温度+修正值在正常体温范围
  {
          delay(10);
          tone(7, 1000);              //蜂鸣器提示
          delay(200);
          tone(7, 1200);
          delay(200);
          noTone(7);
  }
if(mlx.readObjectTempC()+z > 37.6)  //体温超过正常值
{
          delay(10);
          tone(7, 1100);              //蜂鸣器“报警”
          delay(100);
          tone(7, 1300);
          delay(100);
          tone(7, 1100);              
          delay(100);
          tone(7, 1300);
          delay(100);
          tone(7, 1100);              
          delay(100);
          tone(7, 1300);
          delay(100);
          tone(7, 1100);              
          delay(100);
          tone(7, 1300);
          delay(100);
          noTone(7);
  }

 
  delay(2000);
  
}
	                    				

【洗手部分程序】

代码 代码
	                    					#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h>
#include <Servo.h>

LiquidCrystal_I2C lcd(0x27,16,2);//0x27   0x3F

#define TRIGGER_PIN  2  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     3  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 400 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.


Servo myservo;
int pos = 0;

String returntemp = "";           //存储返回值 
int g_UTL = 0;
int shezhi = 7;                   //预设距离
int fre;//set the variable to store the frequence value

/*printf格式化字符串初始化*/
int serial_putc( char c, struct __file * )
{
  Serial.write( c );
  return c;
}
void printf_begin(void)
{
  fdevopen( &serial_putc, 0 );
}

void setup()
{
  myservo.attach(9);
  
  lcd.init(); 
  lcd.backlight();
  Serial.begin(9600);	          //波特率9600 
  printf_begin();                 //初始化printf
}


void loop() 
{   
 TP1:   
    delay(100); 
    unsigned int uS = sonar.ping();    
    g_UTL =  uS / US_ROUNDTRIP_CM;
    if (g_UTL == 0) goto TP1;   //误判
    
    lcd.setCursor(0, 0);
    lcd.print("Tips    :");
    lcd.setCursor(0, 1);
    lcd.print("             ");
    lcd.setCursor(2, 1);
    lcd.print("Close to use  ");            //提示:靠近后使用


     if(g_UTL < shezhi)         //如果检测到的超声波距离值小于设定的超声波距离值
     {
   
      delay(1000);
      lcd.setCursor(0, 0);
      lcd.print("Tips    :");
      lcd.setCursor(0, 1);
      lcd.print("                ");
      lcd.setCursor(1, 1);
      lcd.print("Please use it");           //提示:请使用
      delay(2000);
      for (pos = 0; pos <= 180; pos += 1) {        //舵机旋转从0度-180度
      myservo.write(pos);              
      delay(10);                      
  
      }
      delay(1000);
      
      for (pos = 180; pos >= 0; pos -= 1) {        // 180度-0度
      myservo.write(pos);              
      delay(10);                       

      } 

   delay(2000); 
     }
}
	                    				

PS:感谢论坛上的大佬们分享的经验,一直默默潜水学习,最近在带学生创客类项目,下一个创意尝试让学生团队自己来做做看。

Makelog作者原创文章,未经授权禁止转载。
9
5
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
[[c.comment_content]]