Skocz do zawartości

Nadajnik fs100A + czujnik + lcd


jugan1

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

Link do komentarza
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?

Link do komentarza
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?

Link do komentarza
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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.