Skocz do zawartości

Pieterlpl

Użytkownicy
  • Zawartość

    20
  • Rejestracja

  • Ostatnio

Reputacja

4 Neutralna

O Pieterlpl

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Cześć. Mam mały problem z wysyłaniem kilku odczytanych parametrów na serwer przy pomocy protokołu MQTT. Jeden parametr (w tej chwili w kodzie jest to TEMPERATURA) jest bezproblemowo przesyłany, natomiast gdy chcę dorzucić kolejne (WILGOTNOSC, CISNIENIE) w taki sposób jak mam to w swoim programie, nie przesyłają się żadne wartości. Czy korzystaliście może kiedyś z biblioteki PubSubClient i udało się Wam przesyłać naraz kilka wartości? Może jest jakiś błąd w składni w tym moim programie? Z góry dziękuję za pomoc. #include <WiFi.h> #include <Wire.h> #include <Adafruit_BME280.h> #include <PubSubClient.h> #define WIFISSID "SSID" // Put your WifiSSID here #define PASSWORD "PASS" // Put your wifi password here #define TOKEN "TOKEN" // Put your Ubidots' TOKEN #define MQTT_CLIENT_NAME "RandomName" // MQTT client Name, please enter your own 8-12 alphanumeric character ASCII string; //it should be a random and unique ascii string and different from all other devices /**************************************** * Define Constants ****************************************/ #define TEMPERATURA "temperatura" #define CISNIENIE "cisnienie" #define WILGOTNOSC "wilgotnosc" #define DEVICE_LABEL "esp32" // Assig the device label char mqttBroker[] = "things.ubidots.com"; char payload[100]; char topic[150]; char topicSubscribe[100]; // Space to store values to send char str_temperaturaC[10]; char str_cisnienie[10]; char str_wilgotnosc[10]; Adafruit_BME280 bme; // I2C float temperaturaC = 0; float cisnienie = 0; float wilgotnosc = 0; /**************************************** * Auxiliar Functions ****************************************/ WiFiClient ubidots; PubSubClient client(ubidots); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection..."); // Attemp to connect if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) { Serial.println("Connected"); client.subscribe(topicSubscribe); } else { Serial.print("Failed, rc="); Serial.print(client.state()); Serial.println(" try again in 2 seconds"); // Wait 2 seconds before retrying delay(2000); } } } /**************************************** * Main Functions ****************************************/ void setup() { Serial.begin(115200); WiFi.begin(WIFISSID, PASSWORD); bme.begin(0x76); pomiaryBME280(); Serial.println(); Serial.print("Wait for WiFi..."); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi Connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); client.setServer(mqttBroker, 1883); sprintf(topicSubscribe, "/v1.6/devices/%s/%s/lv", DEVICE_LABEL, TEMPERATURA, CISNIENIE, WILGOTNOSC); client.subscribe(topicSubscribe); } void loop() { if (!client.connected()) { client.subscribe(topicSubscribe); reconnect(); } pomiaryBME280(); sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(payload, "%s", ""); // Cleans the payload sprintf(payload, "{\"%s\":", TEMPERATURA); // Adds the variable label //sprintf(payload, "{\"%s\":", CISNIENIE); // Adds the variable label //sprintf(payload, "{\"%s\":", WILGOTNOSC); // Adds the variable label /* 4 is mininum width, 2 is precision; float value is copied onto str_sensor*/ dtostrf(temperaturaC, 4, 2, str_temperaturaC); dtostrf(cisnienie, 4, 2, str_cisnienie); dtostrf(wilgotnosc, 4, 2, str_wilgotnosc); sprintf(payload, "%s {\"value\": %s}}", payload, str_temperaturaC); // Adds the value //sprintf(payload, "%s {\"value\": %s}}", payload, str_cisnienie); // Adds the value //sprintf(payload, "%s {\"value\": %s}}", payload, str_wilgotnosc); // Adds the value Serial.println("Publishing data to Ubidots Cloud"); client.publish(topic, payload); client.loop(); delay(1000); } void pomiaryBME280() { temperaturaC = bme.readTemperature(); cisnienie = bme.readPressure() / 100; wilgotnosc = bme.readHumidity(); Serial.print("Temperatura = "); Serial.print(temperaturaC, 2); Serial.print(" *C; "); Serial.print("Ciśnienie = "); Serial.print(cisnienie, 2); Serial.print("hPa; "); Serial.print("Wilgotność = "); Serial.print(wilgotnosc, 2); Serial.print("% "); }
  2. Ok, sprawdzę to w takim razie. Czy możecie mi pomóc z jeszcze jednym kłopotem jakim jest implementacja light sleep w tym przykładzie? Chciałem wykorzystać deep sleep ale on po wybudzeniu restartuje całe ESP32 więc odpada. Problem z light sleepem polega na tym że ESP również się restartuje z powodu błędu, z tego co zauważyłem problemem jest działające wifi bądź serwer i należy go najpierw zatrzymać/wyłączyć a następnie znów uruchomić. O ile to pierwsze działa dobrze o tyle ponowne uruchomienie nie skutkuje połączeniem (brak adresu IP). Czy ktoś korzystał może już z takiego rozwiązania u siebie czyli light sleep + wifi?
  3. W sumie zgadza się, łączyłem się poprzez chrome na smartphonie. A co do serwera, wykorzystałem akurat przykład który znalazłem, nie znałem rozwiązania o którym wspominasz @ethanak. W głównej mierze ESP ma pracować na baterii i jak najbardziej ją oszczędzać stąd chciałbym aby serwer oraz wifi w ESP jak najrzadziej pracowało. Dodatkowo będę korzystał z protokołu MQTT do wysyłania danych np. do Raspberry PI który mógłby być sercem Inteligentnego Domu
  4. Dokładnie o tą pętle mi chodzi. I właśnie chciałbym żeby klient był rozłączony, a tak się nie dzieje. Rozłącza się i za moment jest ciągle połączony przez co blokuje wykonywanie dalszej części programu jaką mam napisaną
  5. Cześć. Projekt zbliża się ku końcowi jednakże mam problem z blokowaniem się dalszego wykonywania programu. Wykorzystałem i zmodyfikowałem pod siebie gotowy program, który tworzy i uruchamia web serwer na moim ESP32. Wszystko działa jak należy natomiast problem polega na tym, że wchodząc pod podany adres IP, w terminalu widzę następujące informacje: Klient połączony, klient odłączony i znów połączony. Wydaje mi się, że pojedyncze wejście na danych adres IP lub pojedyncze odświeżenie powinno skutkować zakończeniem na "klient odłączony". Niestety usunięcie bądź modyfikacja pętli while unieruchamia cały web serwer. Czy macie może pomysł w którym miejscu należałoby zmodyfikować program aby usunąć wspomniany problem? Z góry dziękuję za odpowiedź. /********* Rui Santos Complete project details at https://randomnerdtutorials.com *********/ // Load Wi-Fi library #include <WiFi.h> // Replace with your network credentials const char* ssid = ""; const char* password = ""; // Set web server port number to 80 WiFiServer server(80); // Variable to store the HTTP request String header; // Auxiliar variables to store the current output state String output26State = "off"; String output27State = "off"; // Assign output variables to GPIO pins const int output26 = 26; const int output27 = 27; void setup() { Serial.begin(115200); // Initialize the output variables as outputs pinMode(output26, OUTPUT); pinMode(output27, OUTPUT); // Set outputs to LOW digitalWrite(output26, LOW); digitalWrite(output27, LOW); // Connect to Wi-Fi network with SSID and password Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // Print local IP address and start web server Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.begin(); } void loop(){ WiFiClient client = server.available(); // Listen for incoming clients if (client) { // If a new client connects, Serial.println("New Client."); // print a message out in the serial port String currentLine = ""; // make a String to hold incoming data from the client while (client.connected()) { // loop while the client's connected if (client.available()) { // if there's bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor header += c; if (c == '\n') { // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: if (currentLine.length() == 0) { // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) // and a content-type so the client knows what's coming, then a blank line: client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); // turns the GPIOs on and off if (header.indexOf("GET /26/on") >= 0) { Serial.println("GPIO 26 on"); output26State = "on"; digitalWrite(output26, HIGH); } else if (header.indexOf("GET /26/off") >= 0) { Serial.println("GPIO 26 off"); output26State = "off"; digitalWrite(output26, LOW); } else if (header.indexOf("GET /27/on") >= 0) { Serial.println("GPIO 27 on"); output27State = "on"; digitalWrite(output27, HIGH); } else if (header.indexOf("GET /27/off") >= 0) { Serial.println("GPIO 27 off"); output27State = "off"; digitalWrite(output27, LOW); } // Display the HTML web page client.println("<!DOCTYPE html><html>"); client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); client.println("<link rel=\"icon\" href=\"data:,\">"); // CSS to style the on/off buttons // Feel free to change the background-color and font-size attributes to fit your preferences client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}"); client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;"); client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}"); client.println(".button2 {background-color: #555555;}</style></head>"); // Web Page Heading client.println("<body><h1>ESP32 Web Server</h1>"); // Display current state, and ON/OFF buttons for GPIO 26 client.println("<p>GPIO 26 - State " + output26State + "</p>"); // If the output26State is off, it displays the ON button if (output26State=="off") { client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>"); } else { client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>"); } // Display current state, and ON/OFF buttons for GPIO 27 client.println("<p>GPIO 27 - State " + output27State + "</p>"); // If the output27State is off, it displays the ON button if (output27State=="off") { client.println("<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>"); } else { client.println("<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>"); } client.println("</body></html>"); // The HTTP response ends with another blank line client.println(); // Break out of the while loop break; } else { // if you got a newline, then clear currentLine currentLine = ""; } } else if (c != '\r') { // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine } } } // Clear the header variable header = ""; // Close the connection client.stop(); Serial.println("Client disconnected."); Serial.println(""); } }
  6. Ahhh no tak, wstyd się przyznać że taki błąd
  7. Witajcie. Mam mały problem, który jest z pewnością błahy do rozwiązania. Nie potrafię wykorzystać danych pomiarowych z 1 funkcji w 2 funkcji. Fragment kodu wygląda następująco: void stanBaterii() { float napiecie = analogRead(27) / 4096.0 * 7.17; float procent = (napiecie - 3.50)/0.007; } void ekran() { display.setRotation(1); display.fillScreen(GxEPD_BLACK); display.setTextColor(GxEPD_WHITE); display.setTextSize(2); display.setCursor(0, 10); display.print("Bateria: "); display.print(napiecie); display.println(" V"); display.print("Stan: "); display.print(procent, 0); display.println("%"); display.update(); } Wydaje mi się że deklaracja funkcji jako void sprawia tutaj problem. Zostawiając funkcje bez żadnego typu wywala zaś błąd co po części jest logiczne. Ale jak to ugryźć, żeby w funkcji ekran() znalazły się dane z funkcji stanBaterii() ?
  8. Ok, przegrzebując dalej internet odnalazłem rozwiązanie - https://github.com/maarten-pennings/CCS811#esp8266 Należy pin WAK podpiąć pod GND - wtedy przydzieli mu adres 0x5A. Gdzieś wyczytałem że można też pin WAK podpiąć pod VCC i przydzieli mu adres 0x5B ale tego nie sprawdziłem.
  9. Cześć! Kolejny problem z którym nie potrafię sobie poradzić. Otóż zamówiłem płytkę z czujnikiem taką jak na zdjęciu: Po przylutowaniu goldpinów okazało się że ani Arduino UNO ani ESP32 nie wykrywają tego czujnika - brak adresu I2C. Nadmienię iż wcześniej podłączałem czujniki BME280, BMP280 oraz taki moduł z 3 czujnikami - BMP280 + HDC1080 + CCS811 i nie było żadnego problemu z wykryciem. Tego nie mogę w żaden sposób uruchomić. Napisałem do sprzedawcy, że być może jest on wadliwy. Po przysłaniu drugiego, ponownym przylutowaniu pinów sytuacja jest taka sama więc wierzyć mi się nie chce że 2 płytki uszkodzone. Na aliexpress znalazłem w której aukcji że być może potrzebne są rezystorki 4k7 podciągające zasilanie pod SCL i SDA ale to też nic nie daje. Mieliście kiedyś styczność z tą płytką? Pozdrawiam
  10. Po kilkunastu godzinach (serio tyle z tym zeszło) udało mi się znaleźć taki przykładowy program gdzie było dodatkowo rozpisane co i jak podłączyć do danej płytki. Dodatkowa literatura od Ciebie @ethanak bardzo się przydała i tak oto w końcu wyświetlacz zaczął działać Serdeczne dzięki! Co do samej płytki. Wiem że ESP32-DevKit jest dużo tańsze ale w pierwszej chwili zasugerowałem się tym, że płytka od DFRobot ma od razu gniazdo na akumulator 3,7V którym mam zamiar zasilać cały zestaw. Dopiero po czasie pomyślałem, że mogłem mieć dużo tańszą płytkę i przetwornicę STEP-UP
  11. Wytłumaczcie mi proszę coś: Prosty program do wymuszania stanu wysokiego na konkretnych pinach. Na zwykłym Arduino Uno wpisuje np. A5 albo 11, podpinam miernik, jest 5V. W ten sam analogiczny sposób próbuję rozgryźć tą "dziadowską" płytkę FireBeetle. Otwieram zatem plik z rozpisanymi pinami który wrzuciłem w poprzednim poście i żadne A0 lub tożsame 36 nie działa! Brak jakiejkolwiek reakcji. Jedyne co reaguje to dioda led na parametr LED_BUILTIN który też jest zawarty w pliku z pinami. Jak to rozgryźć??? Mało tego: narzuciłem stan wysoki na piny od 0 do 21. Myślicie że gdziekolwiek pokazało się napięcie?
  12. Szczerze? Mam teraz taki mętlik w głowie że chyba bardziej utrudnić się tego nie dało przez autorów płytki jak i wyświetlacza. Na wyświetlaczu mam do dyspozycji piny: (pomijając VCC i GND) DIN, CLK, CS, DC, RST, BUSY. W programie który umieściłem jest zdefiniowany jakiś Font_CS który do niczego mi nie pasuje. Jest to wgl program od trochę innego wyświetlacza e-paper niż mój więc nie wiem czy go nie olać. Natomiast w plikach testowych mojego czyli Waveshare e-ink 2,13" są również użyte tylko 4 piny czyli CS, DS, RST i BUSY. A co z DIN i CLK które według opisu są pinami interfejsu SPI? To jest pierwszy mętlik. Drugi mętlik to taki jak to w końcu podłączyć. W kilku tutorialach podłączają te 4 piny właśnie do D3, D6, D7 i D8. No i wszystko ładnie pięknie ale nijak nie potrafię zweryfikować które to piny w mojej bibliotece do FireBeetle: static const uint8_t TX = 1; static const uint8_t RX = 3; static const uint8_t SDA = 21; static const uint8_t SCL = 22; static const uint8_t SS = 5; static const uint8_t MOSI = 23; static const uint8_t MISO = 19; static const uint8_t SCK = 18; static const uint8_t A0 = 36; static const uint8_t A3 = 39; static const uint8_t A4 = 32; static const uint8_t A5 = 33; static const uint8_t A6 = 34; static const uint8_t A7 = 35; static const uint8_t A10 = 4; static const uint8_t A11 = 0; static const uint8_t A12 = 2; static const uint8_t A13 = 15; static const uint8_t A14 = 13; static const uint8_t A15 = 12; static const uint8_t A16 = 14; static const uint8_t A17 = 27; static const uint8_t A18 = 25; static const uint8_t A19 = 26; static const uint8_t T0 = 4; static const uint8_t T1 = 0; static const uint8_t T2 = 2; static const uint8_t T3 = 15; static const uint8_t T4 = 13; static const uint8_t T5 = 12; static const uint8_t T6 = 14; static const uint8_t T7 = 27; static const uint8_t T8 = 33; static const uint8_t T9 = 32; static const uint8_t DAC1 = 25; static const uint8_t DAC2 = 26; Niby mam też zdjęcie pomocnicze do płytki ale też nic to nie pomaga.... Czy możecie mi wyjaśnić jak to ze sobą połączyć?
  13. Gdybym miał się obrażać to bym nie zwrócił się tutaj o pomoc mniej więcej domyślałem się o co mu może chodzić ale nie potrafiłem w żaden sposób rozwiązać tego problemu. Myślałem że może w którejś bibliotece nie ma zadeklarowanych tych pinów. Skoro tutaj są i nadal błąd o braku ich zadeklarowania to zgłupiałem stąd padło na SPI...
  14. Pomysł z SPI z tego względu że wcześniej bez problemu przeszła komunikacja po I2C a teraz przyszła pora na podłączenie ekranu po SPI i zaczęły się schody
  15. W pierwszym poście wspominałem na jakiej płytce pracuje co do wyboru płytki...nie widziałem w sumie innej FireBeetle do wyboru, jednakże mogłem coś przeoczyć. Spojrzę po 14:00 i dam znać
×
×
  • Utwórz nowe...