Пн июн 13, 2022 22:44:14
#include "main.h"
#include "millis_micros.cpp"
#include "USI_TWI_Master.cpp"
#include "TinyWireM.cpp"
#include "SPARKFUN_AHT20.cpp"
#include "TinyOzOLED.cpp"
#define AHT20_VCC PB4
float t_f,h_f;
AHT20 AHT;
int main(void)
{
PORTB|=(1<<AHT20_VCC);
AHT.begin();
OzOled.init(); //инициализация дисплей
OzOled.setNormalDisplay(); //нормальный режим
OzOled.setPageMode(); //адресация страничная
OzOled.sendCommand(0xA1); //выбор ориентации сверху - вниз
OzOled.sendCommand(0xC8); //слева - направо
while (1)
{
t_f = AHT.getTemperature(); // Читаем новые значения температуры
h_f = AHT.getHumidity(); // и влажности
OzOled.clearDisplay();
OzOled.printNumber(t_f,1, 0, 0);
_delay_ms(1000);
OzOled.clearDisplay();
OzOled.printNumber(h_f,2, 0, 10);
_delay_ms(1000);
}
}
float AHT20::getTemperature()
{
if (sensorQueried.temperature == true)
{
//We've got old data so trigger new measurement
triggerMeasurement();
delay(75); //Wait for measurement to complete
uint8_t counter = 0;
while (isBusy())
{
delay(1);
if (counter++ > 100)
return (false); //Give up after 100ms
}
readData();
}
//From datasheet pg 8
float tempCelsius = ((float)sensorData.temperature / 1048576) * 200 - 50;
//Mark data as old
sensorQueried.temperature = true;
return tempCelsius;
}
Вт июн 14, 2022 09:23:15
Вт июн 14, 2022 09:56:19
Вт июн 14, 2022 10:24:04
void AHT20::readData()
{
//Clear previous data
sensorData.temperature = 0;
sensorData.humidity = 0;
if (_i2cPort->requestFrom(_deviceAddress, (uint8_t)6) > 0)
{
uint8_t state = _i2cPort->read();
uint32_t incoming = 0;
incoming |= (uint32_t)_i2cPort->read() << (8 * 2);
incoming |= (uint32_t)_i2cPort->read() << (8 * 1);
uint8_t midByte = _i2cPort->read();
incoming |= midByte;
sensorData.humidity = incoming >> 4;
sensorData.temperature = (uint32_t)midByte << (8 * 2);
sensorData.temperature |= (uint32_t)_i2cPort->read() << (8 * 1);
sensorData.temperature |= (uint32_t)_i2cPort->read() << (8 * 0);
//Необходимо избавиться от данных в битах> 20
sensorData.temperature = sensorData.temperature & ~(0xFFF00000);
//Пометить данные как свежие
sensorQueried.temperature = false;
sensorQueried.humidity = false;
}
}
bool ATH20::getSensor(float *h, float *t)
{
startSensor();
Wire.requestFrom(0x38, 6);
unsigned char str[6];
int index = 0;
while (Wire.available())
{
str[index++] = Wire.read(); // receive a byte as character
}
if(str[0] & 0x80)return 0;
unsigned long __humi = 0;
unsigned long __temp = 0;
__humi = str[1];
__humi <<= 8;
__humi += str[2];
__humi <<= 4;
__humi += str[3] >> 4;
*h = (float)__humi/1048576.0;
__temp = str[3]&0x0f;
__temp <<=8;
__temp += str[4];
__temp <<=8;
__temp += str[5];
*t = (float)__temp/1048576.0*200.0-50.0;
return 1;
}
Вт июн 14, 2022 11:01:13
Вт июн 14, 2022 11:10:53
.........
readData();
}
//From datasheet pg 8
float tempCelsius = ((float)sensorData.temperature / 1048576.0) * 200.0 - 50.0;
.........
readData();
}
//From datasheet pg 8
float relHumidity = ((float)sensorData.humidity / 1048576.0) * 100.0;
Вт июн 14, 2022 11:21:55
Вт июн 14, 2022 13:29:34
if(str[0] & 0x80)return 0;
void AHT20::readData()
{
//Очистить предыдущие данные
sensorData.temperature = 0;
sensorData.humidity = 0;
_i2cPort->requestFrom(_deviceAddress, 6); //считали шесть байт
unsigned char str[6];
int ind = 0;
while (_i2cPort->available())
{
str[ind++] = _i2cPort->read(); //получаем байт
}
if(str[0] & 0x80); //НЕ ЗНАЮ ЗАЧЕМ, КТО ПОМОЖЕТ ОБЪЯСНИТЬ ЧТО ТУТ ДЕЛАЕМ?
unsigned long __humi = 0;
unsigned long __temp = 0;
__humi = str[1];
__humi <<= 8;
__humi += str[2];
__humi <<= 4;
__humi += str[3] >> 4;
sensorData.humidity = __humi; //передаем значение чтоб далее работало без переделок в других функциях
__temp = str[3]&0x0f;
__temp <<=8;
__temp += str[4];
__temp <<=8;
__temp += str[5];
sensorData.temperature = __temp; //передаем значение чтоб далее работало без переделок в других функциях
//Пометить данные как свежие
sensorQueried.temperature = false;
sensorQueried.humidity = false;
}
Вт июн 14, 2022 14:35:13
Вт июн 21, 2022 13:09:50
korsaj писал(а):А там идёт проверка первого принятого байта и если он равен 0x80 возвращается 0.
(str[0] & 0x80)
Вт июн 21, 2022 16:02:49
Вт июн 21, 2022 16:49:32
Ср июн 22, 2022 15:17:58