jugan1 Napisano Kwiecień 5, 2019 Udostępnij Napisano Kwiecień 5, 2019 Witam, Moim celem jest stworzenie 2 urządzeń: odbiornika oraz nadajnika. Urządzenie "Odbiornik": Ma się składać z Arduino Uno, odbiornika fs100A 433 MHz, wyświetlacza LCD oraz konwertera I2C. Urządzenie "Nadajnik": Ma się składać z Arduino Uno, nadajnika fs100A 433 MHz, wyświetlacza LCD, konwertera I2C oraz czujnika odległości HC-SR04. Jak to ma działać? Część nadawcza sprawdza odległość od danego przedmiotu, wyświetla ją u siebie na lcd oraz wysyła do odbiornika, który również u siebie wyświetla tą odległość. Problem: Do momentu, gdy nie podłączam do Urządzenia "Nadajnik" ( a także nie dodaję w kodzie odpowiednich poleceń ) nadajnika to wszystko działa. Mówię tutaj o mierzeniu odległości oraz wyświetlaniu jej na wyświetlaczu lcd. Gdy tylko dodam nadajnik ( oraz polecenia w kodzie ) to czujnik odległości za każdym razem pokazuje zero. Urządzenie "Nadajnik" też oczywiście nic nie odbiera, ale myślę, że warto zacząć od znalezienia przyczyny, dlaczego czujnik podaje złą odległość. Jednym z powodów może być połączenie. Aktualnie do VCC mam podłączone 3 rzeczy: wyświetlacz LCD, czujnik odległości oraz nadajnik i nie ma żadnego dodatkowego źródła zasilania ( baterii ). Tutaj kod: #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <VirtualWire.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Ustawienie adresu ukladu na 0x27 int trigPin=8; int echoPin=12; int transmit_pin=10; void setup() { lcd.begin(16,2); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); vw_setup(2000); vw_set_tx_pin(transmit_pin); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(10); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2.0) / 29.1; delay(500); lcd.clear(); lcd.setCursor(0,0); lcd.print(distance); String toSend=""; if(distance>200) distance=0; toSend = (String(distance, DEC)); // tekst wiadomości char msg[23]; // tworzymy tablicę typu char toSend.toCharArray(msg, toSend.length() + 1); // konwertujemy nasz tekst do tablicy charów vw_send((uint8_t *)msg, strlen(msg));// wysyłamy vw_wait_tx(); delay(2000); } Pozdrawiam
slon Kwiecień 5, 2019 Udostępnij Kwiecień 5, 2019 long duration, distance; to jest ok ale.. distance = (duration/2.0) / 29.1; tutaj już nie jest ok bo zadeklarowałeś zmienne typu long czyli liczby całkowite. A chcesz wykonywać działania na liczbach z przecinkiem czyli float a więc masz dwa wyjścia. float duration, distance; i teraz będzie ok lub distance = (duration/2) / 29; sam musisz zdecydować jaką chcesz mieć dokładność. Ja osobiście korzystałem z pomiaru z dokładnością do 1cm. dalej jest jeszcze taki zapis if(distance>200) distance=0; tylko w jakim celu chcesz przypisywać wartość 0 do pomiaru odległości?
jugan1 Kwiecień 5, 2019 Autor tematu Udostępnij Kwiecień 5, 2019 Już się tłumaczę. Akurat jeżeli chodzi o dystans to oczywiście to, co robię nie ma trochę sensu, bo działam na longach. Zatem zajdzie niejawne zrzutowanie do longa. Co do dystansu większego od 200. Czytałem, że ten czujnik działa do 200 cm. Dlatego, gdy odległość jest większa to piszę po prostu 0. Sprawdziłem przed chwilą i nie działa mi komunikacja radiowa. Czy bez anten te moduły powinny działać w odległości 5 cm od siebie?
slon Kwiecień 6, 2019 Udostępnij Kwiecień 6, 2019 Co do samych modułów radiowych to tego typu nie miałem trudno mi o nich coś napisać tak od strony praktycznej. Natomiast tak teoretycznie to void setup() { lcd.begin(16,2); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); vw_setup(2000); vw_set_tx_pin(transmit_pin); } po pinMode wstaw vw_set_ptt_inverted(true); tak ogólnie ujmując to jest to wymagane dla działania modułów RF działających z biblioteką VirtualWire.h . 1
jugan1 Kwiecień 6, 2019 Autor tematu Udostępnij Kwiecień 6, 2019 Dziękuję za odpowiedź. Zadziałało, gdy zmieniłem pin. Ten temat można zamknąć. Założyłem natomiast inny temat z bardzo ważnym dla mnie pytaniem. Pozdrawiam
ethanak Kwiecień 6, 2019 Udostępnij Kwiecień 6, 2019 13 godzin temu, slon napisał: long duration, distance; to jest ok ale.. distance = (duration/2.0) / 29.1; tutaj już nie jest ok bo zadeklarowałeś zmienne typu long czyli liczby całkowite. W kwestii formalnej: nieprawda. Ten zapis będzie wykonany jako: distance = (long) ((double)duration / 2.0) / 29.1); czyli jest całkiem prawidłowy. Dokładność w czasie obliczania wartości może być wyższa z różnych przyczyn - jeśli zaczniesz niepotrzebnie zmniejszać dokładność obliczeń może się okazać, że wynik będzie zupełnie inny... Podstawmy sobie przykładowo wartość 290502 do zmiennej duration. Obliczony przez kolegę wynik to 290502.0 / 2.0 / 29.1 = 4991.44 po rzutowaniu na long wyniesie 4991. Według kolegi @slon powinno to być: 290502 / 2 = 145251; 145251 / 29 = 5008; Która wartość jest prawidłowa i dlaczego uważasz że 5008? 1
slon Kwiecień 6, 2019 Udostępnij Kwiecień 6, 2019 @ethanak ma rację więc dziękuję za skorygowanie mojego błędu.
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »