• 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
hc12 komunikacja
#1
Witam jestem tu nowy
Od jakichś 5 lat bawię się z arduino ale z dłuższymi przerwami



chciałbym wykonać zdalne sterowanie do wciągarki leśnej :

-nadajnik z przełącznikiem dzwigienkowym (on)off(on) 
-odbiornik z przekaźnikami sterujący elektrozaworami wciągarki


narazie napisałem mini program sterujący jednym przekaźnikiem

tylko nie wiem dlaczego odbiornik nie wysyła do nadajnika (3333) informujących o włączeniu przekaźnika

i gdy puszczę przycisk to przekaźnik się nie wyłącza.
może ktoś mi doradzić w czym tkwi problem ?

ewentualnie proszę was o podsuniecie innego pomysłu na sterowanie chwilowe dwóch przekaźników za pomocą 2x hc12 i  2x nano,
bo siedzę nad tym już drugi dzień i albo przekaźnik nie chce się wyłączyć albo sa lagi, a postanowiłem sobie ze nie odpuszczę i walczę z tym cały czas Smile


Kod nadajnika:

Kod:
#include <SoftwareSerial.h>
SoftwareSerial hc12nadajnik(10, 11); // RX, TX

#define guzik1 3

int dane =0;


void setup() {
  pinMode(guzik1,INPUT_PULLUP);
 
  Serial.begin(9600);
  hc12nadajnik.begin(9600);
}

void loop()
{
if(hc12nadajnik.available())   
     dane = hc12nadajnik.parseInt();   
Serial.println(dane);

if (digitalRead(guzik1)==LOW)
hc12nadajnik.println(1111);

if(dane==3333 && digitalRead(guzik1)==HIGH)
hc12nadajnik.println(0000);


delay(20);
hc12nadajnik.flush(); 
}



Kod odbiornika:

Kod:
#include <SoftwareSerial.h>
SoftwareSerial hc12odbiornik(10, 11); // RX, TX
#define przekaznik 2
int dane =0;

void setup() {
  hc12odbiornik.begin(9600);
  pinMode(przekaznik, OUTPUT);
  Serial.begin(9600);
}

