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

DHT22 + MAX7126

Inker

New member
Доброго времени суток!
Только изучаю ESP8266, а уже есть странная проблема.

В общем, при подключении, по i2c, светодиодной матрицы на MAX7126, сразу после прошивки скетча, DHT22 работает штатно. И матрица штатно выводит бегущую строку с показаниями датчика. Но если сделать ресет кнопкой, датчик DHT22 перестает работать... Если при этом, по горячему, переподключить питание датчика(выдернуть и вставить gnd или +5), он снова начинает выводить корректные значения.
При этом, подключал в схему DHT11, он на ресет реагирует штатно.
При этом, если из скетча выпилить матрицу в принципе, то и DHT22 начинает отрабатывать ресет штатно.

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

Подскажите, пожалуйста, в какую схему копать?

ПС на Ардуино УНО, тот же код отрабатывает без багов..
 

Inker

New member
Спасибо за ответ, не знаю что за каша у меня вчера была в голове, но матрица конечно же подключена по SPI а не i2c.
Драйвера, на всякий случай я обновил. Но ядро у меня: 2.6.3 не знаю критично ли это?

Прикладываю скетч, для более предметного разговора.
Ошибки все те же. DTH22 работает, только если ему переподключить питание, "по горячему"
матрица не инициализируется после сброса внешнего питания.

Код:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <iarduino_DHT.h>


iarduino_DHT sensor11(4); //dth11
iarduino_DHT sensor22(5); //dth22


#define pinCS 16 // подключаем CS матрицы к этому пуну, подключаем DIN к MOSI и CLK к SCK. для UNO, MOSI это 11 пин, а SCK это 13 пин.
int numberOfHorizontalDisplays = 1;
int numberOfVerticalDisplays = 4;

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);


int spacer = 1; // Промежуток между символами (кол-во точек)
int width = 5 + spacer; // ширина шрифта 5 пикселей


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

  matrix.setIntensity(7); //Используйте значение от 0 до 15 для яркости
  matrix.setRotation(matrix.getRotation() + 3); //1 - 90  2 - 180   3 - 270 поворот матрицы ( сейчас стоит, что разъем справа)


}

void loop() {
  switch (sensor11.read()) {  // читаем показания датчика
    case DHT_OK:               Serial.println((String) "CEHCOP DHT11 B KOMHATE: " + sensor11.hum + "% - " + sensor11.tem + "*C");  break;
    case DHT_ERROR_CHECKSUM:   Serial.println(         "CEHCOP DHT11 B KOMHATE: HE PABEHCTBO KC");                     break;
    case DHT_ERROR_DATA:       Serial.println(         "CEHCOP DHT11 B KOMHATE: OTBET HE COOTBETCTB. CEHCOPAM 'DHT'"); break;
    case DHT_ERROR_NO_REPLY:   Serial.println(         "CEHCOP DHT11 B KOMHATE: HET OTBETA");                          break;
    default:                   Serial.println(         "CEHCOP DHT11 B KOMHATE: ERROR");                               break;
  }
  switch (sensor22.read()) {  // читаем показания датчика
    case DHT_OK:               Serial.println((String) "CEHCOP DHT22 B KOMHATE: " + sensor22.hum + "% - " + sensor22.tem + "*C");  break;
    case DHT_ERROR_CHECKSUM:   Serial.println(         "CEHCOP DHT22 B KOMHATE: HE PABEHCTBO KC");                     break;
    case DHT_ERROR_DATA:       Serial.println(         "CEHCOP DHT22 B KOMHATE: OTBET HE COOTBETCTB. CEHCOPAM 'DHT'"); break;
    case DHT_ERROR_NO_REPLY:   Serial.println(         "CEHCOP DHT22 B KOMHATE: HET OTBETA");                          break;
    default:                   Serial.println(         "CEHCOP DHT22 B KOMHATE: ERROR");                               break;
  }

  String temp11 = String(sensor11.tem, 1); //принимаем в строку температуру с датчика, с одним символом после запятой

  String temp22 = String(sensor22.tem, 1); //принимаем в строку температуру с датчика, с одним символом после запятой
  staticText(temp11);
  delay(2000);
  staticText(temp22);
  delay(2000);
}

