Inteligentny dom - w zasadzie pokój na początek.

Chciałbyś coś zrobić, ale nie wiesz jak? Pytaj śmiało.
ODPOWIEDZ
Awatar użytkownika
matti
Młodszy majsterkowicz
Posty: 10
Rejestracja: 29 kwie 2017, 13:43

Inteligentny dom - w zasadzie pokój na początek.

Post autor: matti » 3 maja 2017, 12:19

Witam Wszystkich
Od pewnego czasu walczę z budową inteligętnego domu
Temat nie raz był poruszany ale każdy inaczej to robi co innego oczekuję
Tak pokrótce założenia
Chcę stworzyć kompleksowe rozwiązanie
zaczynając od sypialni
wszystkie pozostałe pomieszczenia to delikana modyfikacja no może poza łazienką gdzie dojdzie obsługa spłuczki i kranu

W chwili obecnej w sypialni działa powiedźmy działa
sterowanie roletą (docelowo ma być 2-ma) - całe okno
oraz na wyświetlaczu jest temperatura wilgotność
Działa :) mam problem i to chciałby pomocy
od tych co wymiatają w programowaniu Arduino.

Założenia całego Domu - co napewno szybko nie nastąpi bo jest dużo pracy
każdy kto ro robi to wie

1. System ma obsługiwać wszystkie pomieszczenia tzn.
- 4 pokoje
- kuchnia
- łazienka
- przedpokój
- piwnica ( tu tylko pomiar temperatury/wilgotności i wykrywanie ruchu)
ewentualnie wyłacznie światła automatyczne po wykryciu braku ruchu

Odpis szczegółowy 4 pokoje tj. salon, sypialnia, 2 pokoje dzieciaków

Na początek zabrałem się za sypialnię
Chcę zrobić strerowanie oświetleniem:
- oświetlenie górne
- 2 lampki nocne
- sterowanie roletami sztuk. 2
- pomiar temperatury i wilgotności na zewnątrz i w sypialni oraz na kaloryferze
- sterować zaworem na kaloryferze
- wykrywać ruch ( czyli obecność użytkowników)
- sterować tv i tunerem ( podstawy właczyć wyłaczyć zmienić kanał i głośność)
- badać oświetlenie na zewnątrz i w pomieszczeniu

Z dotychczasowej walki wiem jak
sterować światłem przez pilot IR
mierzyć temperaturę i wyświetlać to na wyświetlaczu

W chwili obecnej zrobiłem
pomiar temperatury i wilgotnośc na DHT22
i wyświetlam to na LCD 16x2 (shield)
do tego ma działać sterowanie roletami pilotem IR
w chwili obecnej jednej bo nie wiedziałem
czy trudno bedzie przerobic roletę
ale się udało.
W zasadzie użyłem tylko blaszki
i mechanizm rolety śmiga
użyłem przerobionego serwa przyrobionego do pracy ciągłej
a dokładnie MG 996R (oczekuję na mocniejszy zasilacz 6V - bo ten co mam za słaby 5V)

Udało mi się raz to jakoś podłączyć że system działał prawidłowo
tzn. pod zaprogramowany guzikiem
naciśniecie roleta lewa góra powodowało ruch rolety do góry
i na wyświetlaczu pojawiał się własciwy napis
analogicznie do góry i zaprzymaj rolety
a jeszcze ważna sprawy korzystam z L298N
a teraz za chiny nie mogę znaleźć właściwego
podłacznia kabelków pomiedzy
Arduino i L298N
dokładnie nie działa mi roleta do dołu
działa tylko góra i zatrzyamaj
dodam jeszcz że jak ręcznie podaje napiecie sterujące 5V (HiGH)
na L298N to roleta działa prawidłowo

Poniżej mój kod z Arduino

Kod: Zaznacz cały

#include <LiquidCrystal.h>   // dodaje biblioteke wyświetlacz
#include "DHT.h"             // czujnik temp i wilgotnosci
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Inicjuje lcd 2x16 - konfiguracja
#define DHTPIN 12 // ustalam gdzie podłaczony jst czujnik tempe/wilg 
#define DHTTYPE DHT22 // ustalam na DHT22 może być też DHT11 dla powyższej biblioteki

float fltHumidity;
float fltTemperature;
DHT dht(DHTPIN, DHTTYPE);

#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 12
//int diodaStatus3 = LOW;

//konfiguruje rolety 2 prawo
//#define diodaPin4 13
//int diodaStatus4 = LOW;

// konfiguracja STOP wszytskie Rolety
int diodaStatus5 = LOW;

int fotoPin = 0;    
int fotoDane;
 
void setup(void) {
  lcd.begin(16, 2);  //initialize the lcd
  lcd.clear(); // clear on lcd
  lcd.setCursor(0, 0);
  lcd.print(" MATTE HOME");
  lcd.setCursor(0, 1);
  lcd.print(" ver. 0.2c");
  delay(5000);
  lcd.clear(); // clear on lcd

   Serial.begin(9600);
    irrecv.enableIRIn();
 
    pinMode(diodaPin1, OUTPUT);
    pinMode(diodaPin2, OUTPUT);
//    pinMode(diodaPin3, OUTPUT);
 //   pinMode(diodaPin4, OUTPUT);
}
 
