Explorar o código

Reorder work with AHT sensor.

Vladimir N. Shilov %!s(int64=2) %!d(string=hai) anos
pai
achega
9dd6b581c7
Modificáronse 3 ficheiros con 121 adicións e 115 borrados
  1. 64 65
      app/AHTxx.cpp
  2. 52 34
      app/application.cpp
  3. 5 16
      include/AHTxx.h

+ 64 - 65
app/AHTxx.cpp

@@ -13,35 +13,36 @@
 #define CMD_CALIBR2     (uint8_t)0x1c
 #define CMD_CALIBR3     (uint8_t)0x1e
 
-#define STATUS_BUSY (uint8_t)0x80
-#define STATUS_CMD  (uint8_t)0x40
-#define STATUS_CYC  (uint8_t)0x20
-#define STATUS_CAL  (uint8_t)0x08
-#define STATUS_CALB (uint8_t)0x18
+#define STATUS_BUSY     (uint8_t)0x80
+#define STATUS_CMD      (uint8_t)0x40
+#define STATUS_CYC      (uint8_t)0x20
+#define STATUS_CAL      (uint8_t)0x08
+#define STATUS_CALB     (uint8_t)0x18
 
-/* Functions prototypes */
-/*
-uint8_t Calc_CRC8(uint8_t *message, uint8_t Num);
-ahtxx_st_t JH_Reset_REG(uint8_t addr);
-*/
-static bool ReadyToRequest;
+/* Private variables */
 static ahtxx_t Data;
+static Timer startTimer, getTimer;
+
+/* Private functions prototypes */
+static ahtxx_st_t I2CWriteTo(uint8_t DataToSend);
+//static uint8_t Calc_CRC8(uint8_t *message, uint8_t Num);
+static ahtxx_st_t JH_Reset_REG(uint8_t addr);
+void _Init(void);
+void _GetData(void);
+void _StartMeasure(void);
 
 /**
  * Initialization
  */
