DS18B20

Тема в разделе "Arduino & Shields", создана пользователем Perun61, 15 ноя 2012.

  1. sys

    sys Злобный Буратино Модератор

    аааа... "Короткое замыкание" - один из немногих американских фильмов, которые я готов пересматривать на любом языке :)
     
  2. Silver

    Silver Нуб

    Вот что здесь не так? Датчик показывает теперь стабильно -0.06

    /*ReadDS18B20
    ver: 6 Jly 2010
    THIS IS A FIRST DRAFT.... WORKS, but scheduled for overhaul.


    Simple, simple test of reading DS18B20
    connected to nuelectronics.com datalogging shield.

    See...

    http://sheepdogguides.com/arduino/ar3ne1tt.htm

    ... for explanation of this code.

    Code lightly adapted from code from nuelectronics.com*/

    #define TEMP_PIN 14 //See Note 1, sheepdogguides..ar3ne1tt.htm

    void OneWireReset(int Pin);//See Note 2
    void OneWireOutByte(int Pin, byte d);
    byte OneWireInByte(int Pin);

    void setup() {
    digitalWrite(TEMP_PIN, LOW);
    pinMode(TEMP_PIN, INPUT); // sets the digital pin as input (logic 1)
    Serial.begin(9600);
    //9600 to match the data rate being used by the
    //serial monitor on my system, which is set to
    //the Arduino default. (Sample code published
    //by nuelectronics used a faster baud rate.)
    delay(100);
    Serial.print("temperature measurement:\n");
    }

    void loop(){
    int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;

    OneWireReset(TEMP_PIN);
    OneWireOutByte(TEMP_PIN, 0xcc);
    OneWireOutByte(TEMP_PIN, 0x44); // perform temperature conversion, strong pullup for one sec

    OneWireReset(TEMP_PIN);
    OneWireOutByte(TEMP_PIN, 0xcc);
    OneWireOutByte(TEMP_PIN, 0xbe);

    LowByte = OneWireInByte(TEMP_PIN);
    HighByte = OneWireInByte(TEMP_PIN);
    TReading = (HighByte << 8) + LowByte;
    SignBit = TReading & 0x8000; // test most sig bit
    if (SignBit) // negative
    {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
    }
    Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25

    Whole = Tc_100 / 100; // separate off the whole and fractional portions
    Fract = Tc_100 % 100;


    if (SignBit) // If its negative
    {
    Serial.print("-");
    }
    Serial.print(Whole);
    Serial.print(".");
    if (Fract < 10)
    {
    Serial.print("0");
    }

    Serial.print(Fract);

    Serial.print("\n");
    delay(5000); // 5 second delay. Adjust as necessary
    }

    void OneWireReset(int Pin) // reset. Should improve to act as a presence pulse
    {
    digitalWrite(Pin, LOW);
    pinMode(Pin, OUTPUT); // bring low for 500 us
    delayMicroseconds(500);
    pinMode(Pin, INPUT);
    delayMicroseconds(500);
    }

    void OneWireOutByte(int Pin, byte d) // output byte d (least sig bit first).
    {
    byte n;

    for(n=8; n!=0; n--)
    {
    if ((d & 0x01) == 1) // test least sig bit
    {
    digitalWrite(Pin, LOW);
    pinMode(Pin, OUTPUT);
    delayMicroseconds(5);
    pinMode(Pin, INPUT);
    delayMicroseconds(60);
    }
    else
    {
    digitalWrite(Pin, LOW);
    pinMode(Pin, OUTPUT);
    delayMicroseconds(60);
    pinMode(Pin, INPUT);
    }

    d=d>>1; // now the next bit is in the least sig bit position.
    }

    }

    byte OneWireInByte(int Pin) // read byte, least sig byte first
    {
    byte d, n, b;

    for (n=0; n<8; n++)
    {
    digitalWrite(Pin, LOW);
    pinMode(Pin, OUTPUT);
    delayMicroseconds(5);
    pinMode(Pin, INPUT);
    delayMicroseconds(5);
    b = digitalRead(Pin);
    delayMicroseconds(50);
    d = (d >> 1) | (b<<7); // shift d to right and insert b in most sig bit position
    }
    return(d);
    }
     
  3. Silver

    Silver Нуб

    И что это за ошибка в процессе компиляции? Уже не первый раз. Не понятно ничего вообще.

    Безымянный.png
     
  4. ZAZ-965

    ZAZ-965 Гуру

  5. Silver

    Silver Нуб

    Компиляция прошла успешно. Вот итог.

    Безымянный.png
     
  6. ZAZ-965

    ZAZ-965 Гуру

    Если вы о примере с https://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html, то измените коды датчиков на свои
    Код (C++):
    DeviceAddress insideThermometer = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
    DeviceAddress outsideThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };
    DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };
    А проще соберите пример DS18x20_Temperature из поставки библиотеки
     
  7. Silver

    Silver Нуб

    Я в этих делах совсем нуб. Не затруднит Вас всё разжевать и в рот сложить? Мне нужен просто работающий датчик. Никаких других примочек мне не надо. Заранее спасибо за помощь.
     
  8. ZAZ-965

    ZAZ-965 Гуру

  9. Silver

    Silver Нуб

    Я правильно понимаю, что номер пина = номер GPIO?
     
  10. ZAZ-965

    ZAZ-965 Гуру

  11. Silver

    Silver Нуб

    Теперь вообще ничего не понятно. С Вами как-то можно связаться вне форума? Не хочется устраивать здесь бесполезный чат.
     
  12. ZAZ-965

    ZAZ-965 Гуру

  13. Silver

    Silver Нуб

    Сделал как Вы сказали. Результат:

    Безымянный.png
     
  14. ИгорьК

    ИгорьК Гуру

    Извиняюсь, а что Вы хотите получить в итоге? К чему эти мучения?
     
  15. Silver

    Silver Нуб

    Я хочу получить ответ от датчика. Хочу в открытом СОМ-порте видеть текущую температуру. Тем самым я пойму, что всё настроено правильно и всё работает. Далее хочу вывести температуру в Интернет.
     
  16. ИгорьК

    ИгорьК Гуру

    В Интернет - в каком образе? Можно точнее?
    Видите ли, это не праздное любопытство. Если это все что Вам нужно и "насовсем" - лучше найти подходящее руководство сделать и забыть. Если Вы хотите чему-то научиться, надо бы начинать с понимания как работает датчик и как он взаимодействует с МК. И ESP8266 для этого не совсем подходящее устройство.
     
  17. Silver

    Silver Нуб

    В Интернет на простой сайт. Как сделано здесь: thermo.karelia.ru

    Да, мне нужно только это. Больше мне не нужно ничего. А использую я именно ESP8266 только потому, что мне нужно передавать данные по Wi-Fi. В планах есть создать некую сеть термометров по городу и вывести данные на сайт. Датчики будут размещаться в квартирах моих знакомых.

    Я уже устал искать эти подходящие руководства. НЕ получается ничего. То кракозябры выходят, то -127, то No more addresses
     
  18. ИгорьК

    ИгорьК Гуру

    Спасибо. Это не моя тема. Но, полагаю, Ваш ответ будет важен тем кто будет отвечать.
    Я делал здесь две темы по отправке температуры на сайт. Одна - на народный мониторинг, другая - графики на интернет страничке. Обе на ESP.
    Можете поискать.
     
  19. Silver

    Silver Нуб

    А может быть Вы можете помочь разобраться с проблемой? Почему СОМ всё время что-то выдаёт, но только не температуру? Я уже месяц борюсь с этим!
     
  20. ZAZ-965

    ZAZ-965 Гуру

    @Silver, проверьте исправность и правильность подключения датчика.