void staticText (String tape) {

  int x = (matrix.width() + 2 - (tape.length() * width)) / 2; //выравнивание по центру X
  //int y = (matrix.height() - 8) / 2; //выравнивание по центру Y для многострочной матрицы
  int y = 0; //Для однострочной матрицы y=0;
  matrix.fillScreen(LOW);

  for ( int i = 0 ; i < tape.length(); i++ ) {
    matrix.drawChar(x, y, tape[i], HIGH, LOW, 1);
    x += width;
  }
  matrix.write(); // отправка данных на дисплей
}
 

enjoynering

Well-known member
gpio16 лучше не трогать.

перечисляю в порядке предпочтения:
проще всего работать с GPIO5 и GPIO4(D1,D2)
далее GPIO2(D4) если нет вывода на UART1
затем GPIO14,GPIO12,GPIO13,GPIO15 (D5,D6,D7,D8) если не используете HSPI
остальное пока лучше не трогать.
 

Inker

New member
вот вам шпаргалка. зеленый ОК - можно использовать

Посмотреть вложение 8740
Ох спасибо) нужная табличка! Я то просто распиновку себе распечатал, но там в явном виде по i/o не расписано так удобно.
Эта табличка к esp32 применима(на будущее)?

Пока я подключил и настроил 1307 на 5 и 4. Работает. Завтра освобожу 16 пин и отпишись по результатам.
 

enjoynering

Well-known member
для ESP32 своя

Best pins to use on ESP32.PNG


также гляньте чем отличается Serial.println("HELLO WORLD") от Serial.println(F("HELLO WORLD") )
 

Inker

New member
для ESP32 своя

Посмотреть вложение 8741


также гляньте чем отличается Serial.println("HELLO WORLD") от Serial.println(F("HELLO WORLD") )
Спасибо! Есп35 прям вкуснее по возможностям i/o ) но пока 4 штуки 8266 не "освою", обожду с закупками)

По части макроса F(), прочитал, для принта, строк, которые не меняются, идеально, что бы экономить память, особенно на есп. Правда не совсем пока понял как заставить в флеше хранить все объявленные стринги =) завтра с девайсом под рукой разберусь.

Кстати , после замены wire.h на исправленный, словил ошибку отсутствия функции memem, (используется в скетче iarduino_RTC, для автоматической установки времени компиляции в 1307) мелочь конечно, и в ручную не сложно прописать, но почему, интересно, ее там нет...
 

Inker

New member
Сделал все согласно рекомендациям.

обе проблемы остались. Датчик не инициализируется, матрица, после потери питания, до того как нажать Ресет, не работает.

Код:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <iarduino_DHT.h>   // подключаем библиотеку для работы с датчиком DHT
#include <iarduino_RTC.h>

#define pinCS 12 // подключаем CS матрицы к этому пину, подключаем DIN к MOSI и CLK к SCK. для UNO, MOSI это 11 пин, а SCK это 13 пин.
#define pinDHT 2 // подключаем DTH22
#define numberOfHorizontalDisplays 1
#define numberOfVerticalDisplays   4


iarduino_RTC watch(RTC_DS1307); //инициализируем объект watch, для работы с 1307, SDA - D2(GPIO4), SCL - D1(GPIO5)  
iarduino_DHT sensor(pinDHT); //инициализируем сенсор DHT22



Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

int wait = 50; // скорость прокрутки бегущей строки (задержка), чем меньше значениее - тем быстрее.
int spacer = 1; // Промежуток между символами (кол-во точек)
int width = 5 + spacer; // ширина шрифта 5 пикселей
int rotate = 3; //1 - 90  2 - 180   3 - 270 поворот матрицы ( сейчас стоит, что разъем справа)


void setup() {
  Serial.begin(9600);
  watch.begin(); //запускаем ходики 1307
  matrix.setIntensity(7); //Используйте значение от 0 до 15 для яркости
  matrix.setRotation(matrix.getRotation() + rotate);

}
void loop() {


  switch (sensor.read()) {  // читаем показания датчика
    case DHT_OK:               Serial.println((String) F("CEHCOP DHT22 B KOMHATE: ") + sensor.hum + "% - " + sensor.tem + "*C");    break;
    case DHT_ERROR_CHECKSUM:   Serial.println(         F("CEHCOP DHT22 B KOMHATE: HE PABEHCTBO KC"));                     break;
    case DHT_ERROR_DATA:       Serial.println(         F("CEHCOP DHT22 B KOMHATE: OTBET HE COOTBETCTB. CEHCOPAM 'DHT'")); break;
    case DHT_ERROR_NO_REPLY:   Serial.println(         F("CEHCOP DHT22 B KOMHATE: HET OTBETA"));                          break;
    default:                   Serial.println(         F("CEHCOP DHT22 B KOMHATE: ERROR"));                               break;
  }

  delay(2000);
  String temp = String(sensor.tem, 1); //принимаем в строку температуру с датчика, с одним символом после запятой


  printtoMAX(utf8rus((String) F("Темп: ") + temp + F("С, Время: ") + watch.gettime("H:i"))); // выводим бегущей строкой
  //staticText(watch.gettime("H:i")); //выводим статичные часы
  //staticText(temp); //выводим статичную температуру
}


