• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Второй раз задаю вопрос по ESP-201 + UDP11

Sever44

Member
Всем привет!
На первый вопрос так и не получил ответ.
Ситуация, казалось, очень простая - пытаюсь подключить датчик температуры DHT11 к модулю ESP-201 (НЕ ESP-12!!).
Посмотрел несколько ссылок, перепробовал все варианты номеров ПИНов в скетче и входов модуля.
Скетч упорно не работает.
Скетч и датчик проверены (с Ардуино Мега и Нано работают, выход датчика подтянут).

ПРОСЬБА!!
У кого есть работающий скетч, укажите, какой ПИН надо указать в скетче (#define DHTPIN ?) и к какому контакту подключить выход датчика (желательно в обозначении, указанном на модуле).
 
Последнее редактирование:

enjoynering

Well-known member
во-первых сенсор называеться по другому. исправте пожалуйста. во-вторых для работы этого сенсора нужен подтягивающий резистор. вы его подключили?
 

Sever44

Member
во-первых сенсор называеться по другому. исправте пожалуйста. во-вторых для работы этого сенсора нужен подтягивающий резистор. вы его подключили?
Название исправил, спасибо за замечание. Про подтягивающий резистор написано, ОН ЕСТЬ.
 

enjoynering

Well-known member
вот список контактов которые можно использовать

ESP8266EX имеет 17 контактов GPIO, которые могут быть назначены как входы/выходы, с помощью соответствующих регистров. GPIO0..GPIO15 могут быть входами/выходами с internal pull-up или pull-down. GPIO16 может быть входом/выходом, но только pull-down. Прерывания могут быть назначены на любой GPIO, кроме GPIO16.

GPIO4,5,12,13,14 - могут быть входами/выходами без всяких ограничений, но физический полностью свободны только GPIO4 и GPIO5. Так что все самое важное вешаем на них.

GPIO0,2 - могут быть входами/выходами с ограничениями. В момент старта оба должны быть подтянуты к питанию. Во время програмирования GPIO2 выход U1TXD откуда "валятся" неотключаемые сообщения о загрузке, а в режиме "программирования" - ответы внешнему UART. Все стартовые сообщения ROM-BIOS выводятся в оба порта GPIO1/U0TXD (см. ниже) и GPIO2/U1TXD на скорости 74880bps и «NL & CR». Основная скорость UART0/UART1 115200bps, а на 74880bps отправляется отладочная информация. Также сразу после старта модуля в течении ~30msec на GPIO0 выводится сигнал CLK с частотой 26MHz, пока не стартанет инициализация в SDK (очистка RAM, ожидания установки PLL на кварц в 26 МГц, включение таймеров и вывод сообщений в UART уже из кода SDK). В режиме "программирования" на GPIO0 всегда 26MHz. Так что будте осторожны, особенно если вы вешаете на эти пины управление газом для котла и тд. Но это не мешает С ОСТОРОЖНОСТЬЮ использовать их, для I2C шины, где все равно нужна подтяжка. Тогда SCL - GPIO2, а SDA - GPIO0. Дело в том, что Arduino I2C библиотека для ESP8266 - это ногодрыг с парочкой багов. ESP8266 Core для Arduino работает по событиям и ногодрыг с настроенными интервалами ей до лампачки. Система может запретить что угодно когда ей угодно и передать событие другим таскам. Из-за этого часто случаются колизии на I2C шине и ведомый/slave прижимает SDA/SCL к земле. Самый вин ловят с ведомыми на батарейках - например RTC. На reset и передергивание питания такие ESP8266 не реагируют так как slave залочил шину и имеет свой собственный источник питания, который передернуть забывают :)

GPIO15 - в момент старта должен быть подтянут к нулю и из-за этого его сложно использовать как вход, но можно использовать в качестве выхода.

GPIO16 - выход с открытым коллектором. Его едиственная цель «железная» перезагрузка модуля для выхода из Deep-sleep. Для этого GPIO16 надо соединить с RESET через резистор 470Oм и кратковременно подать низкий логический уровень.

GPIO1,3 - не трогать. В режиме "программирования" является UART(GPIO1/U0TXD и GPIO3/U0RXD) после используется для общения с PC или другими устройствами. В NodeMCU/WeMos он уже подключен к внешнему UART/USB чипу.

