Skocz do zawartości

ESP32 Biblioteka RC Switch


nebraska

Pomocna odpowiedź

(edytowany)

Mam pewnien problem jak zejdę na niższą wersje to program który obecnie będzie obsługiwał pilota nie będzie mi działał na takich starych boardach.

Muszę szukać innego sposobu.

z pomocą chata GPT mam taki kod. Kompiluje się tylko mam problem z jedną linią.

#include <driver/rmt.h>

#define RMT_RX_CHANNEL RMT_CHANNEL_0
#define RMT_RX_GPIO 27 // GPIO pin connected to DATA pin of the receiver

void setup() {
  Serial.begin(115200);
  
  // Configure the RMT receiver
  rmt_config_t rmt_rx;
  rmt_rx.rmt_mode = RMT_MODE_RX;
  rmt_rx.channel = RMT_RX_CHANNEL;
  rmt_rx.gpio_num = (gpio_num_t)RMT_RX_GPIO;
  rmt_rx.clk_div = 80; // Clock divider
  rmt_rx.mem_block_num = 1; // Use one memory block
  rmt_rx.rx_config.filter_en = false; // Disable filter
  rmt_rx.rx_config.idle_threshold = 1000; // Idle time threshold
  rmt_config(&rmt_rx);
  
  // Install the driver
  rmt_driver_install(RMT_RX_CHANNEL, 1000, 0);
}

void loop() {
  rmt_item32_t rmt_item;
  size_t rx_size = sizeof(rmt_item);
  
  // Read RMT data
 // if (rmt_read_items(RMT_RX_CHANNEL, &rmt_item, 1, &rx_size, portMAX_DELAY) == ESP_OK) {
    Serial.print("RMT Item: ");
    Serial.printf("duration0: %d, duration1: %d", rmt_item.duration0, rmt_item.duration1);
 // }
}

 

Chodzi o tą linie 

if (rmt_read_items(RMT_RX_CHANNEL, &rmt_item, 1, &rx_size, portMAX_DELAY) == ESP_OK) {

 

Edytowano przez nebraska
Link do komentarza
Share on other sites

31 minut temu, nebraska napisał:

Kompiluje się tylko mam problem z jedną linią.

Na czym polega ten problem (bo nie napisałeś)? 😉

Link do komentarza
Share on other sites

13 minut temu, Treker napisał:

Na czym polega ten problem (bo nie napisałeś)? 😉

@Treker  nie wiem jak zadeklarować tą linie.

'rmt_read_items' was not declared in this scope; did you mean 'rmt_write_items'?

 

Link do komentarza
Share on other sites

1 godzinę temu, nebraska napisał:

Muszę szukać innego sposobu.

z pomocą chata GPT mam taki kod.

Wydaje mi się, że ChatGTP po prostu "zmyślił" nieistniejąca funkcję "rmt_read_items" - dlatego kod nie działa. Niestety to pułapka korzystania z takich narzędzi, czasami zmyślają rozwiązania na nieistniejących mechanizmach.

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

@nebraska , zobacz w "drivers/rmt.h" jakie masz zadeklarowane funkcje. W void() stworzyło ci obiekt "rmt_item", ale do jego obsługi wywoływana jest  "zewnętrzna" funkcja "rmt_read_items()", spoza obiektu, a takiej tam nie ma.

Link do komentarza
Share on other sites

ok, zajrzałem znalazłem tam 

 

/**
 * @brief Set RMT start receiving data.
 *
 * @param channel RMT channel (0-7)
 *
 * @param rx_idx_rst Set true to reset memory index for receiver.
 *                   Otherwise, receiver will continue receiving data to the last index in memory.
 *
 * @return
 *     - ESP_ERR_INVALID_ARG Parameter error
 *     - ESP_OK Success
 */
esp_err_t rmt_rx_start(rmt_channel_t channel, bool rx_idx_rst);

/**

 

Wrzuciłęm do programu, ale coś źle dalej robie. program sie wgrał, ale żadnej reakcji jak wciskam pilota 433

 

#include <driver/rmt.h>

#define RMT_RX_CHANNEL RMT_CHANNEL_0
#define RMT_RX_GPIO 8 // GPIO pin connected to DATA pin of the receiver

void setup() {
  Serial.begin(115200);

  // Configure the RMT receiver
  rmt_config_t rmt_rx;
  rmt_rx.rmt_mode = RMT_MODE_RX;
  rmt_rx.channel = RMT_RX_CHANNEL;
  rmt_rx.gpio_num = (gpio_num_t)RMT_RX_GPIO;
  rmt_rx.clk_div = 80; // Clock divider
  rmt_rx.mem_block_num = 1; // Use one memory block
  rmt_rx.rx_config.filter_en = false; // Disable filter
  rmt_rx.rx_config.idle_threshold = 1000; // Idle time threshold
  rmt_config(&rmt_rx);

  // Install the driver
  rmt_driver_install(RMT_RX_CHANNEL, 1000, 0);
}

void loop() {
  rmt_item32_t rmt_item;
  size_t rx_size = sizeof(rmt_item);

  // Read RMT data
  //if (rmt_rx_start(RMT_RX_CHANNEL, &rmt_item, 1, &rx_size, portMAX_DELAY) == ESP_OK) {
  if ( rmt_rx_start(RMT_RX_CHANNEL, &rmt_item)) {
    Serial.print("RMT Item: ");
    Serial.printf("duration0: %d, duration1: %d", rmt_item.duration0, rmt_item.duration1);
    delay(1000);
  }
}

 

Link do komentarza
Share on other sites

Wczytaj się w dokumentację, masz np. napisane:

1 godzinę temu, nebraska napisał:
* @return
 *     - ESP_ERR_INVALID_ARG Parameter error
 *     - ESP_OK Success

 

Ale u siebie sprawdzasz tylko czy rmt_rx_start() zwróciło wartość powyżej 0, a skąd wiesz, że ESP_OK to akurat nie 0?

1 godzinę temu, nebraska napisał:
if ( rmt_rx_start(RMT_RX_CHANNEL, &rmt_item))

 

Link do komentarza
Share on other sites

Niestety, obsługa RMT jest trochę bardziej skomplikowana. Proponuję przejrzeć gotowe przykłady zamieszczone w Arduino IDE.

Funkcja rmt_rx_start() jest u Ciebie błędnie użyta - sprawdź, jakie ma parametry. Co prawda rozpoczyna odbiór danych, ale do bufora - nie odbiera ich bezpośrednio.

Link do komentarza
Share on other sites

Dnia 14.02.2025 o 14:16, nebraska napisał:
mySwitch.enableReceive(RXD);  // Receiver on interrupt 0 => that is pin #2

Akurat tego potrzebowałem, więc pobawię się w archeologa dla potomnych...

Wystarczy podmienić RXD na digitalPinToInterrupt(RXD)... Warto czytać dokumentację 😄 Warto też nadmienić: nie każdy PIN na ESP32 obsługuje przerwania... (Akurat 27 jest dobrym wyborem).

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(digitalPinToInterrupt(21));  
  delay(250);
  Serial.println("RC Analyzer Activated");
}

Refka z mojego testowego programu (chciałem sprawdzić sobie kody pilota i czy da radę użyć zwykłego odbiornika 433MHz bez zabawy z chińskimi dekoderami).

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.