Operácie

Notification System: Rozdiel medzi revíziami

Z SensorWiki

Riadok 73: Riadok 73:
  
 
* Zdroj kódu a návod kalibrácie:  https://www.youtube.com/watch?v=nGUpzwEa4vg
 
* Zdroj kódu a návod kalibrácie:  https://www.youtube.com/watch?v=nGUpzwEa4vg
 
+
* STL súbory tlačeného modelu:
 
+
    [[Médiá:DrziakDolnyDiel.zip|Držiak dolný diel]]
 +
    [[Médiá:DrziakHornyDiel.zip|Držiak horný diel]]
 +
    [[Médiá:KruzokPlatnickaSvetlo.zip|Krúžok platnička svetlo]]
 +
    [[Médiá:VelkaCast.zip|Veľká časť]]
  
 
== Analýza ==
 
== Analýza ==
Riadok 111: Riadok 114:
 
[[Súbor:VyvDiagram.png|400px]]
 
[[Súbor:VyvDiagram.png|400px]]
  
Pre fungovanie nasledujúceho kódu je potrebné importovať knižnicu [https://www.arduinolibraries.info/libraries/fast-led FastLED]
+
Pre fungovanie nasledujúceho kódu je potrebné do Arduino IDE importovať knižnicu [https://www.arduinolibraries.info/libraries/fast-led FastLED]
  
  

Verzia zo dňa a času 21:47, 4. jún 2019

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í.

Upozornenie1.jpg


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:

  1. vytlačený 3D model skladajúci sa z niekoľkých častí
  2. niekoľko drevených častí vyrezaných na laseri z preglejky, ktoré sú použité na sfunkčnenie váhového senzoru
  3. Arduino Nano
  4. 2 x AD prevodník HX711
  5. 2 x váhový senzor pre maximálnu hmotnosť 1 kg
  6. niekoľko prepojovacích káblov
  7. nepájivé kontaktné pole
  8. sirénka
  9. RGB led pásik
  10. 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:

VahovySenzor.jpg

  • na 3D tlačiarni vytlačíme model, na ktorý následne nanesieme tmel a nastriekame farbou

ModelRozklad3D.jpg

  • led pásik nalepíme po obvode miesta na pohár

LedPasikObvod.jpg

  • napájkujeme kábliky z váhového senzora na prevodník HX711 a 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

PolePeriferie.jpg

  • na váhové senzory nalepíme nosné plochy tak, aby zaťažovaný bod senzoru bol približne v strede nosných plôch a prilepíme ich do vnútra modelu (je potrebné ich vypodložkovať, aby sme dosiahli potrebnú výšku). Taktiež prilepíme aj kontaktné pole so zvyšnou elektronikou

NosnePlochy.jpg

  • všetky časti modelu dáme dokopy

HotovyModel.jpg

  • do Arduina nahráme kód (s nakalibrovanými hodnotami)


link title


Médiá:MojZdrojak.c


Použité zdroje:

    Držiak dolný diel
    Držiak horný diel
    Krúžok platnička svetlo
    Veľká časť

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 ObvodLoadCell.png

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

  • Podmienky pre modrú farbu: ak nie je na senzore pohára prítomná hmotnosť pohára, na mobile nezáleží
  • Podmienky pre zelenú farbu: ak je na senzore mobilu prítomná hmotnosť mobil a na senzore pohára hmotnosť pohára
  • Podmienky pre červenú farbu: ak na senzore mobilu nie je prítomná hmotnosť mobilu a na senzore pohára je hmotnosť pohára

Ďalej je uvedený vývojový diagram:

VyvDiagram.png

Pre fungovanie nasledujúceho kódu je potrebné do Arduino IDE importovať knižnicu FastLED


#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

program.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.