Датчик DHT

isaev0302
Offline
Зарегистрирован: 28.06.2016

Пытаюсь использовать ардуино как платформу с библиотеками. Вроде все класс, но возникла проблема с датчиками температура-влажность DHT11 и 22 - система их не видит... Просто на ардуино - прекрассно, в схеме на чистом контроллере - фиг. Даже на основе примера в библиотеке... В чем могут быть проблемы??? Гоню на временные параметры (ардуинка - 16МГц, схема - на внутреннем (8 без делителя)). Попытался залезть в библиотеку, подшаманить. Но все без результата.  Гуру, помогите...

п.с. Текст ставить смысла не вижу... В конечном случае он свернулся до базового.... толеко с др пином...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что за библиотека? Что за скетч? Что там шаманил? ХЗ!

Ответ писать "смысла не вижу... В конечном случае он свернулся до базового.... " - если не работает, значит что-то неправильно сделано.

isaev0302
Offline
Зарегистрирован: 28.06.2016

Библиотека DHT. А именно файлы DHT.h и DHT.cpp. Временные интервалы сформировыны в  DHT.cpp, в п/п "boolean DHT::read(void)". Значения там уменьшил в 2 раза (по соотношению с частотой). Но это не повлияло на работоспособность - на УНО система работала с новыми значениями только быстрее....

isaev0302
Offline
Зарегистрирован: 28.06.2016
#include <DHT.h>
#include <LiquidCrystal.h> 

#define DHTTYPE DHT22
#define an_light1 A1
//#define DHTPIN 10
#define DHTPIN 6
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(7, 5, 4, 3, 0, 1);

byte SensLevel;
long h_Dht11, Sens, t_Dht11, t_18b20;

void setup(){  
  dht.begin();
  lcd.begin(16, 2);
  lcd.clear();
  delay(100);
}

void loop(){
    Sens = analogRead(an_light1);
    Sens = constrain(Sens, 10, 1000);
    SensLevel = map (Sens,1000, 10, 0, 100);
    h_Dht11 = dht.readHumidity();// считыаем значения c DHT11
    t_Dht11 = dht.readTemperature();

 //***************
  
//вывод на экран
  lcd.setCursor(0, 1);
  lcd.print(t_Dht11);
  lcd.print("C");
 lcd.setCursor(7, 1);
 lcd.print(h_Dht11);
  lcd.print("%");
 lcd.setCursor(13, 1); 
 lcd.print(SensLevel); 
 lcd.print("%"); 
 delay(500); 
}

 

Это так, код - эксперимент... Может действительно накосячил...

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

Что то здесь не так. При любом генераторе и верных фузах, delay(1000) будет равен секунде (в пределах погрешности генератора) и ничему иному. У меня по крайней мере так, хоть на отладочной УНЕ, хоть на МК в девайсе на внутреннем генераторе, программа никак не модифицируется. Если ушли тайминги, ищите где накуролесили.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

bwn, нет.  Не так. 

isaev0302
Offline
Зарегистрирован: 28.06.2016

bwn пишет:

Что то здесь не так. При любом генераторе и верных фузах, delay(1000) будет равен секунде (в пределах погрешности генератора) и ничему иному. У меня по крайней мере так, хоть на отладочной УНЕ, хоть на МК в девайсе на внутреннем генераторе, программа никак не модифицируется. Если ушли тайминги, ищите где накуролесили.

Не правда ваша... Это уже отловлено и не раз.... 

Правда 1-ware, например, на штатных библеотеках работает в схемах без проблем. А там жесткая временная привязка...

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

DetSimen пишет:

bwn, нет.  Не так. 

Растолмачь, плиз.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

delay(1000) зависит не от фьюзов и внутреннего/внешнего кварца, а исключительно от константы F_CPU

если она правильная - delay() работает правильно, если нет - вреть ровно в стокараз, в скока частота установленная фьюзами отличается от F_CPU

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

DetSimen пишет:

