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