Arduino Polska Forum

Pełna wersja: hc12 komunikacja
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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(); 
"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...
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
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.
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ę.
(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);
}
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ęć