• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomoc w znalezieniu błędu w kodzie
#1
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");
 }
}
 
Odpowiedź
#2
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;
 
Odpowiedź
#3
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 ?
 
Odpowiedź
#4
(01-09-2018, 16:25)dawidd napisał(a): 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.

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".
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0  , Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP, BASIC C-64

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
#5
Może w setup brakuje ustawienie tego pinu jako wyjście (pinMode(pin,OUTPUT)Wink.
 
Odpowiedź
#6
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...0au0f.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


Załączone pliki Miniatury
   
 
Odpowiedź
#7
(01-09-2018, 20:37)dawidd napisał(a): schemat
na pytce wemos której używam nie ma opisu gpio 5, ale jest d1 a to to samo.

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.
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0  , Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP, BASIC C-64

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
#8
(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
 
Odpowiedź
#9
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.
 
Odpowiedź
#10
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);
?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości