Skocz do zawartości

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
31 minut temu, nebraska napisał:

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

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

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'?

 

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.

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

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);
  }
}

 

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

 

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.

  • 2 miesiące później...
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).

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