Вывод информации с датчиков

Тема в разделе "Arduino & Shields", создана пользователем Владимир70, 30 окт 2016.

  1. Доброго времени суток! Помогите пожалуйста с кодом. Надо чтобы все определившиеся датчики температуры показывали информацию в своем окне...
    я сейчас получаю информацию с DHT11 информация выводится! Только не знаю как заставить с 18B20 получать информацию что бы заполняли каждый свое окно

    #include <SoftwareSerial.h>
    #include <Nextion.h>
    #include "DHT.h"
    #include <OneWire.h>

    #define DHTPIN 4
    #define DHTTYPE DHT11
    //DHT dht(DHTPIN, DHTTYPE);
    DHT dht(DHTPIN, DHTTYPE);

    OneWire ds(10);
    SoftwareSerial nextion(2, 3);// Nextion TX to pin 2 and RX to pin 3 of Arduino

    Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps

    void setup() {
    Serial.begin(9600);
    myNextion.init();
    dht.begin();

    }

    void loop() {
    byte i;
    byte present = 0;
    byte type_s;
    byte data[12];
    byte addr[8];
    float celsius, fahrenheit;
    if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
    }
    Serial.print("ROM =");
    for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr, HEX);
    }

    if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return;
    }
    Serial.println();

    // the first ROM byte indicates which chip
    switch (addr[0]) {
    case 0x10:
    Serial.println(" Chip = DS18S20"); // or old DS1820
    type_s = 1;
    break;
    case 0x28:
    Serial.println(" Chip = DS18B20");
    type_s = 0;
    break;
    case 0x22:
    Serial.println(" Chip = DS1822");
    type_s = 0;
    break;
    default:
    Serial.println("Device is not a DS18x20 family device.");
    return;
    }

    ds.reset();
    ds.select(addr);
    ds.write(0x44, 1); // start conversion, with parasite power on at the end
    delay(1000); // maybe 750ms is enough, maybe not
    // we might do a ds.depower() here, but the reset will take care of it.
    present = ds.reset();
    ds.select(addr);
    ds.write(0xBE); // Read Scratchpad

    Serial.print(" Data = ");
    Serial.print(present, HEX);
    Serial.print(" ");
    for ( i = 0; i < 9; i++) { // we need 9 bytes
    data = ds.read();
    Serial.print(data, HEX);
    Serial.print(" ");
    }
    Serial.print(" CRC=");
    Serial.print(OneWire::crc8(data, 8), HEX);
    Serial.println();

    // Convert the data to actual temperature
    // because the result is a 16 bit signed integer, it should
    // be stored to an "int16_t" type, which is always 16 bits
    // even when compiled on a 32 bit processor.
    int16_t raw = (data[1] << 8) | data[0];
    if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
    // "count remain" gives full 12 bit resolution
    raw = (raw & 0xFFF0) + 12 - data[6];
    }
    } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
    }
    celsius = (float)raw / 16.0;
    fahrenheit = celsius * 1.8 + 32.0;
    Serial.print(" Temperature = ");
    Serial.print(celsius);
    Serial.print(" Celsius, ");
    Serial.print(fahrenheit);
    Serial.println(" Fahrenheit");

    float h = dht.readHumidity();
    float t = dht.readTemperature();

    myNextion.setComponentText("t5", String(t));
    delay(1000);

    myNextion.setComponentText("t6", String(h));
    myNextion.setComponentText("t7", String(t));//вывод на дисплей температуры с датчика №1
    myNextion.setComponentText("t8", String(t));//вывод на дисплей температуры с датчика №2
    myNextion.setComponentText("t9", String(t));//вывод на дисплей влажности с датчика №3
    myNextion.setComponentText("t10", String(t));//вывод на дисплей температуры с датчика №4
    delay(100);
    }
     
  2. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Не очень понятно, что вы имеете в виду. В окне - это в программе, в отдельном экране или экран один, и как-то переключаться между датчиками?
     
  3. Последнее редактирование: 30 окт 2016
  4. s1984i

    s1984i Нерд

    присоединюсь к теме. как получить температуру с нескольких датчиков 18B20 по 1 пину
     
  5. rkit

    rkit Гуру

    Так же, как и с одного.
     
  6. Какой развернутый ответ, спасибо дружище!!! Да уж хренушки, все совсем не так просто... Психанул и разобрался сам. IMG_1712.JPG IMG_1711.JPG
     
  7. rkit

    rkit Гуру

    Ну почти правильно. Только достаточно одного резистора и гораздо меньшего количества проводов.
     
  8. То о чем вы говорите не принципиально!!! Вопрос был другой -не связанный с монтажом! Вопрос был " Надо чтобы все определившиеся датчики температуры показывали информацию в своем окне..."???
     
  9. s1984i

    s1984i Нерд

    с 1 я могу получить температуру. как я понял для получения температуры с нескольких датчиков по 1 пину. нужно узнать их адреса и потом уже их опрашивать. вот тут то я и не понимаю с чего начать
     
  10. Для определения всех подключенных датчиков 18B20 и вывода с них информации

    Код (C++):
    #include <OneWire.h>

    // OneWire DS18S20, DS18B20, DS1822 Temperature Example
    //
    // <a href="<a href="http://www.pjrc.com/teensy/td_libs_OneWire.html" rel="nofollow">http://www.pjrc.com/teensy/td_libs_OneWire.html</a>" title="<a href="http://www.pjrc.com/teensy/td_libs_OneWire.html" rel="nofollow">http://www.pjrc.com/teensy/td_libs_OneWire.html</a>" rel="nofollow"><a href="http://www.pjrc.com/teensy/td_libs_OneWire.html" rel="nofollow">http://www.pjrc.com/teensy/td_libs_OneWire.html</a></a>
    //
    // The DallasTemperature library can do all this work for you!
    // <a href="<a href="http://milesburton.com/Dallas_Temperature_Control_Library" rel="nofollow">http://milesburton.com/Dallas_Temperature_Control_Library</a>" title="<a href="http://milesburton.com/Dallas_Temperature_Control_Library" rel="nofollow">http://milesburton.com/Dallas_Temperature_Control_Library</a>" rel="nofollow"><a href="http://milesburton.com/Dallas_Temperature_Control_Library" rel="nofollow">http://milesburton.com/Dallas_Temperature_Control_Library</a></a>

    OneWire  ds(2);  // on pin 10 (a 4.7K resistor is necessary)
      byte i;
      byte present = 0;
      byte type_s;
      byte data[12];
      byte addr[8];
      float celsius, fahrenheit;

    void setup(void) {
      Serial.begin(9600);
    }

    void loop(void) {


      if ( !ds.search(addr)) {
        Serial.println("No more addresses.");
        Serial.println();
        ds.reset_search();
        delay(250);
        return;
      }

      Serial.print("ROM =");
      for( i = 0; i < 8; i++) {
        Serial.write(' ');
        Serial.print(addr[i], HEX);
      }

      if (OneWire::crc8(addr, 7) != addr[7]) {
          Serial.println("CRC is not valid!");
          return;
      }
      Serial.println();
      // the first ROM byte indicates which chip
      switch (addr[0]) {
        case 0x10:
          Serial.println("  Chip = DS18S20");  // or old DS1820
          type_s = 1;
          break;
        case 0x28:
          Serial.println("  Chip = DS18B20");
          type_s = 0;
          break;
        case 0x22:
          Serial.println("  Chip = DS1822");
          type_s = 0;
          break;
        default:
          Serial.println("Device is not a DS18x20 family device.");
          return;
      }

      ds.reset();
      ds.select(addr);
      ds.write(0x44, 1);        // start conversion, with parasite power on at the end
      delay(1000);     // maybe 750ms is enough, maybe not
      present = ds.reset();
      ds.select(addr);  
      ds.write(0xBE);         // Read Scratchpad

      Serial.print("  Data = ");
      Serial.print(present, HEX);
      Serial.print(" ");
      for ( i = 0; i < 9; i++) {           // we need 9 bytes
        data[i] = ds.read();
        Serial.print(data[i], HEX);
        Serial.print(" ");
      }
      Serial.print(" CRC=");
      Serial.print(OneWire::crc8(data, 8), HEX);
      Serial.println();

      // Convert the data to actual temperature
      // because the result is a 16 bit signed integer, it should
      // be stored to an "int16_t" type, which is always 16 bits
      // even when compiled on a 32 bit processor.
      int16_t raw = (data[1] << 8) | data[0];
      if (type_s) {
        raw = raw << 3; // 9 bit resolution default
        if (data[7] == 0x10) {
          // "count remain" gives full 12 bit resolution
          raw = (raw & 0xFFF0) + 12 - data[6];
        }
      } else {
        byte cfg = (data[4] & 0x60);
        // at lower res, the low bits are undefined, so let's zero them
        if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
        else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
        else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
        //// default is 12 bit resolution, 750 ms conversion time
      }
      celsius = (float)raw / 16.0;
      Serial.print("  Temperature = ");
      Serial.print(celsius);
      Serial.print(" Celsius, ");
      Serial.print(fahrenheit);
      Serial.println(" Fahrenheit");
    }
     
  11. rkit

    rkit Гуру

    Не нужно знать адресов. Примеры есть в библиотеке 1wire.
     
  12. как вы не зная адреса выведете информацию именно с того датчика с которого вам надо именно в то окно которое нужно?
     
  13. rkit

    rkit Гуру

    По порядку отклика.
     
  14. Датчик в бане (например навернулся) -следующий тот который в теплице откликнулся и занял место в бане!
     
  15. Жесткая определялка для 5 термометров (кому какой адрес принадлежит)
    Код (C++):
    //280054B604000086          переводим в формат адреса 0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x86
    //28384EF80200003B                                    0x28, 0x38, 0x4E, 0xF8, 0x02, 0x00, 0x00, 0x3B

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

    // Data wire is plugged into port 2 on the Arduino
    #define ONE_WIRE_BUS 10
    #define TEMPERATURE_PRECISION 9

    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWire(ONE_WIRE_BUS);

    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors(&oneWire);

    // arrays to hold device addresses
    DeviceAddress insideThermometer, outsideThermometer, Thermometer1, Thermometer2, Thermometer3;

    void setup(void)
    {
      // start serial port
      Serial.begin(9600);
      Serial.println("Dallas Temperature IC Control Library Demo");

      // Start up the library
      sensors.begin();

      // locate devices on the bus
      Serial.print("Locating devices...");
      Serial.print("Found ");
      Serial.print(sensors.getDeviceCount(), DEC);
      Serial.println(" devices.");

      // report parasite power requirements
      Serial.print("Parasite power is: ");
      if (sensors.isParasitePowerMode()) Serial.println("ON");
      else Serial.println("OFF");

      // Assign address manually. The addresses below will beed to be changed
      // to valid device addresses on your bus. Device address can be retrieved
      // by using either oneWire.search(deviceAddress) or individually via
      // sensors.getAddress(deviceAddress, index)
      //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
      //outsideThermometer   = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };

      // Search for devices on the bus and assign based on an index. Ideally,
      // you would do this to initially discover addresses on the bus and then
      // use those addresses and manually assign them (see above) once you know
      // the devices on your bus (and assuming they don't change).
      //
      // method 1: by index
      if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
      if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");
      if (!sensors.getAddress(Thermometer1, 2)) Serial.println("Unable to find address for Device 2");
      if (!sensors.getAddress(Thermometer2, 3)) Serial.println("Unable to find address for Device 3");
      if (!sensors.getAddress(Thermometer3, 4)) Serial.println("Unable to find address for Device 4");

      // method 2: search()
      // search() looks for the next device. Returns 1 if a new address has been
      // returned. A zero might mean that the bus is shorted, there are no devices,
      // or you have already retrieved all of them. It might be a good idea to
      // check the CRC to make sure you didn't get garbage. The order is
      // deterministic. You will always get the same devices in the same order
      //
      // Must be called before search()
      //oneWire.reset_search();
      // assigns the first address found to insideThermometer
      //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");
      // assigns the seconds address found to outsideThermometer
      //if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer");

      // show the addresses we found on the bus
      Serial.print("Device 0 Address: ");
      printAddress(insideThermometer);
      Serial.println();

      Serial.print("Device 1 Address: ");
      printAddress(outsideThermometer);
      Serial.println();

      Serial.print("Device 2 Address: ");
      printAddress(Thermometer1);
      Serial.println();

      Serial.print("Device 3 Address: ");
      printAddress(Thermometer2);
      Serial.println();

      Serial.print("Device 4 Address: ");
      printAddress(Thermometer3);
      Serial.println();

      // set the resolution to 9 bit per device
      sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
      sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
      sensors.setResolution(Thermometer1, TEMPERATURE_PRECISION);
      sensors.setResolution(Thermometer2, TEMPERATURE_PRECISION);
      sensors.setResolution(Thermometer3, TEMPERATURE_PRECISION);

      Serial.print("Device 0 Resolution: ");
      Serial.print(sensors.getResolution(insideThermometer), DEC);
      Serial.println();

      Serial.print("Device 1 Resolution: ");
      Serial.print(sensors.getResolution(outsideThermometer), DEC);
      Serial.println();
     
      Serial.print("Device 2 Resolution: ");
      Serial.print(sensors.getResolution(Thermometer1), DEC);
      Serial.println();

      Serial.print("Device 3 Resolution: ");
      Serial.print(sensors.getResolution(Thermometer2), DEC);
      Serial.println();

      Serial.print("Device 4 Resolution: ");
      Serial.print(sensors.getResolution(Thermometer3), DEC);
      Serial.println();
    }

    // function to print a device address
    void printAddress(DeviceAddress deviceAddress)
    {
      for (uint8_t i = 0; i < 8; i++)
      {
        // zero pad the address if necessary
        if (deviceAddress[i] < 16) Serial.print("0");
        Serial.print(deviceAddress[i], HEX);
      }
    }

    // function to print the temperature for a device
    void printTemperature(DeviceAddress deviceAddress)
    {
      float tempC = sensors.getTempC(deviceAddress);
      Serial.print("Temp C: ");
      Serial.print(tempC);
      Serial.print(" Temp F: ");
      Serial.print(DallasTemperature::toFahrenheit(tempC));
    }

    // function to print a device's resolution
    void printResolution(DeviceAddress deviceAddress)
    {
      Serial.print("Resolution: ");
      Serial.print(sensors.getResolution(deviceAddress));
      Serial.println();  
    }

    // main function to print information about a device
    void printData(DeviceAddress deviceAddress)
    {
      Serial.print("Device Address: ");
      printAddress(deviceAddress);
      Serial.print(" ");
      printTemperature(deviceAddress);
      Serial.println();
    }

    /*
    * Main function, calls the temperatures in a loop.
    */

    void loop(void)
    {
      // call sensors.requestTemperatures() to issue a global temperature
      // request to all devices on the bus
      Serial.print("Requesting temperatures...");
      sensors.requestTemperatures();
      Serial.println("DONE");

      // print the device information
      printData(insideThermometer);
      printData(outsideThermometer);
      printData(Thermometer1);
      printData(Thermometer2);
      printData(Thermometer3);
    }
     
  16. Dallas Temperature IC Control Library Demo
    Locating devices...Found 5 devices.
    Parasite power is: OFF
    Device 0 Address: 28384EF80200003B
    Device 1 Address: 28C253F802000016
    Device 2 Address: 28B638F802000033
    Device 3 Address: 284162F8020000EC
    Device 4 Address: 283538F802000080
    Device 0 Resolution: 9
    Device 1 Resolution: 9
    Device 2 Resolution: 9
    Device 3 Resolution: 9
    Device 4 Resolution: 9
    Requesting temperatures...DONE
    Device Address: 28384EF80200003B Temp C: 24.50 Temp F: 76.10
    Device Address: 28C253F802000016 Temp C: 24.50 Temp F: 76.10
    Device Address: 28B638F802000033 Temp C: 24.50 Temp F: 76.10
    Device Address: 284162F8020000EC Temp C: 24.50 Temp F: 76.10
    Device Address: 283538F802000080 Temp C: 24.50 Temp F: 76.10
    Requesting temperatures...DONE


    280054B604000086 и потом переводим в формат адреса 0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x86
    28384EF80200003B 0x28, 0x38, 0x4E, 0xF8, 0x02, 0x00, 0x00, 0x3B
    28C253F802000016 0x28, 0xC2, 0x53, 0xF8, 0x02, 0x00, 0x00, 0x16
    28B638F802000033 0x28, 0xB6, 0x38, 0xF8, 0x02, 0x00, 0x00, 0x33
    284162F8020000EC 0x28, 0x41, 0x62, 0xF8, 0x02, 0x00, 0x00, 0xEC
    283538F802000080 0x28, 0x35, 0x38, 0xF8, 0x02, 0x00, 0x00, 0x80
     
  17. Максим B

    Максим B Гуру

    А в какой программе это сделано?
     
  18. Максим B нравится это.
  19. Максим B

    Максим B Гуру

  20. AlexVS

    AlexVS Гик

    Откуда такие умные берутся? Где таки дельные советы берут?
     
    Денчик_45 нравится это.