GPIO6,7,8,9,10,11 - не трогать, к ним подключенна SPI-Flash. В большинстве программ используется флэш-память, а также оперативная память, поэтому, если вы специально не убедитесь, что ваш код работает только с ОЗУ, не трогайте эти контакты. Точное количество используемых контактов зависит от типа флэш в модуле. QuadIO флэш использует 4 строки для данных (6 контактов) и в 4-е раза быстрее стандартной флэш. DualIO флэш использует 2 строки для данных (4 контакта). Стандартная использует одну строку для данных (3 контакта) и освобождают GPIO9, 10. Если вы точно не знаете, что на вашем модуле, не трогайте GPIO6..GPIO11. В режиме "программирования" GPIO8 становится U1RXD.

!!!Общее правило - не перегружать выходы и не вешать на них большой емкостной нагрузки, а если вешаете, то пересчитывайте резистор. Номинальный ток на один контакт 6мА, максимальный 12мА. Вспоминаем закон Ома R = U/I = 3.3В / 0.006 А = 550 Ом, то есть, на 560 Ом.

!!!Состояния выбора загрузки (для Arduino - это загрузка с Flash) определяется напряжением на пинах GPIO0,2,15 и защелкиваются по фронту RESET. Длительность сигнала RESET у ESP8266 всего 1нс. По этому если у вас на выводах от которых зависит выбор типа загрузки, нет подтягивающих резисторов, то внешняя помеха во время загзузки/просыпания приведет к неверному типу загрузки. Также следует установить подтягивающий резистор на CP_PD который служит для «железного» перевода модуля в энергосберегающий режим.
 
Последнее редактирование:

Sever44

Member
Нет у меня 201 поэтому даю ссылку на чужое: Programming ESP8266- ESP-201 Stand Alone With Arduino IDE
Я Вам очень признателен!
Я видел этот пример, назначал #define DHTPIN 4, подключал подтянутый выход к IO4, не работало.
ОКАЗАЛОСЬ, что в моем скетче не хватало DHT dht(DHTPIN,DHTTYPE,11); было просто DHT dht(DHTPIN, DHTTYPE);
Кто может объяснить, что задает этот параметр?
Всем заранее спасибо, особенно Юрию Ботову.
 

Sever44

Member
вот список контактов которые можно использовать

GPIO4,5,12,13,14 - пины на вход или выход без всяких ограничений.
GPIO0, 2 - в момент старта должны быть подтянуты к единичке, но это не мешает использовать их, к примеру для I2C шины, после старта, где все равно нужна подтяжка.
Но на GPIO0 после старта модуля выводиться сигнал CLK в 26 MHz, пока инициализируется SDK. В режиме "программирования" всегда выводится 26MHz. Так что будте осторожны, особенно если вы вешаете на это пин управление газом для котла и тд.
GPIO15 - в момент старта должен быть подтянут к нулю и из-за этого его сложно использовать как вход, но можно использовать в качестве выхода.
GPIO16 - выход с открытым коллектором. Лучше не использовать, оставить до времен когда он понадобится выхода из спящего режима.
GPIO1,3 - UART - используется для программирования и общения с компом или другими устройствами. В Nodemcu он уже подключен к микросхеме интерфейса. лучше и оставить для этих целей, IMHO.
GPIO10 - удавалось использовать как выход без каких либо проблем.
GPIO 6,7,8,9,11 - не трогать, к ним включена SPI-Flash с которой и работает модуль. GPIO9 - как тут пишут нужно поизвращаться, потому ну его на фиг.
!!!Общее правило - не перегружать выходы и не вешать на них большой емкостной нагрузки (а если вешаете, то пересчитывайте резистор). максимальный ток на один контакт 12мА.
Спасибо, намотал на ус.
 

Юрий Ботов

Moderator
Команда форума
Смотрю код библиотеки adafruit и понимаю - вы явно пользуетесь другой библиотекой... В моей третий параметр есть, имеет имя... "count", но нигде по тексту не используется. Потому выложите-ка ссылку на используемую библиотеку...
 

Sever44

Member
Смотрю код библиотеки adafruit и понимаю - вы явно пользуетесь другой библиотекой... В моей третий параметр есть, имеет имя... "count", но нигде по тексту не используется. Потому выложите-ка ссылку на используемую библиотеку...
Пользуюсь универсальной библиотекой #include "DHT.h".
/* DHT library
MIT license
written by Adafruit Industries
*/
Упоминание параметра "count" нашел в комментарии:
// Note that count is now ignored as the DHT reading algorithm adjusts itself
// basd on the speed of the processor.
и на строках 237, 243, 251 и 257
в этой библиотеке:
DHT-sensor-library/DHT.cpp at master · adafruit/DHT-sensor-library · GitHub

Правда, это касается "полной" версии библиртеки.

