Работа DHT22 при тактовой частоте 1 МГц
- Войдите на сайт для отправки комментариев
Ср, 10/12/2014 - 18:59
Как заставить работать датчик DHT22 (DHT11) при тактовой частоте 1 МГц?
Я использую стандартную библиотеку DHT.h Вот скетч
#include <LiquidCrystal.h> #include "DHT.h" #define DHTPIN 2 // pin D2 (TQFP-32) #define DHTTYPE DHT22 // DHT 22 (AM2302) byte degreeChar[8] = { B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000, }; DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd(5,6,7,8,9,10); //LCD-rs,e,d4,d5,d6,d7 (TQFP-9,10,11,12,13,14) unsigned int bat = 0; // ADC value byte volt = 0; // battery % void setup() { lcd.begin(8, 2); analogReference(INTERNAL); pinMode(0, OUTPUT); digitalWrite(0, HIGH); // power on pinMode(13, OUTPUT); digitalWrite(13, HIGH); // LED on dht.begin(); // start sensor lcd.setCursor(0,0); lcd.print("Battery"); for(byte i=0; i<=10; i++) { bat=analogRead(1); // battery sensor pin A0 if (bat<=800) { bat = 800; } if (bat>=900) { bat = 900; } volt = bat-800; lcd.setCursor(0,1); lcd.print(volt); lcd.print("%"); delay(200); } ADCSRA = 0; // Disable ADC } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { lcd.clear(); lcd.setCursor(0,0); lcd.print("SENSOR"); lcd.setCursor(0,1); lcd.print("ERROR"); } else { lcd.clear(); lcd.setCursor(0,0); lcd.print("T"); lcd.print(t); lcd.createChar(0, degreeChar); lcd.setCursor(6,0); lcd.write(byte(0)); lcd.print("C"); lcd.setCursor(0,1); lcd.print("H"); lcd.print(h); lcd.print(" %"); } delay(2000); if (millis()>=8000) { digitalWrite(13, LOW); } // led off if (millis()>=16000) { digitalWrite(0, LOW); } // power off }
При замене кварца (ниже 10 МГц) датчик не считывается. Вероятно надо чтото поменять в библиотеке но я не знаю что! Так как я схемотехник, а не программист. Момогите, пожалуйста, кто разбирается в этом!
Кстати! Та же история и с DS18B20. С библиотеками OneWire.h и DallasTemperature.h не работает от внутренего генератора 8МГц.
у вас ардуина на какую частоту настроена?
дело в том, что всякие функции програмной задержки типа delay работают гоняя пустные циклы, количество циклов на одну мсек зависит от частоты МК и определяется при компиляции. Если компилятор настроен неверно, то и константы выйдут не верно и значит и протоколы тип 1-wire (а DHT использует похожий протокол) не смогут работать
в детали не погружался, но если используете бутлоадер откомпилированный на 1мгц и в boards.txt у вас прописан 1МГц то все должно работать
Кстати! Та же история и с DS18B20. С библиотеками OneWire.h и DallasTemperature.h не работает от внутренего генератора 8МГц.
У меня OneWire c DS18B20 на Atmega8 c внутренним генератором 8МГц работает вот прямо сейчас на столе. "Что я делаю не так" (с) :)
Поделитесь кодом
Вот мой
Поделитесь кодом
Пример OneWire "DS18x20_Temperature" прекрасно работает.
Да! Работает!
И вот этот код тоже
Но на 4, 2 и 1 МГц не хочет. А вот DHT11(22) и на 8 МГц отказывается!
Удалось ли решить проблему пониженной частоты?
У меня ds18b20 работает только на 8 МГц, ниже не хочет.
Boards.txt правлю, диоды мигают с нужными интервалами, передатчик на virtualware работает. Может в библиотеке Onewire что поправить можно?
sasha_ml, ну очевидно что дуина не может при тактовой 1МГц соблюдать нужные тайминги. Можно попробовать все вызовы delayMicroseconds() в библиотеке поменять на _delay_us(), либо найти не дуиновскую библиотеку.