Skocz do zawartości

NodeMcu i NRF24l01 problem z wysłaniem danych oraz łącznością wi-fi


Wiktor2019

Pomocna odpowiedź

A, to teraz jasne.

Napis w C/C++ to po prostu fragment pamięci, w którym siedzą po kolei literki, a na końcu NUL. Zmienne mogą (tak w skrócie) być dwóch rodzajów:

a) Wskaźnik - czyli zmienna typu char *. Można do niej podstawić co się chce, ale należy pamiętać o tym, że wskaźnik wcale nie musi wskazywać na to co chcemy (np. jeśli zapomnimy nadać zmiennej jakąś wartość może pokazywać gdziekolwiek, choćby poza przestrzeń adresową).

b) tablica. Oczywiście do tablicy nic podstawić nie można (bo w sumie to też wskaźnik, ale na konkretne miejsce w pamięci) , ma swoją konkretną wielkość (czyli zmieści tyle samo), ale o ile nie będziemy bezmyślnie szukać kończącego NUL to zawsze będzie zawierać coś (niekoniecznie sensownego).

W tym przypadku możesz użyć zmiennej typu char * (czy const char *):
 

const char *nazwa = daysOfTheWeek[now.dayOfTheWeek()];

Po czymś takim zmienna "nazwa" będzie wskazywać na konkretny element tablicy daysOfTheWeek.

Druga możliwość to użycie tablicy:
 

char nazwa[16]; // 16 dlatego że na pewno się tam zmieści nazwa dnia tygodnia
strcpy(nazwa,daysOfTheWeek[now.dayOfTheWeek()]);

Oba sposoby mają swoje (cytując panią Joannę) "zady i walety" - w Twoim przypadku użycie zwykłego wskaźnika będzie prostsze.

  • Lubię! 1
Link do komentarza
Share on other sites

Użyłem tego pierwszego wskaźnika ale wyskakiwał mi błąd (poniżej) dla pętli switch nie ważne ile było 'kroków" (case). Lecz gdy użyłem tego drugiego to nie pojawił się ten problem więc go zostawiam, ale żeby wiedzieć jak to działa to mam takie pytanie co to są za 'litery' na początku drugiej linijki w drugiej możliwości. Jaką pełnią one funkcję?

błąd:

exit status 1
jump to case label [-fpermissive]

'literki':

1 godzinę temu, ethanak napisał:

strcpy

 

Link do komentarza
Share on other sites

@ethanak Miałem stworzyć nowy temat ale widząc ile jest nowych tematów piszę tutaj. Z modułu Lolin32 zrobiłem bezprzewodowy czujnik temperatury oparty na DHT22 Lolin32 oraz dwóch akumulatorkach 18650 2600mAh. Wystawiłem go na zewnątrz i gdy nie było mrozów wszystko działało prawidłowo lecz gdy przyszły mrozy to Lolin32 po kilkunastu godzinach nie łączy się z wifi (często po wystawieniu go na zewnątrz i minięciu 24h się nie połączył choć jak go wczoraj popołudniu wystawiłem to po około 6 godzinach padł w tedy wystarczy zresetować moduł i łączy się z powrotem, moduł jest w trybie uśpienia). Baterie są dobre a Lolin32 z bateriami siedzi w hermetycznej puszce. Program jaki wgrywam zamieszczam poniżej trochę nie uporządkowany ale myślę, że to nie będzie wina programu.

Oraz mam takie pytanie trochę nie pasuje do tego działu ale pytam się przy okazji jak tu piszę, chcę wydrukować na drukarce Ender 3 V2 obudowę na ten czujnik i czy materiał PETG będzie dobry czy użyć czegoś innego(obudowa będzie na zewnątrz)?

#include "DHT.h"
#include "ThingSpeak.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#define uS_TO_S_FACTOR 1000000ULL  /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  60        /* Time ESP32 will go to sleep (in seconds) */

RTC_DATA_ATTR int bootCount = 0;

/*
Method to print the reason by which ESP32
has been awaken from sleep
*/
void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;

  wakeup_reason = esp_sleep_get_wakeup_cause();

  switch(wakeup_reason)
  {
    case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
    case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
    case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;
    case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;
    default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;
  }
}
char ssid[] = "......";   // your network SSID (name) 
char pass[] = "......";   // your network password
int keyIndex = 0;            // your network key Index number (needed only for WEP)
WiFiClient  client;

unsigned long myChannelNumber = .......;
const char * myWriteAPIKey = "......";

// Initialize our values
float number1;
int number2;
String myStatus = "";

DHT dht(23, DHT22);

void setup(){
  Serial.begin(115200);
  delay(1000); //Take some time to open up the Serial Monitor

  //Increment boot number and print it every reboot
  ++bootCount;
  Serial.println("Boot number: " + String(bootCount));


  Serial.println(F("DHTxx test!"));
  dht.begin();
  
  WiFi.mode(WIFI_STA);   
  ThingSpeak.begin(client);  // Initialize ThingSpeak
}

void loop(){
delay(50);
  // Connect or reconnect to WiFi
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    while(WiFi.status() != WL_CONNECTED){
      WiFi.begin(ssid, pass);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
      Serial.print(".");
      delay(5000);     
    } 
    Serial.println("\nConnected.");
  }

  delay(200);
  number1 = dht.readTemperature();
  number2 = dht.readHumidity();
 Serial.print(number1);
 Serial.print(dht.readTemperature());

  ThingSpeak.setField(1, number1);
  ThingSpeak.setField(2, number2);
  ThingSpeak.setStatus(myStatus);
  int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  if(x == 200){
    Serial.println("Channel update successful.");
  }else{Serial.println("Problem updating channel. HTTP error code " + String(x));  }
  


  
    //Print the wakeup reason for ESP32
  print_wakeup_reason();
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) +
  " Seconds");

  Serial.println("Going to sleep now");
  Serial.flush(); 
  esp_deep_sleep_start();
  Serial.println("This will never be printed");
}

 

Link do komentarza
Share on other sites

(edytowany)

@ethanak Zmieniłem czujnik na BME280 i już bez problemu odczytuje ujemne temperatury lecz dziś po 10 godzinach na mrozie Lolin zaczął się resetować co może być przyczyną takiego zachowania? Po podłączeniu do komputera wyświetlał takie coś co poniżej, nie pomagał reset na płytce pomogło dopiero odłączeniu jej od zasilania. Nie używam GPIO 0,2,15.

rst:0x10 (RTCWDT_RTC_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371
ets Jun  8 2016 00:22:57

 

Edytowano przez Wiktor2019
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

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

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

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.