28-07-2021, 19:23
(Ten post był ostatnio modyfikowany: 28-07-2021, 20:41 przez kamilussulimak.)
(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 ) 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);
}