ATtiny85 и DHT11 - Датчик всегда возвращает 0
Добрый день.
Я делаю небольшую метеостанцию, используя ATtiny85, DHT11 и OLED-дисплей.
Есть много-много руководств, которые объясняют, как это работает, и различные библиотеки, которые показывают вам, как заставить DHT11 работать с ATtiny85 и другими, которые посвящены Oled-дисплеям SSD1306, некоторые даже показывают вам, как объединить их вместе. Ну, большую часть 2-х дней у меня ничего не получалось.
Моя схема выглядит следующим образом:
А вот картинка самой вещи, работающей с монетной ячейкой CR2032:
Библиотеки, которые я использую:
- OLED-библиотеки для ATtiny85 - Source: http://www.14core.com/wiring-digispark-attiny85-with-096-oled-screen-display /
- Библиотека DHT Роба Тиллаарта - Источник: https://github.com/RobTillaart/Arduino/tree/master/libraries
Мой код выглядит следующим образом:
//OLED-библиотеки для ATtiny85 - Source: http://www.14core.com/wiring-digispark-attiny85-with-096-oled-screen-display/
#include <font6x8.h>
#include <font8x16.h>
#include <num2str.h>
#include <ssd1306xled.h>
#include <ssd1306xled8x16.h>
#include <SSD1306_minimal.h>
#include <TinyWireM.h>
#include <USI_TWI_Master.h>
#define DEG "\xa7" "C"
SSD1306_Mini oled;
char strHum[4];
char strTemp[4];
#include <dht.h>
dht DHT;
#define DHT11_PIN 1
void setup()
{
TinyWireM.begin(); // initialize I2C lib - прокомментируйте это для использования со стандартными ардуино
oled.init(0x3c);
oled.clear();
}
void loop()
{
// Код DHT идет сюда //
DHT.read11(DHT11_PIN); //Вызов функции read
float hu = (DHT.humidity, 1);
float te = (DHT.temperature, 1);
// OLED Start - НИЧЕГО НЕ МЕНЯТЬ //
//oled.clear();
oled.startScreen();
oled.cursorTo(10, 0);
oled.printString("ATTiny85 & DHT11");
oled.startScreen();
oled.cursorTo(12, 9);
oled.printString("Temp & Humidity");
oled.startScreen();
oled.cursorTo(10, 18);
oled.printString("www.MDChaara.com");
oled.startScreen();
oled.cursorTo(0, 27);
oled.printString("[email protected]");
oled.startScreen();
oled.cursorTo(0, 45);
oled.printString("Humidity(%): ");
oled.startScreen();
oled.cursorTo(110, 45);
oled.printString( itoa(int(hu), strHum, 10));
oled.startScreen();
oled.cursorTo(0, 55);
oled.printString("Temperature(c): ");
oled.startScreen();
oled.cursorTo(110, 55);
oled.printString( itoa(int(te), strTemp, 10));
// Конец OLED //
delay(5000);
}
Теперь я знаю, что OLED-код работает, и это был очень интересный раунд исследований, чтобы заставить его работать. Код DHT - это совсем другая история. Я перепробовал 6 разных библиотек, и ни одна из них не работала. Все они либо возвращают 0, 1, либо пустые показания на экране.
Я проверил, работает ли датчик с Uno и Nano, работает хорошо! Я проверил соединения, припаянные детали и провел тесты на непрерывность, но проблема все еще остается.
Я спрашиваю, потому что надеюсь, что свежий взгляд сможет точно определить проблему, с которой я столкнулся. Любая помощь будет высоко оценена.
- Arduino IDE: 1.8.2
- ОС: Windows 7 64 бит
- Микроконтроллер: ATtiny85-20PU
Скетч загружается на микроконтроллер с помощью Arduino Uno в качестве программатора. Скетч загружается при внутренней настройке тактовой частоты 8 МГц.
Спасибо.
@MDChaara, 👍3
Обсуждение3 ответа
Хорошо, я попробовал что-то подобное для себя, и благодаря этому и многим другим постам и форумам / видео я мог бы сделать себе что-то, что работает, но с немного другими настройками, как в стартовом посте (другие библиотеки и т. Д.)
в моем случае основной причиной вывода "1" на oled было следующее:
float hu = (DHT.humidity, 1); //оригинал
hu = (DHT.humidity); // что сработало для меня
Может быть, вы сможете выяснить больше проблем, мой код - shure, а не perfekt! Но, может быть, это поможет кому-то на несколько шагов
#include <dht.h>
#include <U8x8lib.h>
#define DHT11_PIN 1
dht DHT;
int temp = 0;
int humi = 0;
char strTemp[4];
char strHumi[4];
U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ 2, /* data=*/ 0, /* reset=*/ U8X8_PIN_NONE); // Digispark ATtiny85 Pin 0 Data, Pin 2 clock
void setup(void)
{
u8x8.begin();
u8x8.setPowerSave(0); //enegergiesparen 0 aus
}
void loop(void)
{
int chk = DHT.read11(DHT11_PIN);
temp = (DHT.temperature);
humi = (DHT.humidity);
u8x8.setFont(u8x8_font_chroma48medium8_r);
u8x8.drawString(0,0,"~~~~~~~~~~~~~~~~");
u8x8.drawString(0,1,"Temperatur");
u8x8.drawString(1,2,( itoa(int(temp), strTemp, 10)));
u8x8.drawString(4,2,"Grad Celsius");
u8x8.drawString(1,3,"--------------");
u8x8.drawString(0,4,"Luftfeuchtigkeit");
u8x8.drawString(1,5,( itoa(int(humi), strHumi, 10)));
u8x8.drawString(4,5,"Prozent");
u8x8.drawString(0,6,"~~~~~~~~~~~~~~~~");
delay(200);
}
DHT11, как известно, медленно реагирует и часто возвращает null для спорадических показаний. Я замечаю, что во второй цепи у датчика есть резисторы, но я не вижу, к каким контактам они подключены. Вам понадобится подтягивание для линии передачи данных датчика 4K7 обычно делает свое дело.
DHT работает, по спецификации, с минимальным напряжением 3,5 В. Я думаю, что вы можете ожидать чего угодно, если не обеспечите соответствующее напряжение, которое, судя по изображению, составляет всего 3 В.
Источник: https://components101.com/dht11-temperature-sensor
- avrdude: ошибка проверки, первое несоответствие в байте 0x0000 : 0x00 != 0x16 с использованием USBasp
- Wire.h не найден!
- Эмуляция 1-проводных устройств
- Может ли плагин Arduino Eclipse использовать библиотеки, установленные Arduino IDE?
- Arduino IDE: Плата nodemcuv2 (платформа esp8266, пакет esp8266) неизвестна
- Как получить доступ к порту B Attiny84 в коде Arduino IDE?
- Как установить собственную библиотеку с помощью Arduino IDE 1.8.5?
- Альтернативы дисплею Nextion
Этот второй вывод DHT, тот, который идет к контакту ATtiny, также должен быть подключен к + 3V? Почти уверен, что там должен был быть резистор. Вероятно, вам также следует включить некоторые развязывающие колпачки на линиях электропередач. 0,1мкФ как можно ближе к контактам питания ATtiny., @Delta_G
@Delta_G - Спасибо за ваш комментарий. У меня есть резистор 10K, подключенный к контакту данных датчика DHT11. Насколько я понимаю, подтягивающий резистор необходим, потому что линия передачи данных к датчику двунаправленная. Я протестировал сам датчик с помощью UNO, и он работал хорошо (с резистором и без него, питаясь от 5v и 3v3 вольт), что, конечно, дало разные результаты, но это ожидаемо. Я думаю, что моя проблема может быть в самом программном обеспечении., @MDChaara
Почему комментируется строка
DHT.read11 (DHT11_PIN);
? Вы должны выполнить чтение перед доступом к переменным..., @frarugi87itoa() предназначен для преобразования целого числа в ascii, но вы даете ему float . Он работает на ПК (Visual Studio), но вы можете проверить, работает ли он под GCC. Кроме того, что произойдет, если itoa вернет более 4 символов? Возможно, вы захотите поместить строки во flash? Я думаю, вы приставляете к ним букву "Т"?? (Пожалуйста, кто-нибудь, помогите !!), @Code Gorilla
@frarugi87 - Это прокомментировано, потому что это из другой библиотеки. Я действительно удалю его из кода. Спасибо, что обратили на это внимание., @MDChaara
@CodeGorilla - Вы правы, но смена типа не помогает. Я попытался прочитать его из DHT как int (не сработало), передать itoa() как int (не сработало) и как float (также не сработало). itoa() никогда не будет передавать более 4 символов, но я тем не менее изменил несколько вещей в коде. Пожалуйста, посмотрите и проверьте, можете ли вы что-нибудь заметить. Спасибо за комментарий и призыв о помощи., @MDChaara
@MDChaara вы сказали, что используете библиотеку Роба Тиллаарта. Эта библиотека (на самом деле их две, но они работают одинаково) ТРЕБУЕТ, чтобы вы вызывали функцию read перед получением результатов от объекта. См. [это example](https://github.com/RobTillaart/Arduino/blob/master/libraries/DHTstable/examples/dht11_test/dht11_test.ino), @frarugi87
@frarugi87 - Спасибо за пример. Функция вызывается, но результат остается прежним. Я обновил код. Спасибо за вашу помощь. Я ценю это., @MDChaara
@MDChaara Вы пробовали печатать литеральную строку, а не вывод iota (который должен быть совершенно хорошей строкой, но ...). т.е. Попробуйте напечатать temp как "42" и убедитесь, что он появляется там, где вы ожидаете. Все остальные строки работают, так что это тоже должно работать. Я понимаю, что это, вероятно, бессмысленно, но..., @Code Gorilla
@MDChaara pinmode на входе dht pin бесполезен (библиотека управляет этим за вас). Попробуйте также проверить возвращаемое значение функции read11 (как это делается в примере)., @frarugi87
@CodeGorilla: Возможно, вы действительно на что-то наткнулись :) Когда я печатаю число, оно приходит в двоичном виде. Я попробовал 30, и он напечатал 11110 на экране :), @MDChaara
@frarugi87 Спасибо. Я удалю его и попробую код., @MDChaara