NodeMCU+ds18b20 без библиотек

Thorn
Offline
Зарегистрирован: 07.11.2014

Прошу непосылайте в 8266 сообщество вопрос простой надеюсь.....

Приветствую форумчан, решил поиграться с такой штукой как 8266-12e уже распаянный, на замену Nano с её 32кб памяти очень холчется БОЛЬШОЕ и ёмкое меню на 2,2spi :) а памяти нехватает с моими кривыми руками.

пытаюсь подключить по OneWire датчики на ds18b20 используя адресацию каждого и неиспользуя библиотеку <DallasTemperature.h> а лишь <OneWire.h>

переменные определил так:

int tempPin=D6;                     //Определяем порт шины OneWire (IC) для температурного датчика DS18B20                               
OneWire ds(tempPin);                //Создаем объект для работы с термометром
byte flagDallas=0;                  //Флаг для обработки показаний с датчиков Dallas
byte data[12];
byte addr1[8]={0x28, 0xFF, 0x9C, 0x20, 0x54, 0x14, 0x01, 0xC2};     //адрес датчика DS18B20_ 28 FF 9C 20 54 14 1 C2
byte addr2[8]={0x28, 0xFF, 0xB5, 0x24, 0x54, 0x14, 0x01, 0xC7};     //адрес датчика DS18B20_
unsigned int raw;                   //Если экранированный кабель, можно подключать до 32 термо-датчиков DS18B20
float temp[2];                      //Температура ...\....

а цикл с полученим показаний с датчика такой:

//=========== Считывание температур
void dallas(){
  ds.reset();
  ds.write(0xCC);                                      //Команда инициации  
  ds.write(0x44);                                      //Start conversion, with parasite power on at the end
    tzad=millis()+750; flagDallas=1;}
  
  float DS18B20(byte *adres){
  ds.reset();
  ds.select(adres);
  ds.write(0xBE);                                      //Read Scratchpad
    for (byte i=0; i<9; i++) data[i]=ds.read();        //We need 9 bytes
    int raw=(data[1]<<8) | data[0];                    //Переводим в температуру   
    float celsius=(float)raw/16.0;                     //Для ds18b20 делим на "16", для ds18s20 на "2"
    return celsius;

//=========== Обработки печати и вывода на дисплейчик (динамики)
void printDin(){
      if (millis()-prvMlsVo>zadTime[3]){                     //Проверяем интервал для обновления показателй динамичных
    prvMlsVo=millis();
    tft.setTextSize(3);
    tft.setCursor(20,60);
    tft.setTextColor(WHITE, MAGENTA);
    tft.print(temp);
        Serial.println(temp);

и получаю показания типа 0,00

Этот же скечт на Nano работает как часики.

На этом же пине в 8266-12е с ПРИМЕРОМ из библиотеки #include <DallasTemperature.h> всё находится, конвертируются показания.

p/s ОЧЕНЬ важное замечание использую tft на ILI9163C и как только я определяю его в setup() как   tft.begin();

то и сбиблиотекой значения -127

Помогите КАК запустить ds18b20 на этой чудо плате, может в setup() датчики запускать иначе?

arDubino
Offline
Зарегистрирован: 12.01.2017

может надо просто понять что это чудо не ардуина :))) и там наверно свои тараканы

Thorn
Offline
Зарегистрирован: 07.11.2014

Вот к этому я потихонечку и подхожу покуривая 8266 сообщество. Чесно говоря - тёмноватый лес пока и укак то "нележит" к самим ардуинкам. Но чисто логически код работающий исправно и вдруг такая засада, более того, даже ПРИМЕР отлично работающий вдруг перестаёр рабтать при определении дополнительных библиотек, и самое странное по отдельности прекрансо работают, более тго tft просто летает. Жаль бьюсь вторую недели почуть чуть в свободное время и думал что будет "быстро".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

у меня всё работало, вот только не помню с библиотеками или без, залил скетч, выставил датчики на улицу, съём показаний раз в 5 минут

Выходит без

Что нашёл из заготовок:
 

#include <OneWire.h>

OneWire  ds(6);

 byte i;
          byte present = 0;
          byte data[12];
          byte addr[8];  
          if ( !ds.search(addr)) {
            ds.reset_search();
            return;
          }  

          if ( OneWire::crc8( addr, 7) != addr[7]) {
            return;
          }

          if ( addr[0] != 0x10) {
            return;
          }

          ds.reset();
          ds.select(addr);
          ds.write(0x44,1); 
          delay(1000);
          present = ds.reset();
          ds.select(addr);    
          ds.write(0xBE);

          for ( i = 0; i < 9; i++) {
            data[i] = ds.read();
          }

          int HighByte, LowByte, TReading, Tce;
          LowByte = data[0];
          HighByte = data[1];
          TReading = (HighByte << 8) + LowByte; 
          Tce = TReading/2;
          temp = (Tce);
        }

 

Thorn
Offline
Зарегистрирован: 07.11.2014

Вот взгляните пожалста на такое... в определении библиотек и переменных сделал так:

#include <OneWire.h>                 //Подключаем библиотеку для температурного датчика DS18B20

//=====Termo_Sensor ds18b20*
OneWire  ds(D6);  

//=====Tft*
//#include "SPI.h"
#include "Adafruit_ILI9341.h"

// For the Adafruit shield, these are the default.
#define TFT_DC D4
#define TFT_CS D3
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

