Перейти к содержанию

Датчик температуры и влажности CJMCU-1080 HDC1080 на ATtiny85


Рекомендуемые сообщения

Всем привет.

Решил сделать небольшую домашнюю метеостанцию.

Есть приемник с экраном, куда выводится инфа (построено на ATMEGA 328P) и есть передатчик, который посылает инфу по возудху (построено на ATtiny85).

В передатчике использую обычные DHT22. В принципе качество чуть ниже среднего. Но главный недостаток - порой сбоит, присылая данные в 2 раза больше предидущих, потом опять приходит в себя. и так повторяется постоянно.

При этом время между измерениями не меньше 20 сек.

В общем заказал я себе с Китаюшки более точные датчики - 

CJMCU-1080 HDC1080
Вещица прекрасная, но общается по I2C.

А библиотеку рабочую под нее я смог найти только одну "ClosedCube_HDC1080.h" и никаких модификаций под ATtiny я найти не смог.

Для ее работы соответственно нужен Wire.h

В общем решил я его поковырять самостоятельно, хоть и не прогер. Забрался во внутренности ClosedCube_HDC1080.cpp и везде заменил Wire на TinyWireM (некий аналог Wire для ATtiny).

И у меня даже получилось считывать валжность, но вот вместо температуры приходит гадость. Ибо при компиляции Arduino IDE ругалась на строку (я ее ниже в коде закомментировал)

    uint8_t buf[4];
    for (int i = 1; i < (seconds*66); i++) {
        TinyWireM.beginTransmission(_address);
        TinyWireM.write(0x00);
        TinyWireM.endTransmission();
        delay(20);
        TinyWireM.requestFrom(_address, (uint8_t)4);
//        TinyWireM.readBytes(buf, (size_t)4);
    }

Ошибку пишет следующую:

\ClosedCube_HDC1080.cpp: In member function 'void ClosedCube_HDC1080::heatUp(uint8_t)':

\ClosedCube_HDC1080.cpp:81:13: error: 'class USI_TWI' has no member named 'readBytes'

TinyWireM.readBytes(buf, (size_t)4);
Может есть ребята более понимающие в коде и сумеющие победить эту проблему, чтобы и температуру этот датчик смог передавать через ATtiny85.

Вот полный текст файла ClosedCube_HDC1080.cpp (уже замененный ну и строчка закоментирована):

#include <TinyWireM.h>

#include "ClosedCube_HDC1080.h"


ClosedCube_HDC1080::ClosedCube_HDC1080()
{
}

void ClosedCube_HDC1080::begin(uint8_t address) {
    _address = address;
    TinyWireM.begin();

        // Heater off, 14 bit Temperature and Humidity Measurement Resolution
    TinyWireM.beginTransmission(_address);
    TinyWireM.write(CONFIGURATION);
    TinyWireM.write(0x0);
    TinyWireM.write(0x0);
    TinyWireM.endTransmission();

}

HDC1080_Registers ClosedCube_HDC1080::readRegister() {
    HDC1080_Registers reg;
    reg.rawData = (readData(CONFIGURATION) >> 8);
    return reg;
}

void ClosedCube_HDC1080::writeRegister(HDC1080_Registers reg) {
    TinyWireM.beginTransmission(_address);
    TinyWireM.write(CONFIGURATION);
    TinyWireM.write(reg.rawData);
    TinyWireM.write(0x00);
    TinyWireM.endTransmission();
    delay(10);
}

void ClosedCube_HDC1080::heatUp(uint8_t seconds) {
    HDC1080_Registers reg = readRegister();
    reg.Heater = 1;
    reg.ModeOfAcquisition = 1;
    writeRegister(reg);

    uint8_t buf[4];
    for (int i = 1; i < (seconds*66); i++) {
        TinyWireM.beginTransmission(_address);
        TinyWireM.write(0x00);
        TinyWireM.endTransmission();
        delay(20);
        TinyWireM.requestFrom(_address, (uint8_t)4);
//        TinyWireM.readBytes(buf, (size_t)4);
    }
    reg.Heater = 0;
    reg.ModeOfAcquisition = 0;
    writeRegister(reg);
}

