• 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
Sterowanie pilotem RC
#1
Witam

Jestem nowy na forum dlatego witam wszystkich serdecznie.

Po przeczytaniu nieskończonej ilości stron internetowych oraz przetestowaniu większości przykładów z ArduinoISP

postanowiłem skonstruować coś co może mi się przydać.

Znalazłem starego pilota od sterownika zamka centralnego pracującego na częstotliwości 433MHz. Odczytałem wysyłany

kod i skleciłem program który zapala i gasi leda po jego otrzymaniu.

Działa bez zarzutu ale chciałbym aby urządzenie sygnalizowało swój stan. Coś a`la zamek centralny w samochodzie.

Czyli np: naciskam "zamknij" a urządzenie wysyła 3 krótkie sygnały świetlne i dźwiękowe oraz cały czas pulsuje czerwona dioda, naciskam "otwórz" i otrzymuję sygnał ciągły 1-sekundowy i zaświeca się dioda zielona.
Nie mam pojęcia jak to zrobić. Proszę o poradę i oczywiście wyrozumiałość. Dopiero zaczynam.

 Mój kod:

Kod:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup()
{
pinMode(8, OUTPUT);  //Pin 8 jako wyjście
digitalWrite(8, LOW);  //Pin 8 w stanie niskim po włączeniu
mySwitch.enableReceive(0); // Pin 2 (INT0) jako wejście sygnału z odbiornika  
}


void loop()
{
  if (mySwitch.available())
  {

    int value = mySwitch.getReceivedValue();
    if ( mySwitch.getReceivedValue() == 11858321)

      digitalWrite(8, HIGH);
     
    if ( mySwitch.getReceivedValue() == 11858322)
   
      digitalWrite(8, LOW);
  }
}
 
 
Odpowiedź
#2
Poczytaj trochę o pseudokodzie. W nim napiszesz wszystko co Ci do głowy przyjdzie, czyli możesz profesjonalnie opisać swój pomysł. A z pseudokodu translatujesz do każdego języka programowania jaki znasz. To znaczy może nie do każdego, ale jest moc.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
Witam
Dziękuję za podpowiedź. Poczytałem trochę o pseudokodzie i faktycznie ma moc. Ale jest nie do opanowania w jedno popołudnie i będę musiał wygospodarować więcej czasu na naukę i eksperymenty.
Udało mi się jednak zrozumieć, że to co chcę osiągnąć nie jest takie łatwe dopóki dzieje się to w pętli.
 
Odpowiedź
#4
Witam ponownie
Napisałem, w końcu, program który działa zgodnie z moimi założeniami. Resztę funkcji załatwię peryferiami typu przekaźnik, elektrozaczep (kiedyś może serwo) i akumulator, na wypadek zaniku zasilania.
Jednak jak to w życiu bywa, chciałbym rozszerzyć program o sterowanie z drugiego, posiadanego pilota.
Mógłbym oczywiście kupić samokopiującego i  byłoby po problemie, ale to żadna sztuka.
Odczytałem wysyłany kod i wpisałem z przecinkiem do programu w instrukcji "if" po operatorze porównania i działającym kodzie. Jednak to nie działa.
Proszę o podpowiedź gdzie i jak umieścić dodatkowy kod.
Kod:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();


void setup() {
  pinMode(8, OUTPUT);  //Pin 8 jako wyjście
  pinMode(9, OUTPUT);  //Pin 9 jako wyjście
  digitalWrite(8, HIGH);  // Przekaźnik załączony
        tone(A0, 3800, 500); // Sygnalizacja dźwiękowa informująca o włączeniu
        delay(100);
        tone(A0, 4500, 500);
        delay(100);
        tone(A0, 3800, 500);
  mySwitch.enableReceive(0); // Pin 2 (INT0) jako wejście sygnału z odbiornika
  Serial.begin(9600); // Uruchomienie komunikacji
}

void loop() {

  if (mySwitch.available()); // Czy zostały odebrane dane

int value = mySwitch.getReceivedValue();

  if  ( mySwitch.getReceivedValue() == 11858321 ) { // Jeśli odebraliśmy taki kod to:
    delay(200); // Eliminacja wielokrotnego odebrania tego samego kodu

    Serial.println ("Włączony"); // Komunikat w terminalu
    for (int i = 0; i < 4; i++) {  // Czterokrotne mignięcie diodą
      digitalWrite(9, HIGH);
      delay(70);
      digitalWrite(9, LOW);
      delay(70);
    }
    digitalWrite(8, HIGH); // Załączenie przekaźnika

    tone(A0, 3800, 500); // Sygnalizacja dźwiękowa
    delay(100);
    tone(A0, 4500, 500);
    delay(100);
    tone(A0, 3800, 500);

    mySwitch.resetAvailable(); //Zatrzymanie pętli w oczekiwaniu na kod
  }


  if ( mySwitch.getReceivedValue() == 11858322  ) { // Jeśli odebraliśmy taki kod to:
    delay(200); // Eliminacja wielokrotnego odebrania tego samego kodu

    Serial.println ("Wyłączony"); // Komunikat w terminalu
    for (int i = 0; i < 4; i++) {  // Czterokrotne mignięcie diodą
      digitalWrite(9, HIGH);
      delay(70);
      digitalWrite(9, LOW);
      delay(70);
    }

    digitalWrite(8, LOW);  // Wyłączenie przekaźnika

    tone(A0, 4500, 500);  // Sygnalizacja dźwiękowa
    delay(100);
    tone(A0, 3800, 500);
    delay(100);
    tone(A0, 4500, 500);

    mySwitch.resetAvailable(); //Zatrzymanie pętli w oczekiwaniu na kod
  }
}
 
Odpowiedź
#5
Problem to z odczytem, nie można odczytywać z bufora raczej dwa razy bo jak odczytujesz za pierwszym razem to się dane kasują wiec za drugim razem jest pusto tak podejrzewam ale nie bawiłem się w RC...

U ciebie jest tak dwa razy odczytujesz z bufora dlatego drugi będzie czysty...

if( mySwitch.getReceivedValue() ==1234){

}
if( mySwitch.getReceivedValue() ==4321 ){

}


A powinno raczej być tak

x = mySwitch.getReceivedValue();

if(x== 1234){
}else{
if(x==4321){
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#6
Dziękuję za podpowiedź.
Już wcześniej próbowałem przypisać kody do zmiennych i stałych oraz porównywać je w warunkach.
Niestety najczęściej kończyło się to obiegiem pętli w nieskończoność.
Z tak jak wyżej napisanym kodem program działa idealnie czyli po otrzymaniu kodu "włączenia" wykonuje
jednokrotnie instrukcje pomiędzy :

  if  ( mySwitch.getReceivedValue() == 11858321 )
a
  mySwitch.resetAvailable();
i "czeka" na następny kod.
Dokładnie o to mi chodziło ale , no właśnie.
Pomyślałem, że sterowanie tylko jednym pilotem mocno ogranicza możliwości tym bardziej, że mam trzy różne.
Przerobiłem program dodając  2 ify z kodem drugiego pilota w warunku i działa. Jednak wygląda fatalnie dlatego
poszukuję bardziej eleganckiego rozwiązania. Niestety "else" nie zadziałało. Nie mniej jednak dziękuję za zainteresowanie. Wklejam przerobiony program. Może komuś przyjdzie coś do głowy.
Kod:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();


void setup() {
  pinMode(8, OUTPUT);  //Pin 8 jako wyjście
  pinMode(9, OUTPUT);  //Pin 9 jako wyjście
  mySwitch.enableReceive(0); // Pin 2 (INT0) jako wejście sygnału z odbiornika
  Serial.begin(9600); // Uruchomienie komunikacji
          tone(A0, 3800, 500); // Sygnalizacja dźwiękowa informująca o włączeniu
        delay(100);
        tone(A0, 4500, 500);
        delay(100);
        tone(A0, 3800, 500);
  digitalWrite(8, HIGH);  // Przekaźnik załączony
}

void loop() {

  if (mySwitch.available()); // Czy zostały odebrane dane

//1
            if  ( mySwitch.getReceivedValue() == 11858321 ) { // Jeśli odebraliśmy taki kod to:
   
            delay(200); // Eliminacja wielokrotnego wysłania tego samego kodu
  
            Serial.println ("Włączony"); // Komunikat w terminalu
            Serial.println (mySwitch.getReceivedValue()); //Wyświetlenie otrzymanego kodu w terminalu
           
            for (int i = 0; i < 4; i++) {  // Czterokrotne mignięcie diodą
            digitalWrite(9, HIGH);
            delay(70);
            digitalWrite(9, LOW);
            delay(70);
    }
       digitalWrite(8, HIGH); // Załączenie przekaźnika

            tone(A0, 3800, 500); // Sygnalizacja dźwiękowa
            delay(100);
            tone(A0, 4500, 500);
            delay(100);
            tone(A0, 3800, 500);

            mySwitch.resetAvailable(); //Zatrzymanie pętli w oczekiwaniu na kod
  }
  //2

      if  ( mySwitch.getReceivedValue() == 6226433 ) { // Jeśli odebraliśmy taki kod to:
   
    delay(200); // Eliminacja wielokrotnego wysłania tego samego kodu

    Serial.println ("Włączony"); // Komunikat w terminalu
    Serial.println (mySwitch.getReceivedValue()); //Wyświetlenie otrzymanego kodu w terminalu
   
    for (int i = 0; i < 4; i++) {  // Czterokrotne mignięcie diodą
      digitalWrite(9, HIGH);
      delay(70);
      digitalWrite(9, LOW);
      delay(70);
    }
    digitalWrite(8, HIGH); // Załączenie przekaźnika

    tone(A0, 3800, 500); // Sygnalizacja dźwiękowa
    delay(100);
    tone(A0, 4500, 500);
    delay(100);
    tone(A0, 3800, 500);

    mySwitch.resetAvailable(); //Zatrzymanie pętli w oczekiwaniu na kod
}

//3

  if ( mySwitch.getReceivedValue() == 11858322  ) { // Jeśli odebraliśmy taki kod to:
    delay(200); // Eliminacja wielokrotnego wysłania tego samego kodu

    Serial.println ("Wyłączony"); // Komunikat w terminalu
    Serial.println (mySwitch.getReceivedValue()); //Wyświetlenie otrzymanego kodu w terminalu
   
    for (int i = 0; i < 4; i++) {  // Czterokrotne mignięcie diodą
      digitalWrite(9, HIGH);
      delay(70);
      digitalWrite(9, LOW);
      delay(70);
    }

    digitalWrite(8, LOW);  // Wyłączenie przekaźnika

    tone(A0, 4500, 500);  // Sygnalizacja dźwiękowa
    delay(100);
    tone(A0, 3800, 500);
    delay(100);
    tone(A0, 4500, 500);

    mySwitch.resetAvailable(); //Zatrzymanie pętli w oczekiwaniu na kod
  }
 
  //4

    if ( mySwitch.getReceivedValue() == 6226434  ) { // Jeśli odebraliśmy taki kod to:
    delay(200); // Eliminacja wielokrotnego wysłania tego samego kodu

    Serial.println ("Wyłączony"); // Komunikat w terminalu
    Serial.println (mySwitch.getReceivedValue()); //Wyświetlenie otrzymanego kodu w terminalu
   
    for (int i = 0; i < 4; i++) {  // Czterokrotne mignięcie diodą
      digitalWrite(9, HIGH);
      delay(70);
      digitalWrite(9, LOW);
      delay(70);
    }

    digitalWrite(8, LOW);  // Wyłączenie przekaźnika

    tone(A0, 4500, 500);  // Sygnalizacja dźwiękowa
    delay(100);
    tone(A0, 3800, 500);
    delay(100);
    tone(A0, 4500, 500);

    mySwitch.resetAvailable(); //Zatrzymanie pętli w oczekiwaniu na kod
}
}
 
Odpowiedź
#7
Witam ponownie
Nie udało mi się znaleźć sposobu na mój problem z drugiego postu, więc wykombinowałem, że wszystkie instrukcje wykonywane po otrzymaniu kodu napiszę w dodatkowych pętlach i będę się do nich tylko odwoływał.
Zadziałało i zdecydowanie uprościło dodawanie kolejnych pilotów. Wystarczą trzy linijki.
Nie wiem czy nie popełniam  przypadkiem jakiegoś "gwałtu" na programowaniu, rozwiązując problem w taki sposób, więc liczę na opinie i ewentualne sugestie bardziej doświadczonych kolegów .
Oto zmieniony kod:
Kod:
#include <RCSwitch.h>
#include <Adafruit_NeoPixel.h> //biblioteka od linijki LED
RCSwitch mySwitch = RCSwitch();
Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, A1, NEO_GRB + NEO_KHZ800); //konfiguracja linijki LED


void setup() {
  pinMode(8, OUTPUT);  //Pin 8 jako wyjście
  pinMode(9, OUTPUT);  //Pin 9 jako wyjście
  pinMode(A1, OUTPUT);
  pinMode(A0, OUTPUT);
  mySwitch.enableReceive(0); // Pin 2 (INT0) jako wejście sygnału z odbiornika
  Serial.begin(9600); // Uruchomienie komunikacji
  linijka.begin(); //inicjalizacja linijki
  linijka.show();
  Wlaczony();
}

void loop() {


      if (mySwitch.available()); // Czy zostały odebrane dane

      // --------------------------------------------------------------------------------------
           
            if  ( mySwitch.getReceivedValue() == 11858321 )  // Jeśli odebraliśmy taki kod to:
              {
              Wlaczony(); //Wykonaj taką pętle
              mySwitch.resetAvailable(); } //Zatrzymanie pętli w oczekiwaniu na kod
          
            if  ( mySwitch.getReceivedValue() == 6226433 )  // Jeśli odebraliśmy taki kod to:
              {
              Wlaczony(); //Wykonaj taką pętle
              mySwitch.resetAvailable();} //Zatrzymanie pętli w oczekiwaniu na kod
             
      // --------------------------------------------------------------------------------------       
        
            if ( mySwitch.getReceivedValue() == 11858322  )  // Jeśli odebraliśmy taki kod to:
            {
            Wylaczony(); //Wykonaj taką pętle
            mySwitch.resetAvailable(); } //Zatrzymanie pętli w oczekiwaniu na kod
 
            if ( mySwitch.getReceivedValue() == 6226434  )  // Jeśli odebraliśmy taki kod to:
            {
            Wylaczony(); //Wykonaj taką pętle
            mySwitch.resetAvailable(); } //Zatrzymanie pętli w oczekiwaniu na kod
}

     // Dodatkowe pętle

void Wlaczony() {
  delay(200);
    Serial.println ("Włączony"); // Komunikat w terminalu
    Serial.println (mySwitch.getReceivedValue()); //Wyświetlenie otrzymanego kodu w terminalu
   
          for (int i = 0; i < 3; i++) {
              linijka.setPixelColor(0, linijka.Color(50, 0, 0));
              linijka.show();
              delay(100);
              linijka.setPixelColor(0, linijka.Color(0, 0, 0));
              linijka.show();
              delay(100);
          }
              linijka.setPixelColor(0, linijka.Color(0, 50, 0)); // Czerwona dioda miga 3 razy i zaświeca się zielona
              linijka.show();                              
             
              digitalWrite(8, HIGH); // Załączenie przekaźnika
 
              tone(A0, 3800, 500);   // Sygnalizacja dźwiękowa
              delay(100);
              tone(A0, 4500, 500);
              delay(100);
              tone(A0, 3800, 500);

}
void Wylaczony() {
  delay(200);
      Serial.println ("Wyłączony"); // Komunikat w terminalu
      Serial.println (mySwitch.getReceivedValue()); //Wyświetlenie otrzymanego kodu w terminalu
     
          for (int i = 0; i < 3; i++) {
               linijka.setPixelColor(0, linijka.Color(0, 50, 0));
               linijka.show();
               delay(100);
               linijka.setPixelColor(0, linijka.Color(0, 0, 0));
               linijka.show();
               delay(100);
       }
               linijka.setPixelColor(0, linijka.Color(50, 0, 0)); // Zielona dioda miga 3 razy i zaświeca się czerwona
               linijka.show();
              
               digitalWrite(8, LOW);  // Wyłączenie przekaźnika

               tone(A0, 4500, 500);  // Sygnalizacja dźwiękowa
               delay(100);
               tone(A0, 3800, 500);
               delay(100);
               tone(A0, 4500, 500);
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości