Работа 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МГц работает вот прямо сейчас на столе. "Что я делаю не так" (с) :)
Поделитесь кодом
Вот мой
#include <LiquidCrystal.h> LiquidCrystal lcd(14,15,16,17,18,19); #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 0 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); void setup(void) { sensors.begin(); lcd.begin(16, 2); } void loop(void) { sensors.requestTemperatures(); lcd.setCursor(0,0); lcd.print(sensors.getTempCByIndex(0)); }Поделитесь кодом
Пример OneWire "DS18x20_Temperature" прекрасно работает.
Да! Работает!
И вот этот код тоже
#include <OneWire.h> OneWire ds(15); #include <LiquidCrystal.h> LiquidCrystal lcd(5,4,3,2,1,0); int Read = 0; byte tdata[2]; void setup() { lcd.begin(16, 2); } void loop() { ds.reset(); ds.write(0xCC); ds.write(0x44); delay(750); ds.reset(); ds.write(0xCC); ds.write(0xBE); tdata[0] = ds.read(); tdata[1] = ds.read(); Read = (tdata[1]<< 8)+tdata[0]; Read = Read>>4; lcd.setCursor(0,0); lcd.print(Read); }Но на 4, 2 и 1 МГц не хочет. А вот DHT11(22) и на 8 МГц отказывается!
Удалось ли решить проблему пониженной частоты?
У меня ds18b20 работает только на 8 МГц, ниже не хочет.
Boards.txt правлю, диоды мигают с нужными интервалами, передатчик на virtualware работает. Может в библиотеке Onewire что поправить можно?
sasha_ml, ну очевидно что дуина не может при тактовой 1МГц соблюдать нужные тайминги. Можно попробовать все вызовы delayMicroseconds() в библиотеке поменять на _delay_us(), либо найти не дуиновскую библиотеку.