delay(1000) зависит не от фьюзов и внутреннего/внешнего кварца, а исключительно от константы F_CPU

если она правильная - delay() работает правильно, если нет - вреть ровно в стокараз, в скока частота установленная фьюзами отличается от F_CPU

Упс, осознал. В камни лил с загрузчиками, а в платах верно все выставлено.

isaev0302
Offline
Зарегистрирован: 28.06.2016

А вот это анегдот, да и только...

Использовал библиотеку от Adafruit записал программочку

#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

#include <LiquidCrystal.h> 

#define DHTTYPE DHT22
#define an_light1 A1
#define DHTPIN 10

DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;

LiquidCrystal lcd(7, 5, 4, 3, 0, 1);

byte SensLevel;
long h_Dht11, Sens, t_Dht11, t_18b20;

void setup(){  
  dht.begin();

  lcd.begin(16, 2);
  lcd.clear();
//  delayMS = sensor.min_delay / 1000;
//  delay(500);
}

void loop(){

  sensor_t sensor;
  dht.temperature().getSensor(&sensor);  
  dht.humidity().getSensor(&sensor);  
  delayMS = sensor.min_delay / 1000;
lcd.setCursor(0, 0);
   lcd.print("Temperature");
lcd.setCursor(0, 1);   
delay(500);
  lcd.print  ("Sensor:  "); lcd.print(sensor.name);
  lcd.setCursor(0, 1);   
delay(500);
  lcd.print  ("Driver Ver:"); lcd.print(sensor.version);
  lcd.setCursor(0, 1);   
delay(500);
  lcd.print  ("Unique ID: "); lcd.print(sensor.sensor_id);
  lcd.setCursor(0, 1);   
delay(500);
  lcd.print  ("Max Value: "); lcd.print(sensor.max_value); lcd.print(" *C");
  lcd.setCursor(0, 1);   
delay(500);
  lcd.print  ("Min Value: "); lcd.print(sensor.min_value); lcd.print(" *C");
  lcd.setCursor(0, 1);   
delay(500);
  lcd.print  ("Resolution: "); lcd.print(sensor.resolution); lcd.print(" *C");
delay(500);
delay(delayMS);  
 sensors_event_t event;  
 dht.temperature().getEvent(&event);
 t_Dht11 = event.temperature;
  lcd.print  (t_Dht11);
delay(1000);   
}

ИИИИИИ....

Внутренние данные считывает а температуру не измеряет!!!!!!!

Что за хрень... Гуру, помогите...

Goodawel
Offline
Зарегистрирован: 05.11.2017

Здравствуйте добрые люди! Помогите нубу. Делаю блок управления на котёл. Имеется Arduino Uno, датчик DS18B20, датчик DHT22, двухканальное реле. Не получается прописать в строке 172 что бы команда работала от показателей датчика DHT22.

#include <DHT.h>

#include <EEPROM.h>
#include <OneWire.h>
#include <LiquidCrystal.h>

#define OUT1 2 // выходы для реле 
#define OUT2 3

#define DHTPIN 12     // what digital pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)


DHT dht(DHTPIN, DHTTYPE);

byte tempOUT1, tempOUT2;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
OneWire  ds(11); // 11 вход датчика 18b20

byte gradus[8] = {
  0b00110,
  0b01001,
  0b01001,
  0b00110,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};


void erorr(){ // останавливает работу программы и сигнализирует ошибку
  digitalWrite(OUT1, LOW); // выключаем реле
  digitalWrite(OUT2, LOW);
    while(1){ // крутим бесконечный цикл
      digitalWrite(13, !digitalRead(13));
      delay(500);
    }  
}
////

byte key(){ //// для кнопок ЛСДшилда
  int val = analogRead(0);
    if (val < 50) return 5;
    else if (val < 150) return 3;
    else if (val < 350) return 4;
    else if (val < 500) return 2;
    else if (val < 800) return 1;
    else return 0;  
}
////

void setMenu(){ // установка температуры 
  byte pos;    
  //digitalWrite(OUT1, LOW); // выключаем реле
  //digitalWrite(OUT2, LOW);

  lcd.clear(); 
  lcd.setCursor(0, 0); // что нужно отрисовать один раз
  lcd.print("G: ");
  lcd.setCursor(0, 1);
  lcd.print("K: ");
  lcd.blink();
  
  while(1){ // крутим бесконечный цикл      
    byte KEY = key(); // читаем состояние кнопок
    
    lcd.setCursor(6, 0); // выводим на экран
    lcd.print(tempOUT1);
    lcd.write(1);
    lcd.print("C  ");
    lcd.setCursor(6, 1);
    lcd.print(tempOUT2);    
    lcd.write(1);
    lcd.print("C  ");
    
     ////// обработка кнопок 
    if (pos == 0){  // если в первой позиции
      lcd.setCursor(5, 0); // устанавливаем курсор
      if (KEY == 2) { // если нажата кнопка
        tempOUT1--;   // изменяем значение
        EEPROM.write(1, tempOUT1); // сохраняем в еепром
      }
      else if (KEY == 5){
        tempOUT1++;
        EEPROM.write(1, tempOUT1);     
      }    
    }
    if (pos == 1){ 
      lcd.setCursor(5, 1);
      if (KEY == 2) {
        tempOUT2--;
        EEPROM.write(2, tempOUT2);
      }
      else if (KEY == 5){
        tempOUT2++;
        EEPROM.write(2, tempOUT2);     
      }    
    }
    
    if (KEY == 3) pos--; // крутим позицию
    else if (KEY == 4) pos++;    
    if (pos > 1) pos = 0; 
 
   delay(200);
  }
}

float getTemp(){   // возвращает температуру с датчика
  byte data[12];   // и останавливает программу на секунду
  byte addr[8];  
  
  if (!ds.search(addr)) {
    lcd.clear();
    lcd.print("No sensor."); 
    erorr(); 
  }
  
  ds.reset_search(); 
 
  if (OneWire::crc8(addr, 7) != addr[7]) {
    lcd.clear();
    lcd.print("Sensor CRC erorr");
    erorr();   
  }
  
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(1000);   
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          

  for (int i = 0; i < 9; i++) data[i] = ds.read(); 
  int raw = (data[1] << 8) | data[0]; // Переводим в температуру   
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6]; 

  
  return raw / 16.0;
}

unsigned long timing;

void setup() {
  Serial.begin(9600); 
  lcd.createChar(1, gradus);
  lcd.begin(16, 2);
  lcd.clear();
  dht.begin();
  
  pinMode(13, OUTPUT); 
  pinMode(OUT1, OUTPUT);
  pinMode(OUT2, OUTPUT);
  
  tempOUT1 = EEPROM.read(1); // читаем настройки 
  tempOUT2 = EEPROM.read(2); // из еепром
}

void loop() {  
  if (key() == 1) setMenu(); // если нажата селект, уходим в меню
  else if (key() == 4) analogWrite(10, 20); // если вниз, глушим подсветку
  else if (key() == 3) digitalWrite(10, HIGH);
  
  float temperature = getTemp(); // читаем температуру
  float tdht = getTemp();
 
  if(tdht <= tempOUT1){
    if (!digitalRead(OUT1)){
      digitalWrite(OUT1, HIGH);
      timing = millis();
    } 
    if (!digitalRead(OUT2) && millis() - timing > 10000){
      digitalWrite(OUT2, HIGH);
    }
  }
  if(temperature >= tempOUT2 ){
    if (digitalRead(OUT1)){
      digitalWrite(OUT1, LOW);
      timing = millis();
    } 
    if (digitalRead(OUT2) && millis() - timing > 10000){
      digitalWrite(OUT2, LOW);
    }
  }

   float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);

  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
      
  lcd.setCursor(0, 0); /// вывод инфы на экран
  lcd.print("G");
  lcd.print("-");
  lcd.print(t);
  lcd.write(1);
  lcd.print("C");
  lcd.setCursor(10, 0);
  lcd.print(h);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("K");
  lcd.print("-");
  lcd.print(temperature);
  lcd.write(1);
  lcd.print("C");
  }

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Goodawel пишет:

Помогите нубу.

Помогаю

Goodawel пишет:

Делаю блок управления на котёл.

Лучшая помощь нубу - совет "держись от котла подальше".

Если нуб берётся за котёл, то закончится это как в Ижевске.

Goodawel
Offline
Зарегистрирован: 05.11.2017

Ворота пишет:

Goodawel пишет:

Помогите нубу.

Помогаю

Goodawel пишет:

Делаю блок управления на котёл.

Лучшая помощь нубу - совет "держись от котла подальше".

Если нуб берётся за котёл, то закончится это как в Ижевске.

Хватит болтологии лучше делом помоги.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Это и есть дело. Ты это поймёшь, когда твой обгорелый труп из-под завалов вытащат. Если ты самоубийца, то хрен с тобой, только без меня. Я в этом не участвую. Сам убивайся.

P.S. Котёл в отдельном доме? А то если в квартире, соседей бы хоть пожалел.

Goodawel
Offline
Зарегистрирован: 05.11.2017

Вопрос болше не актуален.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Goodawel пишет:

Вопрос болше не актуален.

Ростов - твоя работа?

Goodawel
Offline
Зарегистрирован: 05.11.2017

Клапауций 112 пишет:

Goodawel пишет:

Вопрос болше не актуален.

Ростов - твоя работа?

?

isaev0302
Offline
Зарегистрирован: 28.06.2016

Короче, спецы. Я в ауте полном...

Собрал макетку на винборде на проце...

Залил в него прогу, представленную выше. Так вот. Информация о САМОМ датчике - считывается.. А значения температуры и влажности - нет... Датчик исправен - на ардуинке с залитым скетчем все работает....

Вопрос - в чем проблема?? Не ужели ни кто с таким не сталкивался... Очень нужна помощь...

isaev0302
Offline
Зарегистрирован: 28.06.2016

Попытался опрашивать датчик без библиотеки взяв за основву прогу из параллельной темы "DHT без тормозов - вопросы по скетчу" и НИ ЧЕГО....

b707
Offline
Зарегистрирован: 26.05.2017

isaev0302 пишет:

Собрал макетку на винборде на проце...

питание на проц с обоих сторон подано? и аналоговое и цифровое? и тоже для земли...

isaev0302
Offline
Зарегистрирован: 28.06.2016

Да. На схеме видно... Правда опорное проигнорировал - хотя аналоговая часть здесь не используется... 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Надеюсь про подтяжку не забыли и БЛИНК мигает с правильным интервалом.

Тогда такая мысль. Функция digitalRead() при 16 МГц выполняется примерно 5 мксек, а при 8 МГц, как у Вас, будет 10 мксек. Соответственно задержки будут совсем другие... Попробуйте читать состояние пина напрямую через регистры.

isaev0302
Offline
Зарегистрирован: 28.06.2016

Pyotr пишет:

Надеюсь про подтяжку не забыли и БЛИНК мигает с правильным интервалом.

Тогда такая мысль. Функция digitalRead() при 16 МГц выполняется примерно 5 мксек, а при 8 МГц, как у Вас, будет 10 мксек. Соответственно задержки будут совсем другие... Попробуйте читать состояние пина напрямую через регистры.

Пост 19 - пробовал... Это прога

#include <LiquidCrystal.h> 
uint8_t data[5];
const byte DHT1_pin = 6;
//const byte DHT2_pin = 24;
const unsigned int interval = 1000;
#define DHTPIN DHT1_pin
#define an_light1 A1
LiquidCrystal lcd(7, 5, 3, 2, 1, 0);
byte SensLevel;

void setup(){
  lcd.begin(16, 2);
  lcd.clear();
}