-AHTxx::AHTxx(void)
-{
+void AHTxx_Init(void) {
   // Just powered on, it takes time for the product chip to be ready internally,
   // the delay is 100~500ms, and 500ms is recommended
   auto timer = new AutoDeleteTimer;
-  timer->initializeMs<500>(Init);
+  timer->initializeMs<500>(_Init);
   timer->startOnce();
-
-  ReadyToRequest = false;
 }
 
-void AHTxx::Init(void) {
+void _Init(void) {
   ahtxx_st_t res;
   uint8_t data;
 
@@ -51,7 +52,7 @@ void AHTxx::Init(void) {
   Wire.write(CMD_GET_STATUS);
   res = (ahtxx_st_t)Wire.endTransmission();
   if (res != St_OK) {
-    Data.Error = res;
+    Data.Error = St_NoSensor;
     return;
   }
 
@@ -80,10 +81,12 @@ void AHTxx::Init(void) {
   }
 
   Data.Error = St_OK;
-  ReadyToRequest = true;
+
+	// start polling sensors - once per two seconds
+	startTimer.initializeMs(2000, _StartMeasure).start();
 }
 
-void AHTxx::SoftReset(void) {
+void AHTxx_SoftReset(void) {
   ahtxx_st_t res;
   Data.Error = St_OK;
 
@@ -93,13 +96,13 @@ void AHTxx::SoftReset(void) {
     Data.Error = res;
     return;
   }
+  startTimer.restart();
 }
 
-void AHTxx::StartMeasure(void) {
-  if (ReadyToRequest == false) {
-    return;
-  }
-
+/**
+ * @brief Start Sensor measure.
+ */
+void _StartMeasure(void) {
   ahtxx_st_t res;
   Data.Error = St_OK;
 
@@ -112,13 +115,17 @@ void AHTxx::StartMeasure(void) {
     Data.Error = res;
     return;
   }
+
+	getTimer.initializeMs(600, _GetData).startOnce();
 }
 
-void AHTxx::GetData(ahtxx_t * data) {
-  if (ReadyToRequest == false) {
-    return;
-  }
+void AHTxx_GetData(ahtxx_t * data) {
+  data->Error = Data.Error;
+  data->Humidity = Data.Humidity;
+  data->Temperature = Data.Temperature;
+}
 
+void _GetData(void) {
   ahtxx_st_t res;
   uint8_t buf[8] = {0}, i = 0;
   Data.Error = St_OK;
@@ -131,13 +138,11 @@ void AHTxx::GetData(ahtxx_t * data) {
   }
   if (i < 7) {
     Data.Error = St_NACK_Data;
-    data->Error = Data.Error;
     return;
   }
 
   if ((buf[0] & STATUS_BUSY) != 0) {
     Data.Error = St_Timeout;
-    data->Error = Data.Error;
     return;
   }
 
@@ -170,40 +175,10 @@ void AHTxx::GetData(ahtxx_t * data) {
   result /= 256;
   result /= 16;
   Data.Temperature = (int16_t)(result - 500); // in xx.x *C
-
-  data->Error = Data.Error;
-  data->Humidity = Data.Humidity;
-  data->Temperature = Data.Temperature;
-}
-
-/**
- * CRC check type: CRC8/MAXIM
- * Polynomial: X8+X5+X4+1
- * Poly: 0011 0001 0x31
- * When the high bit is placed in the back, it becomes 1000 1100 0x8c
- */
-uint8_t AHTxx::Calc_CRC8(uint8_t *message, uint8_t Num)
-{
-  uint8_t i;
-  uint8_t byte;
-  uint8_t crc = 0xFF;
-
-  for (byte=0; byte<Num; byte++) {
-    crc ^= (message[byte]);
-    for (i=8; i>0; --i) {
-      if (crc & 0x80) {
-        crc = (crc << 1) ^ 0x31;
-      } else {
-        crc = (crc << 1);
-      }
-    }
-  }
-
-  return crc;
 }
 
 /* Reset register */
-ahtxx_st_t AHTxx::JH_Reset_REG(uint8_t addr) {
+static ahtxx_st_t JH_Reset_REG(uint8_t addr) {
   ahtxx_st_t res;
   uint8_t Byte_first, Byte_second, Byte_third;
 
@@ -243,12 +218,36 @@ ahtxx_st_t AHTxx::JH_Reset_REG(uint8_t addr) {
   return St_OK;
 }
 
-ahtxx_st_t AHTxx::I2CWriteTo(uint8_t DataToSend) {
+static ahtxx_st_t I2CWriteTo(uint8_t DataToSend) {
   Wire.beginTransmission(AHT_I2C_ADDR);
   Wire.write(DataToSend);
   return (ahtxx_st_t)Wire.endTransmission();
 }
 
-bool AHTxx::IsReadyToRequest(void) {
-  return ReadyToRequest;
+/**
+ * CRC check type: CRC8/MAXIM
+ * Polynomial: X8+X5+X4+1
+ * Poly: 0011 0001 0x31
+ * When the high bit is placed in the back, it becomes 1000 1100 0x8c
+ */
+/*
+static uint8_t Calc_CRC8(uint8_t *message, uint8_t Num)
+{
+  uint8_t i;
+  uint8_t byte;
+  uint8_t crc = 0xFF;
+
+  for (byte=0; byte<Num; byte++) {
+    crc ^= (message[byte]);
+    for (i=8; i>0; --i) {
+      if (crc & 0x80) {
+        crc = (crc << 1) ^ 0x31;
+      } else {
+        crc = (crc << 1);
+      }
+    }
+  }
+
+  return crc;
 }
+*/

+ 52 - 34
app/application.cpp

@@ -15,13 +15,13 @@ Timer displayTimer, tmpTimer;
 Timer showHighTimer, showLowTimer;
 Timer brightTimer;
 // Sensors values
+ahtxx_t sensorData;
 float SensorT, SensorH, SensorHI, SensorCR;
 String StrCF;
 // Time values
 time_t Time, NTPLastUpdate;
 DateTime dt;
 
-void RequestData(void);
 void GetData(void);
 void connectOk(const String& SSID, MacAddress bssid, uint8_t channel);
 void connectFail(const String& ssid, MacAddress bssid, WifiDisconnectReason reason);
@@ -31,14 +31,13 @@ void showWatch(void);
 void showTime(void);
 void showTemperature(void);
 void showHumidity(void);
+void showError(void);
 void setBright(void);
 
 // NTP Client
 void onNtpReceive(NtpClient& client, time_t timestamp);
 NtpClient ntpClient("ntp.time.in.ua", 1500, onNtpReceive); // every 15 min
 
-AHTxx sensor;
-
 void init(void) {
 	spiffs_mount(); // Mount file system, in order to work with files
 
@@ -66,15 +65,18 @@ void init(void) {
 	// BIG digits
 	LED_Init();
 
-	// polling sensors - once per two seconds
-	procTimer.initializeMs(2000, RequestData).start();
-
 	// Low LED output
 	TM1650_Init();
 	brightTimer.initializeMs(1000, setBright).start();
 
-	// обновление нижнего экрана два раза в секунду
+	// refresh big led
 	displayTimer.initializeMs(500, showWatch).start();
+
+	// init sensors
+	AHTxx_Init();
+
+	// polling sensors - once per two seconds
+	procTimer.initializeMs(2000, GetData).start();
 }
 
 void showWatch(void) {
@@ -130,18 +132,42 @@ void showTime(void) {
 }
 
 /*
- * Выводим температуру на нижние индикаторы
+ * Show temperature, small indicators
  */
 void showTemperature(void) {
-	// ...
-	TM1650_Out(dt.Hour >> 4, dt.Hour & 0xf, dt.Minute >>4, dt.Minute & 0xf);
+	uint8_t a, b, c;
+	a = sensorData.Temperature / 100;
+	c = sensorData.Temperature % 100;
+	b = c / 10;
+	c = c % 10;
+	TM1650_Out(a, b, c, 0);
+	TM1650_Out4(Sym_C);
+	TM1650_DotSet(Dig_2);
 }
 
 /*
- * Выводим влажность на нижние индикаторы
+ * Show humidity, small indicators
  */
 void showHumidity(void) {
-	// ...
+	uint8_t a, b, c;
+	a = sensorData.Humidity / 100;
+	c = sensorData.Humidity % 100;
+	b = c / 10;
+	c = c % 10;
+	TM1650_Out(a, b, c, 0);
+	TM1650_Out4(Sym_H);
+	TM1650_DotSet(Dig_2);
+}
+
+/*
+ * Show error, small indicators
+ */
+void showError(void) {
+	TM1650_DotRes(Dig_2);
+	TM1650_Out1(Sym_E);
+	TM1650_Out2(Sym_r);
+	TM1650_Out3(Sym_r);
+	TM1650_Out4(Sym_Off);
 }
 
 /*
@@ -159,38 +185,30 @@ void setBright(void) {
 		// ...
 }
 
-/**
- * @brief Start Sensor measure.
- */
-void RequestData(void) {
-	if (sensor.IsReadyToRequest()) {
-		sensor.StartMeasure();
-		tmpTimer.initializeMs(600, GetData).startOnce();
-	} else {
-		Serial.println("Sensor: not ready to request.");
-	}
-}
-
 /**
  * @brief Get data from Temperature/Humidity Sensor.
  */
 void GetData(void) {
-	ahtxx_t data;
+	static bool st = false;
 
-	sensor.GetData(&data);
-	if (data.Error != St_OK) {
+	AHTxx_GetData(&sensorData);
+	if (sensorData.Error != St_OK) {
 		Serial.println("Sensor: Data error!");
 		return;
 	}
 
-	SensorH = data.Humidity / 10;
-	SensorT = data.Temperature / 10;
+	SensorT = (float)sensorData.Temperature / 10;
+	SensorH = (float)sensorData.Humidity / 10;
+
+	if (st) {
+		st = !st;
+		showTemperature();
+	} else {
+		st = !st;
+		showHumidity();
+	}
 
-	Serial.print("Humidity: ");
-	Serial.print(SensorH);
-	Serial.print("%. Temperature: ");
-	Serial.print(SensorT);
-	Serial.println("*C");
+	Serial.printf("Humidity: %d.%d %%; Temperature: %d.%d *C\r\n", sensorData.Humidity/10, sensorData.Humidity%10, sensorData.Temperature/10, sensorData.Temperature%10);
 }
 
 void connectOk(const String& SSID, MacAddress bssid, uint8_t channel)

+ 5 - 16
include/AHTxx.h

@@ -11,7 +11,8 @@ typedef enum {
   St_NACK_Addr = 2,
   St_NACK_Data = 3,
   St_Error = 4,
-  St_Timeout = 5
+  St_Timeout = 5,
+  St_NoSensor
 } ahtxx_st_t;
 
 /* Data type */
@@ -21,20 +22,8 @@ typedef struct {
   ahtxx_st_t Error;
 } ahtxx_t;
 
-class AHTxx
-{
-public:
-  AHTxx(void);
-  void StartMeasure(void);
-  void SoftReset(void);
-  void GetData(ahtxx_t * data);
-  bool IsReadyToRequest(void);
-
-private:
-  static void Init(void);
-  static ahtxx_st_t I2CWriteTo(uint8_t DataToSend);
-  static uint8_t Calc_CRC8(uint8_t *message, uint8_t Num);
-  static ahtxx_st_t JH_Reset_REG(uint8_t addr);
-};
+void AHTxx_Init(void);
+void AHTxx_GetData(ahtxx_t * data);
+void AHTxx_SoftReset(void);
 
 #endif /* _AHTxxH_ */