void loop() 
{
  fltHumidity = dht.readHumidity();
  fltTemperature = dht.readTemperature();
  if (isnan(fltTemperature) || isnan(fltHumidity))
  {
  }
  else
  {

    lcd.setCursor(0, 0);
    lcd.print("T");
    lcd.setCursor(1, 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 0x392:
            Serial.println("Lewa-UP");
            lcd.setCursor(0, 1);
            lcd.print("ROL. LEWA GoRA");
            diodaStatus1 = ~diodaStatus1;
            digitalWrite(diodaPin1, HIGH);
            digitalWrite(diodaPin2, LOW);
            delay(250);
            break;
         }
      switch (results.value) {
         case 0xB93:
            Serial.println("Lewa-DOWN");
            lcd.setCursor(0, 1);
            lcd.print("ROL. LEWA W DoL");
            diodaStatus2 = ~diodaStatus2;
            digitalWrite(diodaPin1, LOW);
            digitalWrite(diodaPin2, HIGH);
            delay(250);
            break;
        }
      switch (results.value) {
         case 0x3BC:
            Serial.println("Prawa-UP");
            lcd.setCursor(0, 1);
            lcd.print("ROL. PRAWA GoRA");
//            diodaStatus3 = ~diodaStatus3;
//digitalWrite(diodaPin3, HIGH);
//digitalWrite(diodaPin4, LOW);
            delay(250);
            break;
        }
   switch (results.value) {
         case 0xB91:
            Serial.println("Prawa-DOWN");
            lcd.setCursor(0, 1);
            lcd.print("ROL. PRAWA W DoL");
 //           diodaStatus4 = ~diodaStatus4;
//            digitalWrite(diodaPin3, LOW);
 //           digitalWrite(diodaPin4, HIGH);
            delay(250);
            break;

      }
       switch (results.value) {
         case 0xB97:
            Serial.println("Zatrzymaj WSZYSTO- ROLETY STOP !!!");
            lcd.setCursor(0, 1);
            lcd.print(" ROLETY STOP !!!");
            diodaStatus5 = ~diodaStatus5;
            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();
   }
  }
Ostatnio zmieniony 14 maja 2017, 18:23 przez MrLewerence, łącznie zmieniany 2 razy.
Powód: Kody programu umieszczony w znaczniku [code]kod[/code], Proszę nie pisać posta pod postem, jeśli chcesz coś dodać skorzystaj z opcji "Edycja"

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Inteligentny dom - w zasadzie pokój na początek.

Post autor: ethanak » 3 maja 2017, 14:08

Pomijając fakt że w ten sposób się programów nie pisze to ten kod powinien działać - wprawdzie będzie kaszleć ale to można na razie zostawić w spokoju.
Ten L298N to moduł czy goły scalak? Jeśli moduł, to pin2 z Arduino na INP1, pin3 na INP2 i zostawić zworké na ENA. Jeśli goły scalak, to dodatkowo ENABLE do Vcc.
Aha, i jeśli to UNO to nie używaj pinu 13 do sterowania silnikami bo będxiesz miał niespodziankę przy włączaniu.
Ten układ jest nieodporny na podanie jedynki na oba wejścia kierunkowe, tak że bezpieczniej jest w programie najpierw ustawiać wyjścia na zero, a potem na jedynki - w Twoim przypadku po prostu zamienić miejscami wywołania digitalWrite przy ruchu w górę.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Inteligentny dom - w zasadzie pokój na początek.

Post autor: ethanak » 3 maja 2017, 14:58

Np. można umyć ręce ;)
BTW. kiedyś w Japonii w hotelu przez paręnaście minut uczyłem się obsługi kibelka - miało to chyba więcej funkcji niż superwypas pralka :)
Czy było wygodne... niespecjalnie...
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Inteligentny dom - w zasadzie pokój na początek.

Post autor: ethanak » 3 maja 2017, 17:09

Można to zrobić - nie chcę się teraz rozpisywać bo telefon nie jest najwygodniejszym ustrojstwem do pisania, ale czasami mi takiej automatyki kranu brakuje.
Nie mówię o łapach w smarach - bo do tego jest umywalka w warsztacie i prosty zawór z pedałem plus najtańszy termostat - ale czasami lubię sobie zjeść pączka czy bułeczkę z cynamonem, a wiadomo że po czymś takim łapy się kleją lepiej niż epidian z butaprenem i kropelką razem wzięte.
Tyle że automat musiałby odkręcić zawór, a dalsza regulacja musiałaby być ręczna. Mogę sobie ciś takiego wyobrazić... ale koszt czegoś takiego przy zachowaniu funkcjonalności to jakaś paranoja.
Pozavtym gdyby nawet coś takiego się dało łatwo i tanio zrobić - po jakiego grzyba mi sterowanie centralne???
To tak kibelek. Owszem. Automatyczne światło to fajna sprawa. Ale automatyczna spłuczka to przerost formy nad treścią.
No... chyba że ktoś chce kontrolować kto kiedy spuścił wodę i czy na pewno nie umył rąk o jeden raz za dużo (właściciel mieszkanua) czy za mało (troskliwa mamusia). Ale paranoję podobno można leczyć ;)
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Awatar użytkownika
matti
Młodszy majsterkowicz
Posty: 10
Rejestracja: 29 kwie 2017, 13:43

Re: Inteligentny dom - w zasadzie pokój na początek.

Post autor: matti » 3 maja 2017, 17:33

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...
Ostatnio zmieniony 14 maja 2017, 18:25 przez MrLewerence, łącznie zmieniany 3 razy.
Powód: Kody programu umieszczony w znaczniku [code]kod[/code], Proszę nie pisać posta pod postem, jeśli chcesz coś dodać skorzystaj z opcji "Edycja"
ODPOWIEDZ

Strony partnerskie: