NodeMCU+ds18b20 без библиотек
- Войдите на сайт для отправки комментариев
Прошу непосылайте в 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() датчики запускать иначе?
может надо просто понять что это чудо не ардуина :))) и там наверно свои тараканы
Вот к этому я потихонечку и подхожу покуривая 8266 сообщество. Чесно говоря - тёмноватый лес пока и укак то "нележит" к самим ардуинкам. Но чисто логически код работающий исправно и вдруг такая засада, более того, даже ПРИМЕР отлично работающий вдруг перестаёр рабтать при определении дополнительных библиотек, и самое странное по отдельности прекрансо работают, более тго tft просто летает. Жаль бьюсь вторую недели почуть чуть в свободное время и думал что будет "быстро".
у меня всё работало, вот только не помню с библиотеками или без, залил скетч, выставил датчики на улицу, съём показаний раз в 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); }Вот взгляните пожалста на такое... в определении библиотек и переменных сделал так:
в цикл вставил уже тупо код из библиотеки 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 - все тоже
Чет мне подсказывает, что они совместно один таймер пытаются юзать. Помочь не помогу, сам не умею.
Thorn, выбросьте тот огрызок, мне стыдно за него. Здесь поэлегантней, на миллис ниже есть.
Если сумеете как то ЕвгенийП поймать, он писал что делал для тиньки без библиотек, может что присоветует.
Как всегда спасибо ув. bwn :) Вадим за разъяснение, пока отложил понемногу проектик перехода, упершись во вссего 10 цифровых пинов у node .... из них сам дисплейчки забирает уже 6!!!!! остается 4. Для dallas, для dht, а вот bmp уже ДВА просит :( и всё... ни тебе fruj исполнительного механизма уже неподключить в итоге, все только мониторить на экранчике да на веб-страничке, тут конечно красота. Так что нетак то она и хороша по сравнению со строй доброй Nano-й
А I2C аппаратный у нее есть? Если да, то исполнительных вкл-выкл можно гору через PCF8574 подцепить. Этот на восемь входов-выходов, есть на 16.
имеется на первом\втором пинах... несмотря на то что СЛЕВА все SPI выведены (аккурат под tft дисплейчки) - НИ с одной библиотекой я так там и незаставил их работать.
заработало лишь как на нижнем скрине (пробовал и ili9341 и ili9163c):
Ну, здесь не помошник, не было такого зверя у меня.))))
А вы какие библиотеи используете? Адаптированые для есп? Для экрана нагуглил: 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
Тоже пробую с есп разобраться, портов не хватает, там из тех что есть не все можно полноценно использовать:
Библиотечки именно под 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);
Для экрана нагуглил: 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) и тп. а счас в трёх местах все дублируется
Thorn, а от чего у Вас вся эта лабуда запитана? -127 это чаще всего отсутствие питания (могу ошибаться).
А куда вы библиотеку то "засунули", пробовал в ТРИ места :) ни в одном НЕПОЯВИЛАСЬ в списке примеров
она не для ардуино ide, просто как демонстрация, что схема подключения зависит от библиотеки.
У вас получается библиотеки из ардуино подключаются, кроме специфичных которые подкачались при установке ардуино коре для 8266.
Thorn, а от чего у Вас вся эта лабуда запитана? -127 это чаще всего отсутствие питания (могу ошибаться).
Вот то то и оно чтоо т общей +5В схемы питания самой node, как я уже отмечал -127 выводится тутже после старта tft крана в setup..... стоит закоментить в скетчике и вуаля нормальные данные :)
В качестве полета фантазии: отключать экран на момент замера, потом обратно инициировать (проверить не на чем, возможно бред).
На всякий случай проверить питание при инициализации, хотя вряд ли. Подсветка в этот момент загораться не должна, а больше там жрать нечему.