Parkovací Senzor
Upozornenie!! Tento projekt ešte nieje hotový, očakávajte zmeny.
Parkovacie senzory slúžia na uľahčenie parkovania najmä na miestach, kde je ledva dostatok miesta na zaparkovanie.
V novších modeloch áut už nájdeme zabudované parkovacie senzory, ale ľudia, ktorí nevlastnia také autá môžu mať niekedy problém zaparkovať do malej garáže.
Tento parkovací senzor nielen že vám pomôže zaparkovať, ale vás aj informuje aká je teplota a vlhkosť v garáži.
Použité súčiastky
Na to, aby sme vytvorili tento parkovací senzor, potrebujeme následovné:
- Arduino NANO / UNO
- HC-SR04
- 1K Rezistor
- SHT 31D
- VS 1838B a IR ovládač
- HW-456-SR505
- dátový RGB LED pás
- káble
Zapojenie
Zatiaľ čo na obrázkoch nevidno presné zapojenie, v kóde sú presne popísané zapojené piny.
Krabička
Krabičku k obvodu som navrhol v OpenSCAD programe.
Na prednej stene krabičky sú otvory pre ultrazvukový senzor a IR senzor, na ľavej stene sú otvory pre Arduino UNO vstup a na vrchu je výrez pre vedenie kabeláže z krabičky.
Výsledky
Po zapojení Arduino dosky do USB siete, sa vykoná inicializácia a vizuálny test zasvietením 15 lediek na červeno, následne zeleno a potom na modro. Po skončení inicializácie je možne IR ovládačom púštať funkcie programu.
- ">||" tlačítko spustí samotný parkovací senzor
- "EQ" tlačítko vypíše na konzolu teplotu a vlhkosť priestoru
- "0" tlačítko znovu spustí test RGB LED pásu
Po vytlačení konceptu vyzerá krabička takto:
Roadmap
Namodelovanie krabičky pre celý obvod- Schéma zapojenia
- Navrhnutie web servera pomocou ESP-8266 a ESP-01, kde budú vypísané informácie o počte zaparkovaní, teplota a vlhkosť a pod.
- (Prípadne)Implementácia časovača
- (Prípadne)Implementácia BCD displeja alebo 2-line Liquid Crystal displeja na zobrazenie teploty a vlhkosti pre rýchly prístup
- (Prípadne)iné....podľa aktuálneho nápadu
Z nápadu do reality
(SOON...)
Zdrojový kód
Upozornenie!!
Tento kód je v ALPHA fáze vývoja. Očakávajte zmeny.
#include <Arduino.h>
#include <FastLED.h>
#include <QuickStats.h>
#include <IRremote.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
QuickStats stats;
#define LED_PIN 7 //D pin LED pas
#define N_LEDS 15 //kolko bude svietit
#define M_LED 3 //D pin motion senzor
//ir ovladanie
int ir_input_pin = 2; // D2
IRrecv irrecv(ir_input_pin);
decode_results results;
//teplota vlhkost
Adafruit_SHT31 sht31 = Adafruit_SHT31(); //SCL v A5, SDA v A4
//parkovacka
int p_status = 0;
const int trigPin = 10;
const int echoPin = 9;
const int start_distance = 88; //maximum(CM)
const int stop_distance = 10; //minimum(CM)
CRGB leds[N_LEDS];
int distance = 0;
int state = (start_distance - stop_distance) / 15; //vypocet stadia polohy, urcene na moznu zmenu start a stop vzdialenosti
float duration = 0;
float durationarray[15];
/////////////////////////////////////////////////////
void led_check() { //test ci svietia vsetky ledky
for (int i = 0; i <= 14; i++) {
leds[i] = CRGB (255, 0, 0); // 15 lediek RED
FastLED.show();
}
delay(1000);
for (int i = 0; i <= 14; i++) {
leds[i] = CRGB (0, 255, 0); // 15 lediek GREEN
FastLED.show();
}
delay(1000);
for (int i = 0; i <= 14; i++) {
leds[i] = CRGB (0, 0, 255); // 15 lediek BLUE
FastLED.show();
}
delay(1000);
for (int i = 0; i <= 14; i++) {
leds[i] = CRGB (0, 0, 0); // 15 lediek nesvieti
FastLED.show();
}
}
void parking_sensor() {
for (int i = 0; i <= 14; i++) {
digitalWrite(trigPin, LOW);
delay(2);
digitalWrite(trigPin, HIGH);
delay(10);
digitalWrite(trigPin, LOW);
durationarray[i] = pulseIn(echoPin, HIGH);
}
duration = (stats.median(durationarray, 15));
//Kalkulacia vzdialenosti
distance = duration * 0.034 / 2;
Serial.println(distance);
if (distance < stop_distance) { // ak DISTANCE je mensia ako STOP
for (int i = 0; i <= 14; i++) {
leds[i] = CRGB (255, 0, 0); // 15 lediek RED
FastLED.show();
}
}
else if (distance < stop_distance + state) { //ak DISTANCE je vacsia ako STOP + STATE
for (int i = 1; i <= 14; i++) { //14 lediek nesvieti
leds[i] = CRGB (0, 0, 0);
}
for (int i = 0; i <= 0; i++) { //1 ledka YELLOW
leds[i] = CRGB (255, 255, 0);
}
FastLED.show();
delay(50); // delay je na to aby pri prechode rapidne nepreblikaval
}
else if (distance < stop_distance + state * 2) { //ak DISTANCE je vacsia ako STOP + STATE * 2
for (int i = 2; i <= 14; i++) { //13 lediek nesvieti
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 1; i++) { //2 ledky YELLOW
leds[i] = CRGB ( 255, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 3) { //ak DISTANCE je vacsia ako STOP + STATE * 3
for (int i = 3; i <= 14; i++) { //12 lediek nesvieti
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 2; i++) { //3 ledky YELLOW
leds[i] = CRGB ( 255, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < (stop_distance + state) * 4) {
for (int i = 4; i <= 14; i++) { //11 lediek nesvieti
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 3; i++) { //4 ledky GREEN
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 5) {
for (int i = 5; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 4; i++) { //5 lediek GREEN
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 6) {
for (int i = 6; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 5; i++) { //6 lediek GREEN
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 7) {
for (int i = 7; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 6; i++) { //7 lediek GREEN
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 8) {
for (int i = 8; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 7; i++) { //8 lediek GREEN
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 9) {
for (int i = 9; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 8; i++) {
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 10) {
for (int i = 10; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 9; i++) {
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 11) {
for (int i = 11; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 10; i++) {
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 12) {
for (int i = 12; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 11; i++) {
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 13) {
for (int i = 13; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 12; i++) {
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance < stop_distance + state * 14) {
for (int i = 14; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
for (int i = 0; i <= 13; i++) {
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
else if (distance >= stop_distance + state * 14) {
for (int i = 0; i <= 14; i++) { //vsetky ledky GREEN
leds[i] = CRGB ( 0, 255, 0);
}
FastLED.show();
delay(50);
}
if(digitalRead(M_LED) == LOW) { //ak Motion senzor nezisti pohyb
p_status = 0;
for (int i = 0; i <= 14; i++) {
leds[i] = CRGB ( 0, 0, 0);
}
FastLED.show();
}
}
int temp_hum() {
float temp = sht31.readTemperature();
float hum = sht31.readHumidity();
if (! isnan(temp)) {
Serial.print("Teplota: ");
Serial.print(temp);
Serial.println("°C");
} else {
Serial.println("ERROR: Nepodarilo sa zistit teplotu");
}
if (! isnan(hum)) {
Serial.print("Vlhkost vzduchu: ");
Serial.print(hum);
Serial.println("%");
} else {
Serial.println("ERROR: Nepodarilo sa zistit vlhkost vzduchu");
}
return;
}
void setup() {
Serial.begin(9600);
//setup parkovacka
pinMode(M_LED, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, N_LEDS);
//setup ovladac
irrecv.enableIRIn();
//setup teplota/vlhkost
while (!Serial)
delay(100);
if (! sht31.begin(0x44)) {
Serial.println("ERROR: Nenasiel sa SHT31 chip");
}
led_check();
}
void loop() {
if (p_status == 1) {
parking_sensor();
}
if (irrecv.decode(&results)) { //decoduje hodnotu na hex
//Serial.println(results.value);
switch (results.value) {
case 0xFF906F: //"EQ"
temp_hum();
}
if (p_status == 0) {
switch (results.value) {
case 0xFFC23D: //">||"
p_status ++;
}
}
switch (results.value) {
case 0xFF6897: //"0"
led_check();
}
irrecv.resume();
}
}