/* Recode russian fonts from UTF-8 to Windows-1251 */

String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB7;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}

//**********Статичное отображение************
void staticText (String tape) {

  int x = (matrix.width() + 2 - (tape.length() * width)) / 2; //выравнивание по центру X
  //int y = (matrix.height() - 8) / 2; //выравнивание по центру Y
  int y = 0; //Для однострочной матрицы y=0;
  matrix.fillScreen(LOW);

  for ( int i = 0 ; i < tape.length(); i++ ) {
    matrix.drawChar(x, y, tape[i], HIGH, LOW, 1);
    x += width;
  }
  matrix.write(); // отправка данных на дисплей
}

//****************** Бегущая строка ********************

void printtoMAX(String prSours)
{
for ( int i = 0 ; i < width * prSours.length() + matrix.width() - spacer; i++ )
  {
    matrix.fillScreen(LOW);

    int letter = i / width; // номер символа выводимого на матрицу

    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2; // центрировать текст по вертикали

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < prSours.length() ) {
        matrix.drawChar(x, y, prSours[letter], HIGH, LOW, 1);
      }
      letter--;
      x -= width;
    }
    matrix.write(); // Отправить растровое изображение для отображения
    delay(wait);
  }
  return;
}

Лог COM`a по датчику:

DHT com.JPG

Опять же за ранее спасибо, если пнете в правильную сторону =)
 

enjoynering

Well-known member
вы смотрели табличку? Вы смотрели pinout и схему вашей платы ESP8266?

Код:
#define pinCS 12
это MISO!!!!

Код:
#define pinDHT 2
это gpio2 корый всегда подтянут к + питания для правильной загрузки ESP8266. Изучите сначала вашу плату и разберитесь зачем нужны подтягивающие резисторы на gpio15, gpio0 и gpio2. потом задавайте вопросы.

gpio2.PNG
 

enjoynering

Well-known member
Так же разберитесь на каких ножках у ESP8266 находится SPI шина и зачем нужен контакт SS (он же CS).
 

Inker

New member
@enjoynering
Изучите сначала вашу плату и разберитесь зачем нужны подтягивающие резисторы на gpio15, gpio0 и gpio2. потом задавайте вопросы.
Так вроде форум для новичков, вопросы задаются, что бы понять с Чем разбираться =) Спасибо за "пинок" в правильную сторону работы с GPIO)
Оказывается esp совсем не ардуино, и нельзя просто взять и использовать GPIO, по своему усмотрению.

Если с gpio15, gpio0 и gpio2, более менее понгятно, в чем пробема с gpio12(?), ну да это MISO, но почему нельзя использовать этот пин по своему есмотрению, если MISO я не использую? Я к чему спрашиваю, не обнаружив в явном виде запрета использования gpio12, я на него подоткнул DHT22, и он заработал абсолютно штатно, и на ресеты не реагирует.

Матрица работает по CLK, MOSI, и Пока не понял на чем еще возможно GPIO15 , GPIO, которые можно использовать без раздумий кончились...

В общем, пока из того что я ввычитал, я сделал вывод, что на плате есть только 5 IO, с которыми можно работать относительно без раздумий: GPIO4, GPIO5, GPIO12, GPIO13, GPIO14.
в моем текущем скетче они все заняты.
GPIO4, GPIO5 - часы по i2c
GPIO12 - DHT22
PIO13, GPIO14 - MOSI и CLK для SPI матрицы
Ушел думать где Правильно взять CS для матрицы... (так то на любом работает, но не после потери питания.)
 

Inker

New member
БИНГО! как говорится, "Шурик ты балбес."
Я матрицу питал от 3.3v (что бы глаза себе не выжигать во время отладки) видимо 3.3v y не хватает для инициализации после потери питания.
подключил матрицу от 5v нормально стала отрабатывать на перезагрузку по питанию.
 
Сверху Снизу