void loop() {

   if(hc12odbiornik.available())   
     dane = hc12odbiornik.parseInt(); 

   if(dane == 1111)
     digitalWrite(przekaznik, HIGH);
   
    if(przekaznik==HIGH)
     hc12odbiornik.println(3333);
   
   


delay(20);
hc12odbiornik.flush(); 
 
Odpowiedź
#2
"tylko nie wiem dlaczego odbiornik nie wysyła do nadajnika (3333) informujących o włączeniu przekaźnika"

#define przekaznik 2

if(przekaznik==HIGH)

Bo je jest flagą?? przecież przekaźnik zdefiniowałeś "2" wiec ten if się nigdy nie wykona bo HIGH to jest "1"..

"i gdy puszczę przycisk to przekaźnik się nie wyłącza."

if(dane == 1111)
digitalWrite(przekaznik, HIGH);

Bo nie ma funkcji wyłączenia...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Jarewa0606 dzięki za pomoc

teraz wszystko ruszyło tylko nie wysyłam np. "1111" tylko "11 " wtedy szybciej reaguje dioda na puszczenie przycisku ,przypuszczam że muszę zwiekszyc predkość transmisji to wtedy też to pomoże.
Nie zamykam narazie tematu bo będę  jeszcze ten program rozbudowywał i napewno będę potrzebować waszej pomocy Big Grin
 
Odpowiedź
#4
Bardziej użył bym sprzętowego RS to da kopa bo programowy jest blokujący.. Tylko tu jest minus bo uno ma jedno o ile nie musisz czytać coś na monitorze to można się skusić. Albo wymienić płytkę na atmęgę2560 mini nawet ma wtedy więcej portów sprzętowych.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
Wysyłaj dane w stałych odstępach czasu, np. do 20ms, do takiego interwału dobierz prędkość transmisji, jak przez np. 3 cykle nie odbierzesz polecenia (czyli mierz timeout) to zareaguj, np. zatrzymaj działanie wyciągarki. Wywal delay i użyj WD. Zabezpieczeń pewnie powinno być więcej, takie urządzenie może narobić szkód czy okaleczyć, zdrowia życzę.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#6
(28-07-2021, 01:48)kaczakat napisał(a): Wysyłaj dane w stałych odstępach czasu, np. do 20ms, do takiego interwału dobierz prędkość transmisji, jak przez np. 3 cykle nie odbierzesz polecenia (czyli mierz timeout) to zareaguj, np. zatrzymaj działanie wyciągarki. Wywal delay i użyj WD. Zabezpieczeń pewnie powinno być więcej, takie urządzenie może narobić szkód czy okaleczyć, zdrowia życzę.

Stworzyłem nowy kod bez delay 


Nadajnik:
-gdy wcisnę guzik wysyłam co 5ms "11"  ,

Odbiornik:
-gdy odbiorę "11"włączam diodę
-jeśli od ostatniego odbioru "11" minęło ponad 15ms diodę gaszę  

to jest najlepszy patent bo odrazu mam zabezpieczenie przed utratą zasięgu(i kod jest nieskomplikowany  Smile  )  bo gdy odbiornik nie dostanie danych to sam przekaźniki powyłącza

tylko jest jeden problem a mianowicie gdy nacisnę guzik dioda zapala się natychmiast,
ale gdy go puszczę dioda gaśnie po ok 1.5-2s

-próbowałem przejść na serial sprzętowy i nic się nie zmieniło

-odbiornik zasilany z 2x 18650 połączony grubymi kablami jedyne co to nie dałem kondensatora filtrującego

-według mnie problem leży w kodzie odbiornika bo jak podglądam te przychodzące "11" w serial monitorze odbiornika to wyglada to tak:
lecą zera - gdy wcisnę guzik odrazu zaczynają lecieś jedynki - gdy puszczę guzik serial się natychmiast zatrzymuje na te 1.5-2s i po tym czasie gaśnie dioda i jednocześnie lecą zera w serial monitorze


kod nadajnika:

Kod:
#include <SoftwareSerial.h>
SoftwareSerial hc12nadajnik(10, 11); // RX, TX
int guzik=3;
unsigned long czas=0;
unsigned long zapamietanyczas=0;
unsigned long roznica=0;

void setup() {
  hc12nadajnik.begin(9600);
  pinMode(guzik,INPUT_PULLUP);
 

}

void loop() {
czas = millis();
roznica=czas-zapamietanyczas;

  if(digitalRead(guzik)==LOW && roznica >= 5UL){
    hc12nadajnik.println(11);
    zapamietanyczas=czas;
  }
hc12nadajnik.flush();
}


kod odbiornika:


Kod:
#include <SoftwareSerial.h>
SoftwareSerial hc12odbiornik(10, 11); // RX, TX
int dioda =4;
int dane =0;

unsigned long czas=0;
unsigned long zapamietanyczas=0;
unsigned long roznica=0;

void setup() {
pinMode(dioda, OUTPUT);
hc12odbiornik.begin(9600);
Serial.begin(9600);
}

void loop() {
  czas=millis();
  roznica = czas - zapamietanyczas;
 
  if(hc12odbiornik.available())   
     dane = hc12odbiornik.parseInt();

  if(dane==11){
  digitalWrite(dioda,HIGH);
  zapamietanyczas=czas;}
   
  if(roznica>=15){
    digitalWrite(dioda,LOW);
   
  }
   
Serial.println(dane);
}
 
Odpowiedź
#7
Problemem okazało się parseint ()

Teraz wysyłam pojedyncze litery i odbieram je za pomocą Serial.read i teraz wszystko działa bardzo szybko bez zacięć
 
Odpowiedź
  


Skocz do:


Przeglądający: 2 gości