в цикл вставил уже тупо код из библиотеки OneWire так:

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[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
  // 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[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;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");

ну тоесть прямо бибилиотечный, а в setup() прописал только   Serial.begin(115200);

и в мониоре вижу следующее:

  Chip = DS18B20
  Data = 1 90 1 14 97 1F FF 1F 10 83  CRC=83
  Temperature = 25.00 Celsius, 77.00 Fahrenheit
No more addresses. // датчик пока один... но будет несколько на одном проводе :)

и стоит дописать в setup()  

Serial.begin(115200);  

tft.begin();

получаем в мониторе лишь No more addresses.

Ну явно чт от омешает работать с адресами в OneWire 9нехватает у меня знаний вот так и думаю, а поправить немогу)

пробовал библиотечки и с ili9341 и с ili9163 - все тоже

bwn
Offline
Зарегистрирован: 25.08.2014

Чет мне подсказывает, что они совместно один таймер пытаются юзать. Помочь не помогу, сам не умею.
Thorn, выбросьте тот огрызок, мне стыдно за него. Здесь поэлегантней, на миллис ниже есть.
Если сумеете как то ЕвгенийП поймать, он писал что делал для тиньки без библиотек, может что присоветует.

Thorn
Offline
Зарегистрирован: 07.11.2014

Как всегда спасибо ув. bwn :) Вадим за разъяснение, пока отложил понемногу проектик перехода, упершись во вссего 10 цифровых пинов у node .... из них сам дисплейчки забирает уже 6!!!!! остается 4. Для dallas, для dht, а вот bmp уже ДВА просит :( и всё... ни тебе fruj исполнительного механизма уже неподключить в итоге, все только мониторить на экранчике да на веб-страничке, тут конечно красота. Так что нетак то она и хороша по сравнению со строй доброй Nano-й

bwn
Offline
Зарегистрирован: 25.08.2014

А I2C аппаратный у нее есть? Если да, то исполнительных вкл-выкл можно гору через PCF8574 подцепить. Этот на восемь входов-выходов, есть на 16.

Thorn
Offline
Зарегистрирован: 07.11.2014

имеется на  первом\втором пинах... несмотря на то что СЛЕВА все SPI выведены (аккурат под tft дисплейчки) - НИ с одной библиотекой я так там и незаставил их работать.

заработало лишь как на нижнем скрине (пробовал и ili9341 и ili9163c):

bwn
Offline
Зарегистрирован: 25.08.2014

Ну, здесь не помошник, не было такого зверя у меня.))))

macros
Offline
Зарегистрирован: 07.11.2016

А вы какие библиотеи используете? Адаптированые для есп? Для экрана нагуглил: https://github.com/Sermus/ESP8266_Adafruit_ILI9341

Там рекомендуют соединять так:

ILI9341 pin --> ESP8266 pin

MOSI --> GPIO13

CLK --> GPIO14

CS --> GPIO15

DC --> GPIO2

Reset to 3.3v

GND to ground

MISO may be left unconnected

Тоже пробую с есп разобраться, портов не хватает, там из тех что есть не все можно полноценно использовать:

Thorn
Offline
Зарегистрирован: 07.11.2014

Библиотечки именно под esp8266 (в настройках среды ардуино http://arduino.esp8266.com/package_esp8266com_index.json)

а вот как выглядит макетка :) тут уже показания с dallas-127 (при setup()  tft.begin(); )

а вот показания c I2S bpm085 (3.3v) выводятся правильно (правда я до сих пор непонимаю почему в томже setup() нельзя скорректировать ВЫСОТУ моей местности, потмоу давление и высота на 251метр примерное ниже чем должно быть. Находил что это прописывается в выводе!!! уже показаний но не в расчёте tft.print( bmp.readSealevelPressure()/133.3,1);

 

Thorn
Offline
Зарегистрирован: 07.11.2014

macros пишет:

Для экрана нагуглил: https://github.com/Sermus/ESP8266_Adafruit_ILI9341

А куда вы библиотеку то "засунули", пробовал в ТРИ места :) ни в одном НЕПОЯВИЛАСЬ в списке примеров:

C:\Users\......\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries

D:\Arduino\libraries\

D:\Arduino\Sketch\libraries\

В прежних версиях среды была ОДНА папка Arduino\libraries\ и в ней что ни появись тут же вылазили или проблемы несовмстимоси при компилировании (IR к примеру с MotorShield) и тп. а счас в трёх местах все дублируется

 

bwn
Offline
Зарегистрирован: 25.08.2014

Thorn, а от чего у Вас вся эта лабуда запитана? -127 это чаще всего отсутствие питания (могу ошибаться).

macros
Offline
Зарегистрирован: 07.11.2016

Thorn пишет:

А куда вы библиотеку то "засунули", пробовал в ТРИ места :) ни в одном НЕПОЯВИЛАСЬ в списке примеров

она не для ардуино ide, просто как демонстрация, что схема подключения зависит от библиотеки.

У вас получается библиотеки из ардуино подключаются, кроме специфичных которые подкачались при установке ардуино коре для 8266.

Thorn
Offline
Зарегистрирован: 07.11.2014

bwn пишет:

Thorn, а от чего у Вас вся эта лабуда запитана? -127 это чаще всего отсутствие питания (могу ошибаться).

Вот то то и оно чтоо т общей +5В схемы питания самой node, как я уже отмечал -127 выводится тутже после старта tft крана в setup..... стоит закоментить в скетчике и вуаля нормальные данные :)

bwn
Offline
Зарегистрирован: 25.08.2014

В качестве полета фантазии: отключать экран на момент замера, потом обратно инициировать (проверить не на чем, возможно бред).
На всякий случай проверить питание при инициализации, хотя вряд ли. Подсветка в этот момент загораться не должна, а больше там жрать нечему.