float ClosedCube_HDC1080::readT() {
    return readTemperature();
}

float ClosedCube_HDC1080::readTemperature() {
    uint16_t rawT = readData(TEMPERATURE);
    return (rawT / pow(2, 16)) * 165 - 40;
}

float ClosedCube_HDC1080::readH() {
    return readHumidity();
}

float ClosedCube_HDC1080::readHumidity() {
    uint16_t rawH = readData(HUMIDITY);
    return (rawH / pow(2, 16)) * 100;
}

uint16_t ClosedCube_HDC1080::readManufacturerId() {
    return readData(MANUFACTURER_ID);
}

uint16_t ClosedCube_HDC1080::readDeviceId() {
    return readData(DEVICE_ID);
}

uint16_t ClosedCube_HDC1080::readData(uint8_t pointer) {
    TinyWireM.beginTransmission(_address);
    TinyWireM.write(pointer);
    TinyWireM.endTransmission();
    delay(9);
    TinyWireM.requestFrom(_address, (uint8_t)2);
    byte msb = TinyWireM.read();
    byte lsb = TinyWireM.read();
    return msb << 8 | lsb;
}

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

По ходу нужно заменить TinyWireM.readBytes(buf, (size_t)4); на TinyWireM.readBytes(buf, (uint8_t)4); это к этому \ClosedCube_HDC1080.cpp: In member function 'void ClosedCube_HDC1080::heatUp(uint8_t)':

К тому же в библиотеке ClosedCube_HDC1080  'class USI_TWI' нет такого оператора 'readBytes' ,

Попробуй так:  TinyWireM.read(buf, (uint8_t)4);

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

10 часов назад, ximik_se сказал:

void ClosedCube_HDC1080::heatUp(uint8_t seconds)

Эта функция служит для просушки датчика влажности. Её можно не использовать или вместо закомментированной строки вставить

buf[0] = TinyWireM.read();

buf[1] = TinyWireM.read();

buf[2] = TinyWireM.read();

buf[3] = TinyWireM.read();

 

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В 26.05.2017 в 00:15, Электронщик сказал:

По ходу нужно заменить TinyWireM.readBytes(buf, (size_t)4); на TinyWireM.readBytes(buf, (uint8_t)4); это к этому \ClosedCube_HDC1080.cpp: In member function 'void ClosedCube_HDC1080::heatUp(uint8_t)':

К тому же в библиотеке ClosedCube_HDC1080  'class USI_TWI' нет такого оператора 'readBytes' ,

Попробуй так:  TinyWireM.read(buf, (uint8_t)4);

К сожалению, он продолжает ругаться.

Но это не важно. Я решил проблему, точнее нашел корень зла в этом вопросе ))

Когда я закомментил строчку и залил код. то влажность у меня показывалась верно. а вот температуру показывал "-39" - чушь.

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

Это же происходило, когда я его подключал к УНЕ на прямую. решалось просо перезапуском уны.

А тут я этого не учел, ведь питание на считывающий микроконтроллер было постоянным и я его не перезапускал.

Спасибо ВАМ большое, что отозвались на тему!

В 26.05.2017 в 03:02, snn_krs сказал:

Эта функция служит для просушки датчика влажности. Её можно не использовать или вместо закомментированной строки вставить

buf[0] = TinyWireM.read();

buf[1] = TinyWireM.read();

buf[2] = TinyWireM.read();

buf[3] = TinyWireM.read();

 

Я поставил ваш код. Не ругается. Но оказалось, что проблема в другом была! И я ее решил, точнее понял и убрал ))

Выше я ответил и вам продублирую свой ответ, т.к. вы так же, как предидущий пользовались ответили на мой крик о помощи!

Когда я закомментил строчку и залил код. то влажность у меня показывалась верно. а вот температуру показывал "-39" - чушь.

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

Это же происходило, когда я его подключал к УНЕ на прямую. решалось просо перезапуском уны.

А тут я этого не учел, ведь питание на считывающий микроконтроллер было постоянным и я его не перезапускал.

Спасибо ВАМ большое, что отозвались на тему!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...