• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterownik do rolet
#1
Witam serdecznie,

Jestem świeżakiem odnośnie programowania. Podjąłem się napisania sterownika do rolet na pilot i odziwo działa elegancko. Mam jednak przeczucie, że kod można napisać ładniej i krócej. 
1.Czy ktoś wskaże mi co można wymienić? No i wstyd mi za skok goto, ale nie wiedziałem kompletnie jak załatwić ten problem. 
2.Czy realizacja czasówek jest możliwa bez użycia układu RTC?

Program realizuje:
-jazda rolety w góre i w dół ze zmianą trybu w dowolnym momencie (w góre i stop na jednym guziku, w dół i stop na drugim, przy czym gdy jedzie w jedną stronę, a wcisnie się przycisk w drugą to zmieni się automatycznie kierunek)
-ściemnianie pokoju, czyli roleta schodzi na maxa w dół i podwyższa się zostawiając z dołu "szparę ewakuacyjną" i 
prześwit między listwami rolety.

Kod:
#include <IRremote.h>
#define irPin 11
IRrecv irrecv(irPin);
decode_results results;
int przekaznik1 = 8;
int przekaznik2 = 9;
int sp1 = LOW;
int sp2 = LOW;
int sp3 = LOW;
unsigned long time1;
unsigned long time2;
unsigned long time3;
void setup() {
 Serial.begin(9600);
 pinMode(przekaznik1, OUTPUT);
 pinMode(przekaznik2, OUTPUT);
 digitalWrite(przekaznik1, LOW);
 digitalWrite(przekaznik2, LOW);
 irrecv.enableIRIn();
 
 
 // put your setup code here, to run once:

}

void loop() {
 time2 = millis();
 if(time2-time1 > 26000)
 {
   digitalWrite(przekaznik1, LOW);
 }
 if(time2-time3 > 26000)
 {
   digitalWrite(przekaznik2, LOW);
 }
 if (irrecv.decode(&results))
 {
   
   if(results.value == 0xFF30CF)
   {
   sp1 = ~sp1;
   digitalWrite(przekaznik2, LOW);
   sp2 = LOW;
   delay(350);
   digitalWrite(przekaznik1, sp1);
   delay(350);
   time1=millis();
 
   }
   if (results.value == 0xFF18E7)
 {
   sp2 = ~sp2;
   digitalWrite(przekaznik1, LOW);
   sp1 = LOW;
   delay(350);
   digitalWrite(przekaznik2, sp2);
   delay(350);
   time3=millis();
 }
 program:
   if (results.value == 0xFF7A85)
 {
   
   digitalWrite(przekaznik2, LOW);
   delay(350);
   digitalWrite(przekaznik1, HIGH);
   delay(350);
   sp3=HIGH;
   for (int a=0; a<480; a++)
   {
     if (irrecv.decode(&results))
     {
     if (results.value == 0xFF18E7)
     {
       digitalWrite(przekaznik1, LOW);
       delay(250);
       sp3=LOW;
       goto program;
     }
     irrecv.resume();
     }
     delay(50);
   }
   digitalWrite(przekaznik1, LOW);
   delay(250);
   digitalWrite(przekaznik2, sp3);
   delay(6300);
   digitalWrite(przekaznik2, LOW);
 }
 irrecv.resume();
}
}

Pozdrawiam Wink
 
Odpowiedź
#2
Na pierwszy rzut oka przyszło mi do głowy coś takiego, chyba też nie jest zbyt eleganckie i nie budowałem tego, ale powinno działać.

Kod:
#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

long BUTTON_1 = 0xFF30CF; // sygnał przycisku 1
long BUTTON_2 = 0xFF18E7; // sygnał przycisku 2

int MOTOR_1_UP = 4; // pin do podnoszenia
int MOTOR_2_DOWN = 5; // pin do opuszczania

int STATUS = 0; // zmienna dla statusu rolety np: 0 - nie rusza się, 1 - porusza się w górę, 2 - porusza się w dół

void setup() {
 Serial.begin(9600);
 irrecv.enableIRIn(); // nasłuchiwanie przycisków

 pinMode(MOTOR_1_UP,OUTPUT);
 pinMode(MOTOR_2_DOWN,OUTPUT);
}

void loop() {
 if (irrecv.decode(&results))
 {

   if(results.value == BUTTON_1) // podnoszenie
   {
      if(status == 1) // jeżei już była podnoszona
      {
       status = 0; // zatrzymanie
      }
      else
      {
      status = 1; // podnoszenie
      }
   }

   if(results.value == BUTTON_2) // opuszczanie
   {
      if(status == 1) // jeżeli już była opuszczana
      {
       status = 0; // zatrzymanie
      }
      else
      {
      status = 1; // opuszczanie
      }
   }

   irrecv.resume(); // oczekiwanie na następny przycisk

 }

if(status == 0){
   stop();
 }

 if(status == 1){
   up();
 }

 if(status == 2){
   down();
 }

}

void stop(){
 digitalWrite(MOTOR_1_UP,LOW);
 digitalWrite(MOTOR_2_DOWN,LOW);
}

void up(){
 digitalWrite(MOTOR_1_UP,HIGH);
 digitalWrite(MOTOR_2_DOWN,LOW);
}

void down(){
 digitalWrite(MOTOR_1_UP,LOW);
 digitalWrite(MOTOR_2_DOWN,HIGH);
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości