Zawiesza sie odczyt z ADC i 2xDS1820

User avatar
dawidd
Posts: 678
Joined: Tue Dec 19, 2017 12:45 pm
Been thanked: 1 time

Post

Witam
Na samym początku chciałem podziękować koledze wojtas567 za pomoc w napisaniu tego kodu - bez niego nic by nie powstało
Do rzeczy - chce zrobić moduł na jednym esp8266(a właściwie już zrobiłem i zamontowałem) do sterowanie ogrzewaniem webasto w aucie.
Moduł ma miec sterowanie 4 przekaźnikami, 2 czujniki NC, 2 czujniki temperatury DS1820 i odczyt napięcia akumulatora z wejścia ADC przez dzielnik rezystorowy (żeby czasem nie nagrzać auta, a później miec problem z rozruchem)

Wszystko praktycznie dział, problem jest jeśli są podpięte 2 czujniki DS1820 - wtedy odczyt z wejścia analogowego zawiesza sie, temperaturę z obu DS'ow pokazuje prawidłowo. Jeśli odepnę fizycznie jednego DS'a odczyt z wejścia analogowego jest ok i odczyt temp z drugiego DS'a tez jest ok
Pytanie jest take - co zmienić w kodzie żeby oba DS1820 pokazywały temperaturę i żeby działał odczyt z ADC ?

kod

Code: Select all

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

#include <OneWire.h>
#include <DallasTemperature.h>

int odczytanaWartosc = 0;//Odczytana wartość z ADC
float napiecie = 0;//Wartość przeliczona na napięcie w V

int measurePin = A0;
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;

// Setup a oneWire instance
OneWire oneWire_IN(02);// Deklaracja pinu 22 jako magistrala OneWire dla czujnika temperatury wewnętrznej
OneWire oneWire_OUT(12); // Deklaracja pinu 22 jako magistrala OneWire dla czujnika temperatury Zewnętrznej

// Pass oneWire reference to Dallas Temperature
// DallasTemperature sensors(&oneWire);
DallasTemperature sensors_IN(&oneWire_IN);
DallasTemperature sensors_OUT(&oneWire_OUT);

WiFiClient client;

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




// DS18B20 Sensor read implementation
double get_temperature(int channelNumber, double last_val) {

    double t = -275;
    double tt=-275;
    
    DallasTemperature *sensor = NULL;
    
      
      switch(channelNumber) {
        case 0: {
                sensor = &sensors_IN;          
                tt=sensor->getTempCByIndex(0);
                Serial.print("Temperatura IN  : ");
                Serial.print(tt,1);
                Serial.println(" st C");
                break;
      }
        case 1:{
                sensor = &sensors_OUT;
                tt=sensor->getTempCByIndex(0);
                Serial.print("Temperatura OUT : ");
                Serial.print(tt,1);
                Serial.println(" st C");
                break;
        }
        case 2: {

                odczytanaWartosc = analogRead(A0); // odczytuję wartość na pinie analogowym  
              
                napiecie = odczytanaWartosc * (5.0/1024.0) * 4.4236; //Przeliczenie wartości na napięcie
                t=napiecie;
                Serial.print("Odczytana wartość z ADC (0-1023): ");
                Serial.print(odczytanaWartosc);
                Serial.print(",  -  zasilanie: ");
                Serial.print(napiecie);//Wysyłamy zmierzone napięcie
                Serial.println(" V");
                
                break;
        };
        
      }
      if ( sensor != NULL && sensor->getDeviceCount() > 0 )
      {
          sensor->requestTemperatures();
          t = sensor->getTempCByIndex(0);
      };

    return t;  
}


void setup() {
  Serial.begin(115200);
  WiFi.softAPdisconnect(true); // wyłączenie rozgłaszania sieci ESP

  // Init DS18B20 library 
  sensors_IN.begin();
  sensors_OUT.begin();
  // Set temperature callback
  SuplaDevice.setTemperatureCallback(&get_temperature);
   
  // Replace the falowing GUID
  uint8_t mac[WL_MAC_ADDR_LENGTH];
  WiFi.macAddress(mac);
  char GUID[SUPLA_GUID_SIZE] = {0x20,0x18,0x10,0x04, 
                                        mac[WL_MAC_ADDR_LENGTH - 6], 
                                        mac[WL_MAC_ADDR_LENGTH - 5], 
                                        mac[WL_MAC_ADDR_LENGTH - 4], 
                                        mac[WL_MAC_ADDR_LENGTH - 3], 
                                        mac[WL_MAC_ADDR_LENGTH - 2], 
                                        mac[WL_MAC_ADDR_LENGTH - 1],
                                        0x31,0x12,0x34,0x56,0x78,0x90};

  // CHANNEL0,1,2
  SuplaDevice.addDS18B20Thermometer();  //DS in
  SuplaDevice.addDS18B20Thermometer();  //DS out
  SuplaDevice.addDS18B20Thermometer();  //napięcie

  // CHANNEL3,4,5,6
  SuplaDevice.addRelay(4, false);                 
  SuplaDevice.addRelay(13, true);              
  SuplaDevice.addRelay(14, true);
  SuplaDevice.addRelay(15, true); 
  
  // CHANNEL7,8 - Opening sensor (Normal Open)
  SuplaDevice.addSensorNO(5);   // A0 - Pin number where the sensor is connected
  SuplaDevice.addSensorNO(16);  // Call SuplaDevice.addSensorNO(A0, true) with an extra "true" parameter
                                // to enable the internal pull-up resistor


  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr8.supla.org",  // SUPLA server address
                    xxxx,                 // tu wpisz swój Location ID 
                    "xxxx");               // tu wpisz swoje 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");
  }
}

Return to “Pomoc”