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

Датчик температуры и влажности 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;
}

 

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

По ходу нужно заменить 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);

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

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();

 

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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" - чушь.

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

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

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

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

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

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

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

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

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

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

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

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