Pomoc w znalezieniu błędu w kodzie - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica) +--- Wątek: Pomoc w znalezieniu błędu w kodzie (/watek-pomoc-w-znalezieniu-b%C5%82%C4%99du-w-kodzie) |
Pomoc w znalezieniu błędu w kodzie - dawidd - 01-09-2018 Witam Próbuję zrobić czujnik pyłu do automatyki domowej na sensorze GP2Y1010AU0F Szarp. Sensor ma być połączony z modułem ESP8266 i działać z platforma Supla Ktos już niby zrobił taki czujnik i napisał kod, ale jakoś nie chce mi on działać. Problem jest taki ze esp8266 na pinie D0, GPIO 5 nie wysyła impulsów sterujących dioda w czujniku. Reszta działa poprawnie, czyli odczytuje wartosci z A0 i wysyła na serwer supla Bardzo proszę o pomoc, gdzie jest błąd, co zmienić żeby na GPIO0 zaczeły pojawiać sie impulsy Tutaj jest kod #include <ESP8266WiFi.h> #define SUPLADEVICE_CPP #include <SuplaDevice.h> WiFiClient client; const char* ssid = "aaa"; const char* password = "bbb"; int measurePin = A0; int ledPower = 5; int samplingTime = 280; int deltaTime = 40; int sleepTime = 9680; float voMeasured = 0; float calcVoltage = 0; float dustDensity = 0; // DS18B20 Sensor read implementation double get_temperature(int channelNumber, double last_val) { digitalWrite(ledPower,LOW); // power on the LED delayMicroseconds(samplingTime); voMeasured = analogRead(measurePin); // read the dust value delayMicroseconds(deltaTime); digitalWrite(ledPower,HIGH); // turn the LED off delayMicroseconds(sleepTime); // 0 - 5.0V mapped to 0 - 1023 integer values calcVoltage = voMeasured * (5.0 / 1024); dustDensity = (0.17 * calcVoltage - 0.1)*1000; Serial.print("Raw Signal Value (0-1023): "); Serial.print(voMeasured); Serial.print(" - Voltage: "); Serial.print(calcVoltage); Serial.print(" - Dust Density [ug/m3]: "); Serial.println(dustDensity); double t = dustDensity; last_val = t; return t; } void setup() { Serial.begin(115200); //sensors.begin(); // Set temperature callback char GUID[SUPLA_GUID_SIZE] = {,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX}; // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid uint8_t mac[6] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX}; SuplaDevice.addRelay(12, true); SuplaDevice.addRelay(13, true); SuplaDevice.addRelay(15, true); SuplaDevice.addDS18B20Thermometer(); SuplaDevice.begin(GUID, // Global Unique Identifier mac, // Ethernet MAC address "svr3.supla.org", // SUPLA server address XXXX, // Location ID "XXXX"); // Location Password } void loop() { if (WiFi.status() != WL_CONNECTED) // Jeżeli sieć WiFi nie jest podłączona, wywołaj procedurę łączenia { WiFi_up(); } SuplaDevice.iterate(); SuplaDevice.setTemperatureCallback(&get_temperature); } // Supla.org ethernet layer int supla_arduino_tcp_read(void *buf, int count) { _supla_int_t size = client.available(); if ( size > 0 ) { if ( size > count ) size = count; return client.read((uint8_t *)buf, size); }; return -1; }; int supla_arduino_tcp_write(void *buf, int count) { return client.write((const uint8_t *)buf, count); }; bool supla_arduino_svr_connect(const char *server, int port) { return client.connect(server, 2015); } bool supla_arduino_svr_connected(void) { return client.connected(); } void supla_arduino_svr_disconnect(void) { client.stop(); } void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) { WiFi_up(); } SuplaDeviceCallbacks supla_arduino_get_callbacks(void) { SuplaDeviceCallbacks cb; cb.tcp_read = &supla_arduino_tcp_read; cb.tcp_write = &supla_arduino_tcp_write; cb.eth_setup = &supla_arduino_eth_setup; cb.svr_connected = &supla_arduino_svr_connected; cb.svr_connect = &supla_arduino_svr_connect; cb.svr_disconnect = &supla_arduino_svr_disconnect; cb.get_temperature = &get_temperature; cb.get_temperature_and_humidity = NULL; cb.get_rgbw_value = NULL; cb.set_rgbw_value = NULL; return cb; } void WiFi_up() // Procedura podłączenia do sieci WiFi { Serial.print("Proba podlaczenia do sieci "); Serial.println(ssid); WiFi.begin(ssid, password); // Próba podłączenia do sieci for (int x = 60; x > 0; x--) // Powtarzaj pętlę maksymanie maksymalnie 30 sekund (ponieważ przy każdym elsie jest 0,5 sekundy zwłoki) { if (WiFi.status() == WL_CONNECTED) // Jezeli WiFi jest podłączone { break; // to zatrzymaj pętlę } else // w przeciwnym wypadku { Serial.print("."); // wystaw na serial . delay(500); // i czekaj 0,5 sekundy } } if (WiFi.status() == WL_CONNECTED) // Jeżeli połączenie z siecią zostało nawiązane, wyślij na serial jego parametry { Serial.println(""); Serial.println("Polaczenie nawiazane"); Serial.println("Adres IP: "); Serial.print(WiFi.localIP()); Serial.print(" / "); Serial.println(WiFi.subnetMask()); Serial.print("Brama: "); Serial.println(WiFi.gatewayIP()); long rssi = WiFi.RSSI(); Serial.print("Sila sygnalu (RSSI): "); Serial.print(rssi); Serial.println(" dBm"); } else // w przeciwnym wypadku poinformuj przez serial o nieudanej próbie { Serial.println(""); Serial.println("Polaczenia nie udalo sie nawiazac"); } } RE: Pomoc w znalezieniu błędu w kodzie - kaczakat - 01-09-2018 Najlepiej podłącz sobie zwykłe ledy z rezystorem i zobacz czy miga i gdzie. Piny mogą mieć dzikie oznaczenia na różnych wersjach płytek ESP. Co do zasady jednak, jeśli wiesz, że to jest gpio0 to D5 to powinno być int ledPower = 0; lub int ledPower = D5; RE: Pomoc w znalezieniu błędu w kodzie - dawidd - 01-09-2018 Dzięki za odpowiedz, Sterowanie dioda jest na pinie GPIO 5, i w kodzie jest int ledPower = 5, wiec chyba dobrze ? Mimo to na tym pinie nic sie nie dzieje. Sprawdzałem inne pinu i na zadnym nie ma impulsów. Wychodzi na to ze coś z kodem jest nie tak, tylko co ? RE: Pomoc w znalezieniu błędu w kodzie - es2 - 01-09-2018 (01-09-2018, 16:25)dawidd napisał(a): Dzięki za odpowiedz, A pin do którego podłączasz led ma opis na PCB GPIO 5? Pewnie nie. Nie dałeś schematów i można tylko zgadywać a jak od zawsze wiadomo, "Bez schematu nie ma wspólnego tematu". RE: Pomoc w znalezieniu błędu w kodzie - kaczakat - 01-09-2018 Może w setup brakuje ustawienie tego pinu jako wyjście (pinMode(pin,OUTPUT). RE: Pomoc w znalezieniu błędu w kodzie - dawidd - 01-09-2018 schemat na pytce wemos której używam nie ma opisu gpio 5, ale jest d1 a to to samo. Sprawdzałem czy ten pin fizycznie jest połączony z esp8266 z gpio5 i jest. Używałem tez płytki nodemcu v3, reakcja była taka sama, nie ma impulsów na wyjściu z esp na gpio5 Zeby sprawdzić czujnik czy fizycznie jest sprawny zbudowalem ten uklad na arduino uno i kod wkleilem ze strony: http://www.jarzebski.pl/arduino/czujniki-i-sensory/czujnik-pylu-gp2y1010au0f.html tu wszystko ruszyło od kopa, na monitorze jest odczyt z czujnika, po jego zadymieniu wartość się zmienia i wszystko gra. Tu tez sprawdziłem oscyloskopem jak ma być sterowana dioda w czujniku. Na wyjściu z arduino {odpowiednik mojego gpio5} pojawiają sie paczki impulsów 2-3 razy na sekundę, w esp nie pojawia sie nic RE: Pomoc w znalezieniu błędu w kodzie - es2 - 01-09-2018 (01-09-2018, 20:37)dawidd napisał(a): schemat Jak napisał kaczakat w tych płytkach jest bałagan o czym sam się już przekonałem. Użyj D1 a nie 5 i o ile wybierzesz poprawną płytkę do kompilacji będzie ok. RE: Pomoc w znalezieniu błędu w kodzie - dawidd - 01-09-2018 (01-09-2018, 21:00)es2 napisał(a): Użyj D1 a nie 5 chodzi o to żeby zmienić linijkę w kodzie int ledPower = 5; na int ledPower = D1; ? Co do poprawnej płytki to polowa kodu działa bo po podaniu na wejście A0 napięci z zasilacza 0-3,3V na telefonie w aplikacji supla zmienia mi sie odczyty wiec polowa kodu dzial wiec chyba plytka jest dobrze wybrana i ustawiona RE: Pomoc w znalezieniu błędu w kodzie - kaczakat - 01-09-2018 Nigdzie nie masz, że jakiś pin ma być wyjściem. Może to robi jakaś biblioteka, może nie. To raz, a dla pewności można jeszcze podłączyć do testu jakiś led, by widzieć, że w momencie jak ustawiasz jakiś pin jako wyjście na stan wysoki to on jest faktycznie wysoki - piny dla źle wybranej płytki: Wemos, NodeMCU, Expresso, generic, itd, mogą mieć różne oznaczenia. Mignięcie led, szczególnie jak wgrasz zupełnie przykładowy szkic blink z 1s miganiem, zauważysz . Dobranoc. RE: Pomoc w znalezieniu błędu w kodzie - dawidd - 02-09-2018 kaczakat zrobiłem tak jak piszesz, probe z led'em i przykładem BLINK. Po wpisaniu zarówno 5 lub D1 na pinie D1 w wemosie dioda migała wiec o pomieszaniu pinów nie ma mowy. Co do ustawienia wyjscia to gdzie w kodzie wstawić linijkę: pinMode(5,OUTPUT); ? |