Skocz do zawartości
jugan1

Nadajnik fs100A + czujnik + lcd

Pomocna odpowiedź

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

Udostępnij ten post


Link to post
Share on other sites
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?

Udostępnij ten post


Link to post
Share on other sites

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?

Udostępnij ten post


Link to post
Share on other sites

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 . 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites
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?

 

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@ethanak ma rację więc dziękuję za skorygowanie mojego błędu.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...