Blikajúca vežička pre mačky
Zo stránky SensorWiki
Autor: | Viktor Lučkanič | |
Študijný odbor: | Robotika a kybernetika | 3. Bc. (2019) |
Opis projektu
Cieľom projektu je vytvoriť model úložného priestoru v aute, konkrétne obsahuje miesto na mobil a miesto na vodu/pohár. Pri simulovanom odchode človeka z auta (zoberie mobil), ho notifikačný systém v prípade zabudnutia vecí na to svetelne aj zvukovo upozorní.
Prečo?
V budúcnosti, teda o 20 - 30 rokov sa predpokladá, že bude naplno fungovať "carsharing", teda zdieľanie áut. Auto teda za jeden deň môže zmeniť hneď niekoľko používateľov. Práve na zabezpečenie komfortu a čistoty pri používaní takýchto áut sa môže využiť tento notifikačný systém, ktorý upozorní užívateľa na znečistenie auta pri odchode.
Ako ?
Na výrobu modelu budeme potrebovať nasledujúce komponenty:
- vytlačený 3D model skladajúci sa z niekoľkých častí
- niekoľko drevených častí vyrezaných na laseri z preglejky, ktoré sú použité na sfunkčnenie váhového senzoru
- Arduino Nano
- 2 x AD prevodník HX711
- 2 x váhový senzor pre maximálnu hmotnosť 1 kg
- niekoľko prepojovacích káblov
- nepájivé kontaktné pole
- sirénka
- RGB led pásik
- USB mini kábel na napájanie
Postup výroby:
- ako prvé si na laseri vyrežeme kusy z preglejky (pre každý senzor obdĺžnik 5 x 10 cm, kruh spriemerom 7 cm a dve kúsky 2.5 x 1 cm) na zostavenie váhového senzoru a zlepíme ich dokopy ako vidíme na obrázku:
- napájkujeme kábliky z váhového senzora na prevodník HX711
- podľa schémy v časti "Popis riešenia" zapojíme Arduino Nano a všetky periférie do nepájivého kontaktného poľa
- na 3D tlačiarni vytlačíme model, na ktorý následne nanesieme tmel a nastriekame farbou
- váhové senzory prilepíme do vnútra modelu, aby ich snímače boli približne v strede nosných plôch. Taktiež prilepíme aj kontaktné pole so zvyšnou elektronikou
- na snímače nalepíme nosné plochy modelu (je treba vypodložkovať ich, aby sme dosiahli potrebnú výšku)
- led pásik nalepíme po obvode miesta na pohár
- v tejto fáze nakalibrujeme oba snímače podľa návodu
- do Arduina nahráme kód (s nakalibrovanými hodnotami)
![](/sensorwiki/images/thumb/c/c6/MojObrazok2.jpg/300px-MojObrazok2.jpg.png)
Použité zdroje:
- Zdroj kódu a návod kalibrácie: https://www.youtube.com/watch?v=nGUpzwEa4vg
Analýza
V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje, ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:
- popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
- obrázok zapojenia vývodov použitej súčiastky
- odkaz na katalógový list
- priebehy dôležitých signálov
- este jedna polozka
Popis riešenia
Ako hlavný riadiaci prvok bolo použité Arduino Nano, na ktoré boli pripojené ďalšie periférie. Boli použité 2 váhové senzory spolu s dvoma prevodníkmi, ktoré zabrali na Arduine každé po 2 digitálne piny. Ďalej bola pripojená jedna sirénka na jeden digitálny pin a taktiež RGB led pásik so samostatne adresovateľnými ledkami s jedným dátovým vstupom.
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru (nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.
Schéma zapojenia Arduina s perifériami
![](/sensorwiki/images/thumb/2/2b/ObvodLoadCell.png/900px-ObvodLoadCell.png)
Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo nahrať už aspoň 10 študentov.
![](/sensorwiki/images/thumb/3/31/MojObrazok.jpg/250px-MojObrazok.jpg)
Algoritmus a program
Program bol vytvorený v prostredí Arduino IDE 1.8.8. Ako základ bol použitý kód s návodom na kalibráciu váhového senzoru uvedený v zdrojoch ako Zdroj kódu. Celý program sa skladá z 3 zdrojových súborov (dve pôvodné a jeden mnou upravený a doplnený). Mnou písaný súbor je LoadCell.ino.
Algoritmus
- vo funkcii setup() je nastavený výstupný pin pre led pásik a pre sirénku
- vo funkcii loop() sa pravidelne kontroluje váha na daných senzoroch a podľa toho sa ledky rozsvietia želanou farbou podľa podmienok nasledovne:
- ak je na senzore mobilu prítomný mobil a na senzore pohára je pohár rozsvietia sa na zeleno
- ak na senzore mobilu nie je prítomný mobil a na senzore pohára je pohár ledky blikajú na červeno a sirénka vydáva pipanie.
- ak na senzore pohára nie je nič tak ledky svietia na modro
Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili. Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu. Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.
Vyberte podstatné časti zdrojového kódu, použite na to prostredie source:
#define FASTLED_INTERRUPT_RETRY_COUNT 0
#define FASTLED_ESP8266_RAW_PIN_ORDER
#include "HX711.h"
#include <FastLED.h>
#define NUM_LEDS 8
HX711 cellM(9, 10); //DT,SCK //senzor pre mobil
HX711 cellP(4, 5); //DT,SCK //senzor pre pohar
CRGB leds[8];
const int ledPin = 7;
const int sirenPin = 12;
const int mobil = 80;
const int pohar = 15;
const int rychlost = 4;
const int krok = 1;
//long val=0;
long valM = 0;
long valP = 0;
float count = 0;
float vahaM = 0;
float vahaP = 0;
void setup() {
Serial.begin(9600);
FastLED.addLeds<WS2812B, ledPin, RGB>(leds, NUM_LEDS);
pinMode(sirenPin, OUTPUT);
}
void loop() {
char farba ;
int pocetCImp = 0;
while (1) {
count = count + 1;
//vyrazy na kalibraciu vahovych senzorov
//val = ((count-1)/count) * val + (1/count) * cellP.read(); // dlhodoby priemer
//val = 0.8 * val + 0.2 * cell.read(); // kratkodoby priemer
valM = cellM.read(); // most recent reading
valP = cellP.read(); // most recent reading
//vypocet aktualnej vahy na senzoroch v [g]
vahaM = ((valM - 8572579) / 31748.0f) * 32.6;
vahaP = ((valP - 8230240) / 33190.0f) * 32.6;
Serial.print("Mobil: ");
Serial.print(vahaM);
Serial.print(" [g] \t\t");
Serial.print("Pohar: ");
Serial.print(vahaP);
Serial.println(" [g]");
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// situacia ked je tam mobil a aj pohar
if (vahaM > mobil && vahaP > pohar) { //ZELENA ZIADANA
if (farba != 'z') {
if (farba == 'm') {
for (int j = 255; j >= 0; j -= krok) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(0, 0, j); //MODRA stmievanie //GRB
}
FastLED.show();
delay(rychlost);
}
}
for (int j = 0; j <= 255; j += krok) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(j, 0, 0); //ZELENA rozsvecovanie //GRB
}
FastLED.show();
delay(rychlost);
}
}
farba = 'z';
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// situacia ked mobil nie je na mieste a pohar je
} else if (vahaP > pohar && vahaM < mobil) { //CERVENA ZIADANA
pocetCImp = 0;
if (farba != 'c') {
for (int j = 255; j >= 0; j -= krok) {
for (int i = 0; i < NUM_LEDS; i++) {
if (farba == 'm') {
leds[i] = CRGB(0, 0, j); //MODRA stmievanie //GRB
}
else if (farba == 'z') {
leds[i] = CRGB(j, 0, 0); //ZELENA stmievanie //GRB
}
}
FastLED.show();
delay(rychlost);
}
// blikanie cervenej
while (1) { //cervena
if (pocetCImp > 1) {
siren();
}
for (int j = 0; j <= 255; j += krok) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(0, j, 0); //CERVENA rozsvecovanie
}
FastLED.show();
delay(rychlost);
}
if (pocetCImp > 1) {
siren();
}
for (int j = 255; j >= 0; j -= krok) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(0, j, 0); //CERVENA stmievanie
}
FastLED.show();
delay(rychlost);
}
pocetCImp++;
// kontrola vahy pre vyskocenie z cyklu blikania cervenej
valM = cellM.read(); // most recent reading
valP = cellP.read(); // most recent reading
vahaM = ((valM - 8572579) / 31748.0f) * 32.6;
vahaP = ((valP - 8230240) / 33190.0f) * 32.6;
Serial.print("Mobil: ");
Serial.print(vahaM);
Serial.print(" [g] \t\t");
Serial.print("Pohar: ");
Serial.print(vahaP);
Serial.println(" [g]");
if (vahaM > mobil || vahaP < pohar) {
break;
}
}
pocetCImp = 0;
farba = 'c';
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// situacia ked pohar nie je pritomny, na mobile nezalezi
} else { //MODRA ZIADANA
if (farba != 'm') {
if (farba == 'z') {
for (int j = 255; j >= 0; j -= krok) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(j, 0, 0); //ZELENA stmievanie //GRB
}
FastLED.show();
delay(rychlost);
}
}
for (int j = 0; j <= 255; j += krok) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(0, 0, j); //MODRA rozsvecovanie //GRB
}
FastLED.show();
delay(rychlost);
}
farba = 'm';
}
}
}
}
//funkcia pipania sireny
void siren() {
digitalWrite(sirenPin, HIGH);
delay(50);
digitalWrite(sirenPin, LOW);
delay(50);
digitalWrite(sirenPin, HIGH);
delay(50);
digitalWrite(sirenPin, LOW);
}
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
Zdrojový kód: serial.h a main.c
Výsledok
Nezabudnite zdokumentovať výsledok vašej práce. Určite sem patria fotografie, video a zhodnotenie ako ste spokojní s výsledkom,
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.