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

Реле, разъемы, вентиляторы, корпуса, микросхемы, конденсаторы и много другое!

Скидки до 20% на сайте электронного дискаунтера ТМ Электроникс.

Бесплатная доставка в любую точку России + кэшбэк 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();

 

Link to comment
Share on other sites

Материалы вебинара «Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока»

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

Комплексные решения с литиевыми батареями EVE для интеллектуальных систем безопасности

Литиевые химические источники тока EVE по своим характеристикам являются идеальным выбором для современных интеллектуальных систем безопасности. EVE разрабатывает литиевые батареи, опираясь на многолетние исследования таких областей применения, как беспроводная связь стандартов Bluetooth, LoRa, Wi-Fi, NB-IoT и ZigBee. Рассмотрим решения для систем безопасности с использованием батарей EVE. Подробнее>>

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