void loop(){
  int hum1  = 0, temp1 = 0;
  static unsigned long prevMillis = 0;
  if(millis() - prevMillis > interval){
    prevMillis += 1000;
    if(readingDHT(DHT1_pin)){         //если контрольная сумма верна
      hum1 = (data[0] << 8) | data[1];//считаем Н и Т первого датчика
      temp1 = ((data[2] & 0x7F) << 8) | data[3];
      if(data[2] & 0x80)  temp1 *= -1;
    }else{
      //ошибка DHT1
    }
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temperature: ");
    lcd.print(temp1 /10);
    lcd.print('.'); lcd.print(temp1 %10);    
    lcd.setCursor(0, 1);
    lcd.print("Humidity: ");    
    lcd.print(hum1 /10);
    lcd.print('.'); lcd.print(hum1 %10);
  }
}
//===============================================
boolean readingDHT(byte pin) {
  boolean state = HIGH;   //состояние линии
  byte counter = 0, j = 0;
  const byte count = 5;
  for(byte i=0; i<5; i++){
    data[i] = 0;
  }
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);
  delay(1);           //более 800mks нужно чтобы рабудить датчик DHT21-22
  //delay(18);        //для DHT11
  cli();                    //отключить прерывания если нужно
  pinMode(pin, INPUT);     //начинаем слушать датчик
  for(byte i = 0; i < 83; i++){//читаем 83 сост линии
    counter = 0;
    while (digitalRead(pin) == state) {//state==1 первый проход
      counter++;
      delayMicroseconds(4);//if 4 mkc count==3-7 //где-то здесь определяется задержка

      if (counter > 20)  break; //и здесь определяется задержка

    }//end while
    state = !state;//digitalRead(_pin);
    if (counter > 20) break;   //и здесь определяется задержка

    if ((i > 3) && !(i & 1)) {//i%2 записать каждый бит в байты хранения
      data[j >> 3] <<= 1;  //читаем с 5(i=4) состояния(1,0,1,0,?,0,?,0,...?)
      if (counter > count)  data[j>>3] |= 1;//counter>3-10 дальше ошибки
      j++;
    }
  }//end for
  sei();            //включить прерывания 
  uint8_t sum = data[0] + data[1] + data[2] + data[3];
  if(sum == data[4]) return 1;
  else               return 0;
}

Играть, я так понимаю нужно с выделенными строчками проги

 

Что касается задержек в скетчах - то в скетче на плату уно  (точнее в библиотеке DHT.cpp) подправлял тайминги  - и все, хоть и с большими интервалами, работало.  Но я всеж думаю, что проблема где-то именно там...

sadman41
Offline
Зарегистрирован: 19.10.2016

isaev0302 пишет:

Залил в него прогу, представленную выше. Так вот. Информация о САМОМ датчике - считывается.. А значения температуры и влажности - нет... 

Что такое "информация о датчике" и откуда она считывается?

isaev0302
Offline
Зарегистрирован: 28.06.2016

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Вы меня так поразили, что я даже в datasheet залез: "DATA=8 bit integral RH data+8 bit decimal RH data+8 bit integral T data+8 bit decimal T data+8 bit check-sum" - вот, всё, что может сказать о себе датчик.

Pyotr
Offline
Зарегистрирован: 12.03.2014

sadman41 пишет:

isaev0302 пишет:

Залил в него прогу, представленную выше. Так вот. Информация о САМОМ датчике - считывается.. А значения температуры и влажности - нет... 

Что такое "информация о датчике" и откуда она считывается?

Тоже хотел спросить, да забыл. Конечно, нет такой инфы..

 

isaev0302
Offline
Зарегистрирован: 28.06.2016

Ясссно. Тогда полез в библиотеку от ада... Судя по всему там просто все прописано - я честно сказать не туда лазил. Думал, что работа с ардуинкой и библиотеками упростят мне жизнь... И тут облом. Возвращаюсь к ассемблеру...

