功能描述: 包含有杯体部分以及数据处理系统两部分。杯体部分由可变色材料制成,数据处理系统由隐藏于杯底的微型重力传感器,以及与酒杯正上方的数据显示面板部分构成。该酒杯的设计核心在其计数和变色两部分。计数部分完成原理:通过微型质量传感器感应酒杯内液体的质量,每当酒杯内的液体质量减少,当少量达到设定值12mL-8mL则数据显示面板计“1”,以此类推。变色系统原理:按照白酒的度数进行计算,2两白酒约110mL,也就是大约9杯,当本方案的酒杯数据面板显示10时,酒杯变为红色,提示喝酒过量。
第一版:
/**********************
* 项目名称:计数酒杯
* 作者:Naiva
* 时间:2020/09/03
**********************/
//#define LED_G 6
int i = 0;
int n = 0;
int m = 20;
int LED_G = 3;
int LED_Y = 5;
int LED_R = 6;
int Status = 9;
boolean flag = true;
void Count_(int a);
void Spark_LED_R();
void setup()
{
pinMode(Status,INPUT);
pinMode(LED_G,OUTPUT);
pinMode(LED_Y,OUTPUT);
pinMode(LED_R,OUTPUT);
digitalWrite(LED_G,LOW);
digitalWrite(LED_Y,LOW);
digitalWrite(LED_R,LOW);
Serial.begin(9600);
}
void loop() {
// digitalWrite(LED_G,LOW);
// digitalWrite(LED_Y,LOW);
// digitalWrite(LED_R,LOW);
Serial.print("酒杯状态(1/0):");
Serial.println(digitalRead(Status));
if((i < m) && (digitalRead(Status) == LOW))
{
while(1){
Serial.print("酒杯状态(1/0):");
Serial.println(digitalRead(Status));
Serial.print("计数器i=");
Serial.println(i);
if (digitalRead(Status) == HIGH && (flag == true))
{
i++;
delay(20);
flag = false;
}
if((digitalRead(Status) == LOW)&& (flag == false))
{
flag = true;
}
Count_(i);//判断计数器的数值点亮LED指示灯
delay(20);
}
//Serial.println(digitalRead(Status));
}
//else{flag == true;}
delay(100);
}
/*******************************************************************************
* 函数名:Count_()
* 功能:判断计数、显示对应的LED
******************************************************************************/
void Count_(int a)
{
//a = 0;
if(0<=a && a<=3)//0~3
{
digitalWrite(LED_G,HIGH);
digitalWrite(LED_Y,LOW);
digitalWrite(LED_R,LOW);
}
if(4<=a && a<=6)//4~6
{
digitalWrite(LED_G,LOW);
digitalWrite(LED_Y,HIGH);
digitalWrite(LED_R,LOW);
}
if(7<=a && a<=10)//7~10
{
digitalWrite(LED_G,LOW);
digitalWrite(LED_Y,LOW);
digitalWrite(LED_R,HIGH);
}
if(a>10)
{
Spark_LED_R();
}
}
/******************************************************************************
*
* 函数名:Spark_LED_R
* 功能: 闪烁LED_R 灯
*
******************************************************************************/
void Spark_LED_R()
{
digitalWrite(LED_R,HIGH);
delay(200);