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

Awatar użytkownika
Duch__
Posty: 1779
Rejestracja: śr sie 24, 2016 7:26 pm
Lokalizacja: Opole

Witam.

Wrzucam kod do obsługi czujnika GP2Y10 (czujnik pyłu). W związku z tym że SUPLA nie umożliwia wyświetlenia na kanale dowolnej wartości bez znaków np. stopnia i bez żadnej ikony (czemu taka podstawa nie jest jeszcze zrobiona) zmuszony byłem "emulować" czujnik DS18b20 by przesłać wynik na serwer. Poniżej schemat:
schemat.png
schemat.png (87.67 KiB) Przejrzano 13553 razy
i program:

Kod: Zaznacz cały

#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");
  }
}
Obrazek
Awatar użytkownika
dawidd
Posty: 615
Rejestracja: wt gru 19, 2017 12:45 pm

swietna rzecz. Mógłbyś napisać laikowi jak to wgrać? Ten kod mam zapisać w pliku tekstowym z rozszerzeniem .bin i wgrać do esp8266?
Awatar użytkownika
shimano73
Posty: 1968
Rejestracja: ndz lut 28, 2016 12:27 pm
Lokalizacja: Orzesze
Kontakt:

Aby wgrać należy użyć środowisko Arduino odpowiednio go ustawić i wgrać
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
Awatar użytkownika
dawidd
Posty: 615
Rejestracja: wt gru 19, 2017 12:45 pm

A czy czujnik pyłu podpina się bezpośrednio pod ESP czy przez Arduino?
Awatar użytkownika
Duch__
Posty: 1779
Rejestracja: śr sie 24, 2016 7:26 pm
Lokalizacja: Opole

Bezpośrednio pod ESP do złącza:
- GPIO5 - steruje diodą LED wbudowaną w środku w czujniku (nie widać jej)
- ADC gdzie dokonywany jest pomiar napięcia, które później procesor przelicza na zapylenie
Obrazek
Awatar użytkownika
shimano73
Posty: 1968
Rejestracja: ndz lut 28, 2016 12:27 pm
Lokalizacja: Orzesze
Kontakt:

dawidd pisze: pt sty 26, 2018 9:42 pm A czy czujnik pyłu podpina się bezpośrednio pod ESP czy przez Arduino?
Tu Arduino jest tylko softem a nie sprzętem
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
Awatar użytkownika
dawidd
Posty: 615
Rejestracja: wt gru 19, 2017 12:45 pm

OK, rozumiem. Podpowiedzcie jeszcze jaka wgrać to do esp. Czy w zakładce Narzędzia/Pytka, trzeba zainstalować "SparkFun ESP8266 Boards " i normalnie przez konwerter CP2102 UART - USB micro wgrać ten kod?
Awatar użytkownika
shimano73
Posty: 1968
Rejestracja: ndz lut 28, 2016 12:27 pm
Lokalizacja: Orzesze
Kontakt:

W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
Awatar użytkownika
dawidd
Posty: 615
Rejestracja: wt gru 19, 2017 12:45 pm

Dopiero dziś dotarły do mnie czujniki pyłu i będę sobie coś dłubał. Chciałem sie dowiedzieć czy w supli jest już możliwość wyświetlenia innej wartosci niż st C ?
Awatar użytkownika
pzygmunt
Posty: 18280
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

dawidd pisze: wt mar 27, 2018 8:32 am Dopiero dziś dotarły do mnie czujniki pyłu i będę sobie coś dłubał. Chciałem sie dowiedzieć czy w supli jest już możliwość wyświetlenia innej wartosci niż st C ?
Obecnie tylko C
ODPOWIEDZ

Wróć do „Nowości”