Skocz do zawartości

Adresowanie wyjść expandera


Pomocna odpowiedź

Napisano

Cześć,

mam następujący problem. Używam w projekcie kilku expanderów PCF8574.

Biblioteki pod np. RTC, DHT są napisane tak, że urządzenie podłączone jest do arduino i  tworząc obiekt wpisujemy odpowiednie piny, do których podpięte jest  urządzenie na arduino. Na przykład:

Fragment z  kodu dla RTC
// DS1302 CLK/SCLK --> 5
// DS1302 DAT/IO --> 4
// DS1302 RST/CE --> 2
// DS1302 VCC --> 3.3v - 5v
// DS1302 GND --> GND

#include <ThreeWire.h>  
#include <RtcDS1302.h>

ThreeWire myWire(4,5,2); // IO, SCLK, CE
RtcDS1302<ThreeWire> Rtc(myWire);

 

Fragment z kodu dla DHT

#include "DHT.h"

DHT dht;

void setup()
{
    dht.setup(2); // data pin 2

 

Nie wiem i proszę o wiedzę jak właściwie mam adresować porty na expanderze zaadresowanym np 0x20. 

//--------------------------------------------------expander 0x20-------------------------------------------

#define rtc_CLK    0

#define rtc_DAT    1

#define rtc_RST    2

 

Co mam wpisać do dht.setup(???), ThreeWire myWire(????) i innych podobnych obiektów tworzonych do innych bibliotek czujników, etc. 

 

Nic. Te biblioteki nie będą działały z ekspanderem. Szczególnie, jeśli używają SPI czy innych peryferiów, których ekspander nawet nie ma.

Nie wszystko się da obsłużyć ekspanderem, a to co się da, prawdopodobnie będziesz musiał obsłużyć sam, bez biblioteki (albo odpowiednio przerabiając kod z biblioteki).

DS1302 działa na SPI, DHT11 ma swój protokół na jednym "drucie", a PCF8574 używa I2C.

  • Lubię! 1

Używam biblioteki PCF8574. Nie wiem, czy tej z Twojego linku.

Jeśli dobrze Cię rozumiem, to mam sam stworzyć bibliotekę jak na przykład Wire, czy LiquicCrystal_I2C ...?

Nie mam teraz czasu aby uczyć się tego. Mam projekt do zrobienia. Najwyżej wykorzystam dwa arduino jak zabraknie mi pinów i skomunikuje je ze sobą. 

Dzięki za odpowiedzi..

 

(edytowany)

Tak, chcę to wszystko wyrzucić na expandery.

Jeśli definiuje pin arduino

#define rtc_DAT         A1

następnie tworze obiekty

ThreeWire myWire(rtc_DAT,A1,A3);                      // DAT(IO), CLK(SCLK), RST(CE) 
RtcDS1302<ThreeWire> Rtc(myWire);

To program się kompiluje. 

Zatem jeśli umiałbym znając adres expandera np. 0x20 i pin np. 0 wpisać odpowiedni

#define rtc_DAT        adresPinuNaExpanderze

to przypuszczam, że kiedy utworzę obiekt

ThreeWire myWire(rtc_DAT,A1,A3);       to będzie to działać.               
 

Edytowano przez cheppeniathan

Nie zrobisz tego ze względu na specyfikę działania magistrali 1wire. Chodzi o wymogi czasowe, których jeśli nie spełnisz magistrala nie zadziała. 

22 minuty temu, cheppeniathan napisał:

Tak, chcę to wszystko wyrzucić na expandery.

Nie da się. Zarówno RTC, jak i DHT muszą być podłączone bezpośrednio do pinów Arduino. Ekspander może służyć do sterowania różnymi urządzeniami na zasadzie włącz/wyłacz (przekaźnik, LED, silnik) czy też do pobierania danych z większej ilości wejść on/off (przycisk, krańcówka, zderzak).

Ale na to jest sposób.

Użyj innego modułu RTC podłączanego do I2C.

Jeśli potrzebujesz PWM, użyj również jakiegoś sterownika na I2C.

Wtedy masz dwa piny A4 i A5 zajęte na wszystkie PCF-y, LCD, RTS i PWM/Servo, jakiś trzeci do DHT i zostaje mnóstwo pinów wolnych.

 

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...