Pyotr
Offline
Зарегистрирован: 12.03.2014
boolean readingDHT(byte pin) {
  boolean state = HIGH;   //состояние линии
  byte counter = 0, j = 0;
  const byte count = 5;
  for(byte i=0; i<5; i++){
    data[i] = 0;
  }
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);
  delay(1);           //более 800mks нужно чтобы рабудить датчик DHT21-22
  //delay(18);        //для DHT11 
  //cli();                    //отключить прерывания если нужно
  pinMode(pin, INPUT);     //начинаем слушать датчик
  for(byte i = 0; i < 83; i++){//читаем 83 сост линии
    counter = 0;
    while (digitalRead(pin) == state) {//state==1 первый проход
      counter++;
      delayMicroseconds(4);//if 4 mkc count==3-7
      if (counter > 20)  break;
    }//end while
    state = !state;//digitalRead(_pin);
    if (counter > 20) break;    
    if ((i > 3) && !(i & 1)) {//i%2 записать каждый бит в байты хранения
      data[j >> 3] <<= 1;  //читаем с 5(i=4) состояния(1,0,1,0,?,0,?,0,...?)
      if (counter > count)  data[j>>3] |= 1;//counter>3-10 дальше ошибки
      j++;
    }
  }//end for
  //sei();            //включить прерывания  
  uint8_t sum = data[0] + data[1] + data[2] + data[3];
  if(sum == data[4]) return 1;
  else               return 0;
}

Попробуйте закоментировать строку 18 и отключите проверку контрольной суммы - вместо строк 30-32 поставьте return 1;. Будут ли какие-то данные-мусор. 

sadman41
Offline
Зарегистрирован: 19.10.2016

isaev0302 пишет:

Ясссно. Тогда полез в библиотеку от ада... Судя по всему там просто все прописано - я честно сказать не туда лазил. Думал, что работа с ардуинкой и библиотеками упростят мне жизнь... И тут облом. Возвращаюсь к ассемблеру...

Думаете, что DHT22 асма боится? Вот эту погоняйте, она может показать на какой стадии обмена облом происходит: https://github.com/RobTillaart/Arduino/tree/master/libraries/DHTlib

Впрочем, я на вашей фотографии не вижу ни датчика, ни резистора к нему, что заставляет меня думать, что проблема таки в контакте.

isaev0302
Offline
Зарегистрирован: 28.06.2016

Датчик на проводах (3 ввер уходят, не вошли в фотку), резистор 10к подпаян прям на датчике (smd 0805)...

sadman41
Offline
Зарегистрирован: 19.10.2016

isaev0302 пишет:

Датчик на проводах (3 ввер уходят, не вошли в фотку), резистор 10к подпаян прям на датчике (smd 0805)...

10k не ставил, 4.7k ставил около самого МК - работает на 10м. кабеле. Впрочем, поначалу даже никакой ставил - тоже работало иногда. Даташит говорит так:

-------

Special instructions of the single-bus communication:

1.Typical application circuit recommended in the short cable length of 30 meters on the 5.1K pull-up resistor pullup resistor according to the actual situation of lower than 30 m.

2.With 3.3V supply voltage, cable length shall not be greater than 100cm. Otherwise, the line voltage drop will lead to the sensor power supply, resulting in measurement error.

3.Read the sensor minimum time interval for the 2S; read interval is less than 2S, may cause the temperature and humidity are not allowed or communication is unsuccessful, etc..

...

-------

Вобщем, надо выяснить на котором этапе обмен прекращается (и начинается ли он вообще). Я сталкивался с таким случаем: запитал датчик от 3,3V, а до него доходило... Мало, вобщем. И он всякую чушь гнал в линию. Еще один подводный камень - до того, как перед обменом уронить DQ в LOW, нужно его подержать в HIGH определенное время. Мой DHT гарантированно отвечает, если это время >= времени опроса. Иначе бывали разные эффекты, но чаще всего обмен просто не начинался. Ну, а после завершения обмена, я оставляю DQ в состоянии HIGH, чтобы на следующем раунде не терять времени даром.

 
isaev0302
Offline
Зарегистрирован: 28.06.2016

to Pyotr

Изменений нет...