#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED
#define BUTTON_PIN 9 // Кнопка для добавления книг
int maximumRange = 200; // Максимальная высота полки (см)
int minimumRange = 0; // Минимальная высота
long duration, distance; // Длительность и дистанция
/////////////////////////////////////////////////////////////////////
// Таблицы книг
struct shlfObject {
float height;
String name;
};
bool wasPressed = false;
bool click()
{
if(!digitalRead(BUTTON_PIN))
{
if(wasPressed)
{
return false;
}
else
{
wasPressed= true;
return false;
}
}
else
{
if(wasPressed)
{
wasPressed = false;
return true;
}
else {
return false;
}
}
}
unsigned int clickTime = 0;
unsigned int lastClickTime = 0;
const short maxTTC = 500;
const short minTTC = 30;
bool waiting = false;
int combo = 0;
int countClicks(bool click)
{
if (click)
{ // Если кнопка была нажата
clickTime = millis(); // Текущее время клика
if (waiting) { // Уже ждём следующего клика?
unsigned int tmp = clickTime - lastClickTime; // время между кликами
if (tmp < minTTC) // Если прошло меньше maxTTC
{
return 0;
}
else
{ // Если прошло больше minTTC
combo++;
lastClickTime = clickTime;
return 0; // Возвращаем количество кликов
}
} else
{ // Это первый клик?
combo ++;
waiting = true;
lastClickTime = clickTime; // Фиксируем время первого клика
return 0;
}
}
else
{
if(waiting)
{
clickTime = millis(); // Текущее время
unsigned int tmp = clickTime - lastClickTime; // время между кликами
if(tmp > maxTTC)
{
int res = combo;
combo = 0;
return res;
}
}
else
{
return 0;
}
}
return 0;
// Если кнопка не нажата или продолжаем ждать:
}
//Полки
////////////////////////////////////////////////////////////
// Функция измерения стопки
long measureHeight()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration / 58.2; // Конвертация в см
return distance;
}
// Функция ввода
String cin()
{
String smth;
while(Serial.available() <= 0)
{
delay(20);
}
smth = Serial.readString();
return smth;
}
void changeType(String& typeName, float& lenght, float& shelfHeight)
{
//Записываем название
Serial.println("Enter object type");
String name = cin();
if(name == "")
{
Serial.println("Wrong name");
return ;
}
//Измеряем высоту
unsigned int objHeight = 0;
unsigned int tmpHeight = measureHeight();
if(tmpHeight > 0)
{
objHeight = shelfHeight - tmpHeight;
typeName= name;
lenght = objHeight;
Serial.println("Type changed");
}
else
{
Serial.println("Can`t measure right height");
return ;
}
}
//Колличество предметов на полке
short countObj(shlfObject object, float& shelfHeight)
{
float height = shelfHeight - measureHeight();
return height / object.height;
}
/////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
Serial.println("Smart Shelf Initialized.");
}
shlfObject object;
float shelfHeight = measureHeight();
void loop()
{
bool cl = click();
int doubleClicks = countClicks(cl);
if(doubleClicks==1)
{
Serial.println("Click");
if(object.height != shelfHeight){
Serial.println(countObj(object,shelfHeight));
}
else{
Serial.println();
}
}
if(doubleClicks==2){
Serial.println("DoubleClick");
shelfHeight = measureHeight();
Serial.println(shelfHeight);
changeType(object.name,object.height,shelfHeight);
}
if(doubleClicks > 2){
Serial.println("MultiClick");
Serial.println(object.height);
}
delay(50);
}
// Если нужно ограничить максимальное значение, добавьте обработку