Faktycznie może poszedłem za daleko. Ale wykonalne to to jest. Tylko faktycznie po co więc dzięki za umycie głowy.
Ale poniżej przedstawie mój pomysł jakby to można było zrobić. Od taka inwecja twórcza (teoria).
Pomysł na spłuczkę to czujnik zbliżeniowy. Jak wykryje zbliżenie trwające dłuzej niż
np. 15 sekund (kwestia testu-okreslienie czasu minimalnego) to po tym jak stwierdzi brak osoby to uruchamia serwo co spłucze wodę.
dodano po jakimś czasie...
Jeśli chodzi o kran.
To 2 opcje.
1. Tylko uruchamianie kranu
czyli elektro zamór zamontowany za mieszaczem (a mieszacz manulany-ręczne-stałe ustawienie temeratury)
sterowany czujnikiem zbliżeniowy.
2. Druga wersja to dodatkowe
dwa serwa które sterują przepływem wody ciepłej i zimnej
sterowane dwoa czujnikami zbliżeniowymi na scianie przed kranem
trzymy ręke z prawe strony temp do góry z lewj do dołu
do tego jakiś wyświetlacz na którym mamy ustawioną temeperturę.
PS.
Myśl obsługi kranu miała na celu aspekt ekonomiczy
dzieciaki jak myją zęby itd to woda się leje i leje...
Czy do obługi każdego z pokoii jako baza najlepsze będzie D1 R1 opartej o moduł WIFI ESP8266 czy jest jakaś lepsza platforma do tego
w dobrych pieniążkach?
dodano po jakimś czasie...
Trochę pokombinowałem z kodem.
Ale nie działa mi jedna rzecz
2 roleta nie chce iść do dołu.
działa lewa roleta góra i dół prawa do góry
oraz rolety stop.
Nie działa mi też krańcówka.
Kod: Zaznacz cały
#include <IRremote.h>
#define irPin 11
IRrecv irrecv(irPin);
decode_results results;
//konfiguruje rolety 1 lewo
#define diodaPin1 2
int diodaStatus1 = LOW;
//konfiguruje rolety 1 prawo
#define diodaPin2 3
int diodaStatus2 = LOW;
//konfiguruje rolety 2 lewo
#define diodaPin3 4
int diodaStatus3 = LOW;
//konfiguruje rolety 2 prawo
#define diodaPin4 5
int diodaStatus4 = LOW;
//konfiguracja krancówki roleta lewa
#define krancowkalewa5 6
int krancowkalewa = LOW;
int fotoPin = 0;
int fotoDane;
void setup(void) {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(diodaPin1, OUTPUT);
pinMode(diodaPin2, OUTPUT);
pinMode(diodaPin3, OUTPUT);
pinMode(diodaPin4, OUTPUT);
pinMode(krancowkalewa, INPUT_PULLUP);
// pinMode(karncowkaprawa, INPUT_PULLUP);
}
void loop() {
if (digitalRead (krancowkalewa) == HIGH){ //Jeśli roleta uruchomi krańcówkę
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, LOW);
}
else
{
if (irrecv.decode(&results)) {
switch (results.value) {
case 0x20DF40BF:
Serial.println("Roleta nr1 do gOry");
diodaStatus1 = ~diodaStatus1;
digitalWrite(diodaPin1, HIGH);
digitalWrite(diodaPin2, LOW);
delay(250);
break;
}
switch (results.value) {
case 0x20DFC03F:
Serial.println("Roleta nr1 do dolu");
diodaStatus2 = ~diodaStatus2;
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, HIGH);
delay(250);
break;
}
switch (results.value) {
case 0x20DF00FF:
Serial.println("Roleta nr2 do gory");
diodaStatus3 = ~diodaStatus3;
digitalWrite(diodaPin3, HIGH);
digitalWrite(diodaPin4, LOW);
delay(250);
break;
}
switch (results.value) {
case 0x20DF807F:
Serial.println("Roleta nr2 do dolu");
diodaStatus4 = ~diodaStatus4;
digitalWrite(diodaPin3, LOW);
digitalWrite(diodaPin4, HIGH);
delay(250);
break;
}
switch (results.value) {
case 0x20DF4EB1:
Serial.println("ROLETY STOP");
// diodaStatus4 = ~diodaStatus4;
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, LOW);
digitalWrite(diodaPin3, LOW);
digitalWrite(diodaPin4, LOW);
delay(250);
break;
fotoDane = analogRead(fotoPin);
Serial.print("Oswietlenie = ");
Serial.println(fotoDane);
delay(1000);
}
irrecv.resume();
}
}
}
dodano po jakimś czasie...
Fajnie by było jakby też po drugim kliknięciu w tym samym kierunku roleta się zatrzymywała.
np. klikamy roleta lewa góra potem drugi raz i się zatrzymuje.
dodano po jakimś czasie...
A ten L298N to gotowy moduł.
dodano po jakimś czasie...
Dodam jeszcze że mierzyłem miernikiem napięcia
i po wciśnieciu klawisza pojawia się właściwe napięcie na właściwym pinie
więc nie wiem dlaczego roleta prawa nie idzie do dołu.
dodano po jakimś czasie...
Kolejny problem
działa roleta lewa i prawa góra z pilota
ale jak zadziała krancówka to wpada w pętle bez wyjscia
jak to obejść żeby krancówka działał tylko raz
zmieniając stan na pinach 1 i 2 na LOW
a potem żeby dalej można sterować np pilotem IR
Kod: Zaznacz cały
#include <IRremote.h>
#define irPin 11
IRrecv irrecv(irPin);
decode_results results;
//konfiguruje rolety 1 lewo
#define diodaPin1 2
int diodaStatus1 = LOW;
//konfiguruje rolety 1 prawo
#define diodaPin2 3
int diodaStatus2 = LOW;
//konfiguruje rolety 2 lewo
#define diodaPin3 4
int diodaStatus3 = LOW;
//konfiguruje rolety 2 prawo
#define diodaPin4 5
int diodaStatus4 = LOW;
//konfiguracja krancówki roleta lewa
#define krancowkalewa 6
//int krancowkalewa = LOW;
int fotoPin = 0;
int fotoDane;
void setup(void) {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(diodaPin1, OUTPUT);
pinMode(diodaPin2, OUTPUT);
pinMode(diodaPin3, OUTPUT);
pinMode(diodaPin4, OUTPUT);
pinMode(krancowkalewa, INPUT_PULLUP);
// pinMode(karncowkaprawa, INPUT_PULLUP);
}
void loop()
{
while (digitalRead (krancowkalewa) == LOW){ //Jeśli roleta uruchomi
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, LOW);
Serial.println("Roleta STOP Krancowka");
}
if (irrecv.decode(&results)) {
switch (results.value) {
case 0x20DF40BF:
Serial.println("Roleta nr1 do gOry");
diodaStatus1 = ~diodaStatus1;
digitalWrite(diodaPin1, HIGH);
digitalWrite(diodaPin2, LOW);
delay(250);
break;
}
switch (results.value) {
case 0x20DFC03F:
Serial.println("Roleta nr1 do dolu");
diodaStatus2 = ~diodaStatus2;
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, HIGH);
delay(250);
break;
}
switch (results.value) {
case 0x20DF00FF:
Serial.println("Roleta nr2 do gory");
diodaStatus3 = ~diodaStatus3;
digitalWrite(diodaPin3, HIGH);
digitalWrite(diodaPin4, LOW);
delay(250);
break;
}
switch (results.value) {
case 0x20DF807F:
Serial.println("Roleta nr2 do dolu");
diodaStatus4 = ~diodaStatus4;
digitalWrite(diodaPin3, LOW);
digitalWrite(diodaPin4, HIGH);
delay(250);
break;
}
switch (results.value) {
case 0x20DF4EB1:
Serial.println("ROLETY STOP");
// diodaStatus4 = ~diodaStatus4;
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, LOW);
digitalWrite(diodaPin3, LOW);
digitalWrite(diodaPin4, LOW);
delay(250);
break;
fotoDane = analogRead(fotoPin);
Serial.print("Oswietlenie = ");
Serial.println(fotoDane);
delay(1000);
}
irrecv.resume();
}
}
Jeszcze jeden post pod postem a dostaniesz ostrzeżenie.
OK zrozumiałem...
Siedziałem dzisiaj troszkę nad swoim pokojem
Coś tam się udało się zrobić
działa wyświetlacz LCD 16x2 po l2c
na nim wyświetla mi temp z czujnika na polu DHT22 w pierwszym wierszu
ale jest 2 problemy
1. wyniku temperatury pojawiąją się dopiero po uzyciu rolety
jednak dalsze wyniku aktualizowane są na bierzaco
jak zajdzie zmiana temp lub wilgotnościa
dalej nie wiem co zrobić z krańcówkami
sterowanie pilotem działa co widać na diodach
jakie sobie podłaczyłem do portów 2,3,4,5
do sterowanie modułem L298N
nie działa roleta dwa do dołu
mam podejrzenie że coś jest z modułem L298N
gdyż właściwa dioda się pali
sygnalizując stan HIGH na wyściu nr 5
podłacoznego do INT4 w L298N
Oto aktualny kod.
Kod: Zaznacz cały
/*
* objaśnienie dla podłacznia LCD do Arduino
* LCM1602 & Arduino Uno
* VCC - > 5 V
* GND - GND
* SCL -> A5
* SDA -> A4
*/
#include <DHT.h> // uruchamian czujnik temperatury DHT22
#include <Wire.h> // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD
#include <IRremote.h> // biblioteka do sterowania pilotem IR
#define irPin 7 // definiuje pin dla diody IR
IRrecv irrecv(irPin);
decode_results results;
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Ustawienie adresu ukladu l2c na 0x27
#define DHTPIN 9 // pin dla czujnika temperatury
#define DHTTYPE DHT22 // rodzaj czujnika DHT22
float fltHumidity;
float fltTemperature;
DHT dht(DHTPIN, DHTTYPE);
//konfiguruje rolety 1 lewo
#define diodaPin1 2
int diodaStatus1 = LOW;
//konfiguruje rolety 1 prawo
#define diodaPin2 3
int diodaStatus2 = LOW;
//konfiguruje rolety 2 lewo
#define diodaPin3 4
int diodaStatus3 = LOW;
//konfiguruje rolety 2 prawo
#define diodaPin4 5
int diodaStatus4 = LOW;
//konfiguracja krancówki roleta lewa
#define krancowkalewa 6
//int krancowkalewa = LOW;
int fotoPin = 0;
int fotoDane;
void setup(void) {
lcd.begin(16,2); // Inicjalizacja LCD 2x16
lcd.noBacklight(); // wylaczenie podswietlenia LCD
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(diodaPin1, OUTPUT);
pinMode(diodaPin2, OUTPUT);
pinMode(diodaPin3, OUTPUT);
pinMode(diodaPin4, OUTPUT);
pinMode(krancowkalewa, INPUT_PULLUP);
// pinMode(karncowkaprawa, INPUT_PULLUP);
}
void loop()
{
fltHumidity = dht.readHumidity();
fltTemperature = dht.readTemperature();
if (isnan(fltTemperature) || isnan(fltHumidity))
{
lcd.setCursor(0, 1);
// lcd.print(DHTTYPE);
}
else
{
lcd.setCursor(0, 0);
lcd.print("T ");
lcd.setCursor(2, 0);
lcd.print(fltTemperature);
lcd.setCursor(6, 0);
lcd.print((char)223);
lcd.setCursor(7, 0);
lcd.print("C");
lcd.setCursor(9, 0);
lcd.print("W ");
lcd.setCursor(11, 0);
lcd.print(fltHumidity);
lcd.setCursor(15, 0);
lcd.print("%");
}
if (digitalRead (krancowkalewa) == LOW){ //Jeśli roleta uruchomi krańcówkę
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, LOW);
}
else
{
if (irrecv.decode(&results)) {
switch (results.value) {
case 0x20DF40BF:
Serial.println("Roleta nr1 do gOry");
lcd.backlight(); // zalaczenie podwietlenia LCD
lcd.clear();
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("Roleta1 do gory");
diodaStatus1 = ~diodaStatus1;
digitalWrite(diodaPin1, HIGH);
digitalWrite(diodaPin2, LOW);
delay(250);
break;
}
switch (results.value) {
case 0x20DFC03F:
Serial.println("Roleta nr1 do dolu");
lcd.backlight(); // zalaczenie podwietlenia LCD
lcd.clear();
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("Roleta1 do dolu");
diodaStatus2 = ~diodaStatus2;
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, HIGH);
delay(250);
break;
}
switch (results.value) {
case 0x20DF00FF:
Serial.println("Roleta nr2 do gory");
lcd.backlight(); // zalaczenie podwietlenia LCD
lcd.clear();
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("Roleta2 do gory");
diodaStatus3 = ~diodaStatus3;
digitalWrite(diodaPin3, HIGH);
digitalWrite(diodaPin4, LOW);
delay(250);
break;
}
switch (results.value) {
case 0x20DF807F:
Serial.println("Roleta nr2 do dolu");
lcd.backlight(); // zalaczenie podwietlenia LCD
lcd.clear();
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("Roleta2 do dolu");
diodaStatus4 = ~diodaStatus4;
digitalWrite(diodaPin3, LOW);
digitalWrite(diodaPin4, HIGH);
delay(250);
break;
}
switch (results.value) {
case 0x20DF4EB1:
Serial.println("ROLETY STOP");
lcd.backlight(); // zalaczenie podwietlenia LCD
lcd.clear();
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("ROLETY STOP !!!");
// diodaStatus4 = ~diodaStatus4;
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, LOW);
digitalWrite(diodaPin3, LOW);
digitalWrite(diodaPin4, LOW);
delay(250);
break;
fotoDane = analogRead(fotoPin);
Serial.print("Oswietlenie = ");
Serial.println(fotoDane);
delay(1000);
}
irrecv.resume();
}
}
}
Tak sobie myślę czy obsługi krańcówki nie dało by się zrobić
przerwaniem
jak oszukać system
by ruszył rolety pomimo uruchomionej krańcówki
jak to zrobić
A oto co udało mi się zrobić dzięki emailowi i jego podpowiedzi EketroMaras
okazało się że rozwiązanie jest banalne
poniżej kod który działa
przetestowałem
Jednak nie jest że tak powiem idioto odporny i da się na siłe urwać roletę
Kod: Zaznacz cały
/*
* objaśnienie dla podłacznia LCD do Arduino
* LCM1602 & Arduino Uno
* VCC - > 5 V
* GND - GND
* SCL -> A5
* SDA -> A4
*/
#include <DHT.h> // uruchamian czujnik temperatury DHT22
#include <Wire.h> // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD
#include <IRremote.h> // biblioteka do sterowania pilotem IR
#define irPin 11 // definiuje pin dla diody IR
IRrecv irrecv(irPin);
decode_results results;
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Ustawienie adresu ukladu l2c na 0x27
#define DHTPIN 10 // pin dla czujnika temperatury
#define DHTTYPE DHT22 // rodzaj czujnika DHT22
float fltHumidity;
float fltTemperature;
DHT dht(DHTPIN, DHTTYPE);
//konfiguruje rolety 1 lewo
#define diodaPin1 2
int diodaStatus1 = LOW;
//konfiguruje rolety 1 prawo
#define diodaPin2 3
int diodaStatus2 = LOW;
//konfiguruje rolety 2 lewo
#define diodaPin3 4
int diodaStatus3 = LOW;
//konfiguruje rolety 2 prawo
#define diodaPin4 5
int diodaStatus4 = LOW;
//konfiguracja krancówki roleta lewa dół
#define krancowkalewad 6
//konfiguracja krancówki roleta lewa góra
#define krancowkalewag 7
//konfiguracja krancówki roleta prawa dół
#define krancowkaprawad 8
//konfiguracja krancówki roleta prawa góra
#define krancowkaprawag 9
//int krancowkalewa = LOW;
int fotoPin = 0;
int fotoDane;
void setup(void) {
lcd.begin(16,2); // Inicjalizacja LCD 2x16
lcd.noBacklight(); // wylaczenie podswietlenia LCD
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(diodaPin1, OUTPUT);
pinMode(diodaPin2, OUTPUT);
pinMode(diodaPin3, OUTPUT);
pinMode(diodaPin4, OUTPUT);
pinMode(krancowkalewad, INPUT_PULLUP);
pinMode(krancowkalewag, INPUT_PULLUP);
pinMode(krancowkaprawad, INPUT_PULLUP);
pinMode(krancowkaprawag, INPUT_PULLUP);
// pinMode(karncowkaprawa, INPUT_PULLUP);
}
void loop()
{
fltHumidity = dht.readHumidity();
fltTemperature = dht.readTemperature();
if (isnan(fltTemperature) || isnan(fltHumidity))
{
lcd.setCursor(0, 1);
// lcd.print(DHTTYPE);
}
else
{
lcd.setCursor(0, 0);
lcd.print("T ");
lcd.setCursor(2, 0);
lcd.print(fltTemperature);
lcd.setCursor(6, 0);
lcd.print((char)223);
lcd.setCursor(7, 0);
lcd.print("C");
lcd.setCursor(9, 0);
lcd.print("W ");
lcd.setCursor(11, 0);
lcd.print(fltHumidity);
lcd.setCursor(15, 0);
lcd.print("%");
if (irrecv.decode(&results)) {
switch (results.value) {
case 0x20DF40BF:
Serial.println("Roleta nr1 do gOry");
lcd.backlight(); // zalaczenie podwietlenia LCD
lcd.clear();
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("Roleta1 do gory");
diodaStatus1 = ~diodaStatus1;
digitalWrite(diodaPin1, HIGH);
digitalWrite(diodaPin2, LOW);
delay(250);
break;
}
switch (results.value) {
case 0x20DFC03F:
Serial.println("Roleta nr1 do dolu");
lcd.backlight(); // zalaczenie podwietlenia LCD
lcd.clear();
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("Roleta1 do dolu");
diodaStatus2 = ~diodaStatus2;
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, HIGH);
delay(250);
break;
}
switch (results.value) {
case 0x20DF00FF:
Serial.println("Roleta nr2 do gory");
lcd.backlight(); // zalaczenie podwietlenia LCD
lcd.clear();
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("Roleta2 do gory");
diodaStatus3 = ~diodaStatus3;
digitalWrite(diodaPin3, HIGH);
digitalWrite(diodaPin4, LOW);
delay(250);
break;
}
switch (results.value) {
case 0x20DF807F:
Serial.println("Roleta nr2 do dolu");
lcd.backlight(); // zalaczenie podwietlenia LCD
lcd.clear();
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("Roleta2 do dolu");
diodaStatus4 = ~diodaStatus4;
digitalWrite(diodaPin3, LOW);
digitalWrite(diodaPin4, HIGH);
delay(250);
break;
}
switch (results.value) {
case 0x20DF4EB1:
Serial.println("ROLETY STOP");
lcd.backlight(); // zalaczenie podwietlenia LCD
lcd.clear();
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("ROLETY STOP !!!");
// diodaStatus4 = ~diodaStatus4;
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, LOW);
digitalWrite(diodaPin3, LOW);
digitalWrite(diodaPin4, LOW);
delay(250);
break;
fotoDane = analogRead(fotoPin);
Serial.print("Oswietlenie = ");
Serial.println(fotoDane);
delay(1000);
}
irrecv.resume();
}
else
{
if (digitalRead (krancowkalewad) == LOW){ //Jeśli roleta uruchomi krańcówkę
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, LOW);
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("KrancowkaL dol ");
}
else
{
if (digitalRead (krancowkalewag) == LOW){ //Jeśli roleta uruchomi krańcówkę
digitalWrite(diodaPin1, LOW);
digitalWrite(diodaPin2, LOW);
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("KrancowkaL gora ");
}
else
{
if (digitalRead (krancowkaprawad) == LOW){ //Jeśli roleta uruchomi krańcówkę
digitalWrite(diodaPin3, LOW);
digitalWrite(diodaPin4, LOW);
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("KrancowkaP dol ");
}
else
{
if (digitalRead (krancowkaprawag) == LOW){ //Jeśli roleta uruchomi krańcówkę
digitalWrite(diodaPin3, LOW);
digitalWrite(diodaPin4, LOW);
lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("KrancowkaP gora ");
}
}
}
}
}
}
}
CZekam na wasze sugestie...