Jump to content

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


ximik_se
 Share

Recommended Posts

Всем привет.

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

Есть приемник с экраном, куда выводится инфа (построено на 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;
}

 

Link to comment
Share on other sites

Реклама: ООО ТД Промэлектроника, ИНН: 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);

Edited by Электронщик
Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

Как измерить внутреннее сопротивление литиевого аккумулятора. Измеряем правильно

Внутреннее сопротивление – один из наиболее значимых параметров, от которого напрямую зависят другие характеристики литиевого аккумулятора. От этого параметра зависят такие характеристики источника питания, как напряжение на выходе под нагрузкой, максимальный выходной ток и коэффициент полезного действия (КПД). Рассмотрим как измерить действительное значение внутреннего сопротивления АКБ, используя определенные методики. Подробнее>>

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

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...