Pokojový teploměr
Každých 10 sekund přečte hodnotu z adresy senzoru a vypíše ji na displej. Pro okrasu je zde i malá uvítací animace při zapnutí teploměru.
Cílem projektu bylo vytvořit inteligentní systém, který detekuje otevřené a zavřené dveře na základě senzoru detekce překážek a umožňuje manuální ovládání pomocí tlačítek. Tento systém je navržen tak, aby zlepšil bezpečnost a kontrolu přístupu do prostorů, kde se pohybuje VZV, aby byl řidič VZV informován zvukovou signalizací o přítomnosti osoby v konkrétním sektoru.
#include <Arduino.h> const int rele1 = 2; const int IR = 3; const int led1 = 7; const int led2 = 6; const int IN1 = 8; const int IN2 = 9; const int IN3 = 10; const int IN4 = 11; const int openbutton = 4; const int closebutton = 5; int lastsensorState = HIGH; const int stepsPerRevolution = 2048; // Počet kroků pro úplnou otáčku (pro 24BYJ48) const int stepsForOpen = 512; // Upravit podle mechaniky dveří const int stepsForClose = 512; // Upravit podle mechaniky dveří unsigned long lastDebounceTimeOpen = 0; // čas posledního stisku openbutton unsigned long lastDebounceTimeClose = 0; // čas posledního stisku closebutton const unsigned long debounceDelay = 50; // zpoždění pro debouncing v milisekundách int lastButtonOpenState = HIGH; // poslední stav tlačítka openbutton int lastButtonCloseState = HIGH; // poslední stav tlačítka closebutton // deklarace funkcí void stepForward(); void stepBackward(); void moveMotor(int steps, bool direction); void setup() { Serial.begin(9600); pinMode(rele1, OUTPUT); pinMode(IR, INPUT); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(openbutton, INPUT_PULLUP); pinMode(closebutton, INPUT_PULLUP); } void loop() { int sensorState = digitalRead(IR); int buttonOpenState = digitalRead(openbutton); int buttonCloseState = digitalRead(closebutton); if (sensorState == HIGH) { digitalWrite(rele1, LOW); digitalWrite(led1, HIGH); digitalWrite(led2, LOW); } else { digitalWrite(rele1, HIGH); digitalWrite(led1, LOW); digitalWrite(led2, HIGH); } // Výpis změny stavu na sériový monitor z IR senzoru if (sensorState == HIGH & lastsensorState == LOW) { Serial.println("Open door"); } if (sensorState == LOW & lastsensorState == HIGH) { Serial.println("Closed door"); } lastsensorState = sensorState; // Debouncing pro openbutton if (buttonOpenState != lastButtonOpenState) { lastDebounceTimeOpen = millis(); // reset debounce časovače } if ((millis() - lastDebounceTimeOpen) > debounceDelay) { if (buttonOpenState == LOW) { digitalWrite(rele1, LOW); digitalWrite(led1, HIGH); digitalWrite(led2, LOW); Serial.println("Manual door opening"); moveMotor(stepsForOpen, true); } } lastButtonOpenState = buttonOpenState; // Debouncing pro closebutton if (buttonCloseState != lastButtonCloseState) { lastDebounceTimeClose = millis(); // reset debounce časovače } if ((millis() - lastDebounceTimeClose) > debounceDelay) { if (buttonCloseState == LOW) { Serial.println("Manual door closing"); moveMotor(stepsForClose, false); } } lastButtonCloseState = buttonCloseState; } // funkce pro ovládání krokového motoru void moveMotor(int steps, bool direction) { for (int i = 0; i < steps; i++) { if (direction) { stepForward(); } else { stepBackward(); } delay(1); // Nastavení rychlosti krokování (upravit podle potřeby) } } // Sekvence pro krokování dopředu void stepForward() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(2); digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(2); digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); delay(2); digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); delay(2); } // Sekvence pro krokování dozadu void stepBackward() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); delay(2); digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); delay(2); digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(2); digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(2); }
Každých 10 sekund přečte hodnotu z adresy senzoru a vypíše ji na displej. Pro okrasu je zde i malá uvítací animace při zapnutí teploměru.
Tento projekt slouží k měření teploty, tlaku a času a k jejich zobrazení na OLED displeji. Současně data vypisuje na sériovou linku.