[创意]桌面式喝水提醒装置

2015-11-7 11:06:40天气
56593
秋冬季节天气干燥,当人感觉到口渴时身体已经严重缺水了。
我们可以利用压力传感器实时监控常用的水杯水量变化,通过一些算法换算出身体是否需要补充水分了。
preview.jpg


准备材料
1.jpg

Me Orion 主控板 x1
Me RGB LED模块 x1
Me RJ25适配器 x1
HX711AD模块 x1
电阻应变式压力传感器 x1
U1连接片 x1
7x9连接片 x2
双孔梁0824-80 x1
单孔梁0808-136 x2
母对母杜邦线 x8
铜螺柱M4 x6
螺丝M4 x14

搭建步骤
HX711AD采集放大器,用于采集压力传感器微弱的形变数据
2.jpg
压力传感器量程范围0-1Kg
3.jpg

压力传感器悬空固定在连接片上

4.jpg
安装电子模块
6.jpg
放水杯的小平台,底部固定在压力传感器上沿。
5.jpg
完整结构
7.jpg

压力传感器接Port 3口,RGB LED模块接Port 6口

Arduino源代码
[C++] 纯文本查看 复制代码
#include "MeOrion.h"#include "HX711.h"
// HX711.DOUT  - pin #
// HX711.PD_SCK - pin #
MePort port(PORT_3);
int s1 = port.pin1();
int s2 = port.pin2();
HX711 scale(s1, s2);
MeRGBLed led(PORT_6);
void setup() {
  Serial.begin(115200);
  scale.set_scale(2280.f);
  scale.tare();  
}

int waterStatus = 2;
long prevTime = 0;
bool prevTouch = false;
int gray = 0;

float j, f, k;
long checkTime = 0;
int EMPTY_CUP = 0;
int WEIGHT_CUP = 1;
int cups = 0;
float weight = 0;
float weights[20];
float waterPerformance = 800;
void loop() {
  if(millis()-checkTime>1000){
    weight = scale.get_units();
    if(weight<100){
      waterStatus = EMPTY_CUP;
    }else{
      waterStatus = WEIGHT_CUP;
      for(int i=0;i<19;i++){
        weights = weights[i+1];
      }
      weights[19] = weight;
      if(cups>19){
        waterPerformance -= 0.2;
        if(waterPerformance<500){
          waterPerformance = 500;
        }
        parseWeight();
      }else{
        cups++;
      }
    }
    checkTime = millis();
    Serial.println(weight);
  }
  if(waterStatus==EMPTY_CUP){
    lightOff();
  }else if(waterStatus==WEIGHT_CUP){
    colorloop();
  }
}
void parseWeight(){
  int i,maxIndex,minIndex;
  float maxWeight = 0.0;
  float minWeight = 1000.0;
  for(i=0;i<20;i++){
    if(weights>maxWeight){
      maxWeight = weights;
      maxIndex = i;
    }
    if(weights<minWeight){
      minWeight = weights;
      minIndex = i;
    }
  }
  if(maxIndex<minIndex){
    if(maxIndex<10){
      float w = 0;
      for(i=minIndex;i<20;i++){
        w += weights/(20-minIndex);
      }
        waterPerformance += (maxWeight-w)*2.5; 
        for(i=0;i<20;i++){
          weights = 0;
        }
        cups = 0;
    }
  }
}
void lightOff(){
  led.setColor(0,0,0);
  led.show();
}
void lightOn(){
  led.setColor(128,128,128);
  led.show();
}
void colorloop(){
  if(micros()-prevTime>30000){
    prevTime = micros();
    uint8_t red  = (1000-waterPerformance) * (1 + sin(j / 4.0) )/25;
    uint8_t green = (waterPerformance-500) * (1 + sin(f / 9.0 + 2.1) )/25;
    uint8_t blue = 0 * (1 + sin(k / 14.0 + 4.2) );
    led.setColor(red, green, blue);
    led.show();
    j += random(1, 6) / 6.0;
    f += random(1, 6) / 6.0;
    k += random(1, 6) / 6.0;
  }
}

完整代码下载:Github
效果
end.jpg
按照白天8小时工作喝水1000ml,平均1小时喝100ml的水。当然还有通过饮食补充的水分。当检测到1小时水量变化没有超过100ml,水杯下部的LED灯闪烁红光,当补充了足够的水分后会闪烁绿光。








收藏
3 条回帖
大连林海论坛元老2015-11-7 11:12:53
人体红外还是?
虎子哥管理员2015-11-7 12:00:14

称重传感器
SNOOBY新手会员2016-3-22 12:02:45
有创意
需要登陆后才可进行回复 登录

返回顶部
现在加入我们,注册一个账号 账号登陆 QQ账号登陆 微博账号登陆