В установленной в C:\Program Files (x86)\Arduino\libraries "урезанной" версии (честно говоря, не помню, где скачал) упоминание параметра "count" встречается лишь на строке 12:
/* DHT library

MIT license
written by Adafruit Industries
*/

#include "DHT.h"

DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) {
_pin = pin;
_type = type;
_count = count;
firstreading = true;
}

void DHT::begin(void) {
// set up the pins!
pinMode(_pin, INPUT);
digitalWrite(_pin, HIGH);
_lastreadtime = 0;
}

//boolean S == Scale. True == Farenheit; False == Celcius
float DHT::readTemperature(bool S) {
float f;

if (read()) {
switch (_type) {
case DHT11:
f = data[2];
if(S)
f = convertCtoF(f);

return f;
case DHT22:
case DHT21:
f = data[2] & 0x7F;
f *= 256;
f += data[3];
f /= 10;
if (data[2] & 0x80)
f *= -1;
if(S)
f = convertCtoF(f);

return f;
}
}
return NAN;
}

float DHT::convertCtoF(float c) {
return c * 9 / 5 + 32;
}

float DHT::convertFtoC(float f) {
return (f - 32) * 5 / 9;
}

float DHT::readHumidity(void) {
float f;
if (read()) {
switch (_type) {
case DHT11:
f = data[0];
return f;
case DHT22:
case DHT21:
f = data[0];
f *= 256;
f += data[1];
f /= 10;
return f;
}
}
return NAN;
}

float DHT::computeHeatIndex(float tempFahrenheit, float percentHumidity) {
// Adapted from equation at: Humidity Index formula · Issue #9 · adafruit/DHT-sensor-library · GitHub and
// Wikipedia: Heat index - Wikipedia
return -42.379 +
2.04901523 * tempFahrenheit +
10.14333127 * percentHumidity +
-0.22475541 * tempFahrenheit*percentHumidity +
-0.00683783 * pow(tempFahrenheit, 2) +
-0.05481717 * pow(percentHumidity, 2) +
0.00122874 * pow(tempFahrenheit, 2) * percentHumidity +
0.00085282 * tempFahrenheit*pow(percentHumidity, 2) +
-0.00000199 * pow(tempFahrenheit, 2) * pow(percentHumidity, 2);
}


boolean DHT::read(void) {
uint8_t laststate = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;
unsigned long currenttime;

// Check if sensor was read less than two seconds ago and return early
// to use last reading.
currenttime = millis();
if (currenttime < _lastreadtime) {
// ie there was a rollover
_lastreadtime = 0;
}
if (!firstreading && ((currenttime - _lastreadtime) < 2000)) {
return true; // return last correct measurement
//delay(2000 - (currenttime - _lastreadtime));
}
firstreading = false;
/*
Serial.print("Currtime: "); Serial.print(currenttime);
Serial.print(" Lasttime: "); Serial.print(_lastreadtime);
*/
_lastreadtime = millis();

data[0] = data[1] = data[2] = data[3] = data[4] = 0;

// pull the pin high and wait 250 milliseconds
digitalWrite(_pin, HIGH);
delay(250);

// now pull it low for ~20 milliseconds
pinMode(_pin, OUTPUT);
digitalWrite(_pin, LOW);
delay(20);
noInterrupts();
digitalWrite(_pin, HIGH);
delayMicroseconds(40);
pinMode(_pin, INPUT);

// read in timings
for ( i=0; i< MAXTIMINGS; i++) {
counter = 0;
while (digitalRead(_pin) == laststate) {
counter++;
delayMicroseconds(1);
if (counter == 255) {
break;
}
}
laststate = digitalRead(_pin);

if (counter == 255) break;

// ignore first 3 transitions
if ((i >= 4) && (i%2 == 0)) {
// shove each bit into the storage bytes
data[j/8] <<= 1;
if (counter > _count)
data[j/8] |= 1;
j++;
}

}

interrupts();

/*
Serial.println(j, DEC);
Serial.print(data[0], HEX); Serial.print(", ");
Serial.print(data[1], HEX); Serial.print(", ");
Serial.print(data[2], HEX); Serial.print(", ");
Serial.print(data[3], HEX); Serial.print(", ");
Serial.print(data[4], HEX); Serial.print(" =? ");
Serial.println(data[0] + data[1] + data[2] + data[3], HEX);
*/

// check we read 40 bits and that the checksum matches
if ((j >= 40) &&
(data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) {
return true;
}


return false;

}
 
Последнее редактирование:
Сверху Снизу