Obsługa GP2Y10 (czujnik pyłu) w SUPLA

Awatar użytkownika
dawidd
Posty: 442
Rejestracja: wt gru 19, 2017 12:45 pm

śr paź 10, 2018 5:43 am

sroka222
W kodzie z pierwszej strony brakuje linijki przed setup
pinMode(5,OUTPUT)

Bez niej czujnik nie działa
Awatar użytkownika
dawidd
Posty: 442
Rejestracja: wt gru 19, 2017 12:45 pm

czw paź 11, 2018 10:23 am

sroka222 kod poprawiony poniżej
bez ujemnych wartosci i nie rozgłasza sieci jak się zaloguje. Własnie go wrzuciłem do wemosa d1 mini i dziala od strzału. Po wsadzeniu ołówka w czujnik dostaje max wartość,po wyciągnięciu w pokoju ok 75-120 - pewnie trzeba by go wykalibrowac. Wydaje mi sie ze zmieniajac w
dustDensity = 0.17 * calcVoltage - 0.1; // ug/m3
cyfra 0,17 można dopasować go do właściwych wartosci. Tylko skąd je poznać? Ja myślałem jechać pod jakaś stacje jakości powietrza, ale gdy sprawdzam mapę prywatnych stacji to pokazuje normy przekroczone, a obok państwowa poskazuje ze normy w normie :) I komu tu wierzyć?

Kod: Zaznacz cały

#include <ESP8266WiFi.h>
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>

WiFiClient client;

const char* ssid     = "xxx";
const char* password = "xxx";


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

   calcVoltage = (5000.0 / 1024.0) * voMeasured; // Przeliczamy na mV. Calosc mnożymy przez 11, poniewaz w module
  
   // Obliczamy zanieczyszczenie jesli zmierzone napiecie ponad dolny prog
if (voMeasured>3.0)
dustDensity = 0.17 * calcVoltage - 0.1; // ug/m3
  
    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() {
pinMode(5, OUTPUT);
  Serial.begin(115200);
  WiFi.softAPdisconnect(true); // wyłączenie rozgłaszania sieci ESP"
  //sensors.begin();
   
  // Set temperature callback
  
 
 char GUID[SUPLA_GUID_SIZE] = {xxxxxxxxxxxxxxx};  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid
  uint8_t mac[6] = {0x00, 0x02, 0x01, 0x03, 0x04, 0x05};

  SuplaDevice.addRelay(12, true);                 
  SuplaDevice.addRelay(13, true);              
  SuplaDevice.addRelay(15, true);
  SuplaDevice.addDS18B20Thermometer();


  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr8.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");
  }
}
sroka222
Posty: 32
Rejestracja: ndz wrz 25, 2016 10:45 am

czw paź 11, 2018 5:32 pm

Dzięki, teraz odczyt wygląda o wiele lepiej :)
xxpwnage23
Posty: 9
Rejestracja: wt wrz 03, 2019 4:12 pm

pt gru 13, 2019 6:56 am

Bez obrazy, ale ten kod jest zły oraz sposób podłączenie. Przeszukałem cały internet oraz sam modyfikowalem kod dołożyłem oporniki i udało mi się uruchomić ten czujnik z poprawnym wartościami tyle że od 0 do 250 ug a powinno być do 500. Spowodowane jest to tym że pin analogowy inaczej odczytuje niż arduino, jeżeli ktoś chce się tym pobawić to proszę wgrać kod do arduino a następnie do esp i spróbować przybliżyć te wyniki do siebie
Awatar użytkownika
dawidd
Posty: 442
Rejestracja: wt gru 19, 2017 12:45 pm

sob gru 14, 2019 9:11 pm

xxpwnage23 pokaz w takim razie prawidłowy kod i sposób podłączenia
xxpwnage23
Posty: 9
Rejestracja: wt wrz 03, 2019 4:12 pm

pt gru 27, 2019 6:09 am

Poprawny kod, który działa idealnie na arduino przy 5v to https://github.com/sharpsensoruser/shar ... ust-Sensor
Niestety przy 3.3 na nodemcu odczyty są całkowicie inne.
Natomiast prawidłowy schemat podłączenia znajdziemy tutaj https://www.letscontrolit.com/wiki/index.php/GP2Y10. Poprawia on wyniki lecz dalej nie jest to samo co na arduino.
Tyle co udało mi się ustalić i zatrzymałem się w miejscu edycji kodu, niestety już nie pamiętam co dokładnie zmieniłem leczy wyniki były prawidłowe z tym że maksymalna wartość była dużo zniżona.

Kod: Zaznacz cały

 // Compute the output voltage in Volts.
  Vo = Vo / 1024.0 * 3.3;
  printFValue("Vo", Vo*1000.0, "mV");
Mam nadzieję że kogoś naprowadzilem moimi spostrzeżeniami i dokończy to dzieło ponieważ na tą chwilę mam dwa takie czujniki, które leżą i brak czasu na dalsze eksperymenty oraz próbę uruchomienia tego poprawnie.

Edit.
Znalazłem zdjęcia jak się bawiłem tymi czujnikami
Po lewej supla + nodemcu a po prawej arduino
Maksymalne wyniki powodowalem dymem z epapierosa
Wartość spoczynkowa
Wartość spoczynkowa
Wartość spoczynkowa
received_566279067267787.jpeg (109.36 KiB) Przejrzano 165 razy
Wartość maksymalna
Wartość maksymalna
Wartość maksymalna
received_656175258256350.jpeg (103.12 KiB) Przejrzano 165 razy
ODPOWIEDZ