Browse Source

New soldered HW. ADC max min fixes.

Thomas Chef 3 years ago
parent
commit
30c932e5bf
8 changed files with 54 additions and 31 deletions
  1. 1 0
      STM32/.gitignore
  2. 4 4
      STM32/Core/Src/main.c
  3. 7 8
      STM32/Core/Src/oneWire.c
  4. 13 7
      STM32/Core/Src/stm32f1xx_it.c
  5. 1 0
      main/config.h
  6. 20 9
      main/displayAndSend.c
  7. 7 3
      main/serial.c
  8. 1 0
      main/ssd1306.h

+ 1 - 0
STM32/.gitignore

@@ -2,5 +2,6 @@
 /Drivers/
 /EWARM/
 /Debug/
+/Release/
 /*.ld
 /*.launch

+ 4 - 4
STM32/Core/Src/main.c

@@ -52,7 +52,7 @@ UART_HandleTypeDef huart2;
 
 /* USER CODE BEGIN PV */
 extern uint32_t adcCounter;
-extern uint16_t maxWaveDiff;	// Stores the latest measured ADC Wave data (MAX-MIN)
+extern int maxWaveDiff;	// Stores the latest measured ADC Wave data (MAX-MIN)
 
 /* USER CODE END PV */
 
@@ -71,7 +71,7 @@ void handleCmdRx();
 /* Private user code ---------------------------------------------------------*/
 /* USER CODE BEGIN 0 */
 
-uint16_t getADCDiff() {
+int getADCDiff() {
 
 	volatile uint32_t firstCnt;
 	int32_t timeoutCnt = 20;
@@ -198,9 +198,9 @@ int main(void)
 	  uint32_t startTime = HAL_GetTick();
 
 
-	  uint16_t adcDiff = getADCDiff();
+	  int adcDiff = getADCDiff();
 	  //printf("Cnt:%lu  Diff:%u   mV:%u\n",adcCounter, adcDiff, (adcDiff*805)/1000);
-	  printf("{VPP,0,%u}\n",adcDiff);
+	  printf("{VPP,0,%d}\n",adcDiff);
 
 	  for(uint8_t sId=0;sId<MAX_NO_OF_OW && adr[sId]>0 ;sId++) {
 		  float temp = readTemperature(adr[sId]);

+ 7 - 8
STM32/Core/Src/oneWire.c

@@ -157,8 +157,6 @@ void setConfigRegister(const uint64_t adr, const uint8_t value) {
 	writeByte( (((value)|0x1F)&0x7F) );
 }
 
-
-
 static uint32_t initReadTemp(const uint64_t adr)
 {
 	uint32_t noOfSlots = 0;
@@ -174,9 +172,10 @@ static uint32_t initReadTemp(const uint64_t adr)
 	return noOfSlots;
 }
 
+
 float readTemperature(const uint64_t adr)
 {
-	uint32_t time_ms = initReadTemp(adr);
+	initReadTemp(adr);
 
 	oneWire_init();
 	writeByte(0x55); // skip ROM
@@ -184,12 +183,12 @@ float readTemperature(const uint64_t adr)
 	writeByte(0xBE); // Read Scratchpad
 	uint8_t b0 = readByte();
 	uint8_t b1 = readByte();
-	uint8_t b2 = readByte();
-	uint8_t b3 = readByte();
+	//uint8_t b2 = readByte();
+	//uint8_t b3 = readByte();
 	uint8_t b4 = readByte();
-	uint8_t b5 = readByte();
-	uint8_t b6 = readByte();
-	uint8_t b7 = readByte();
+	//uint8_t b5 = readByte();
+	//uint8_t b6 = readByte();
+	//uint8_t b7 = readByte();
 	uint16_t raw = (int16_t)((b1 << 8) | b0);
 	uint16_t cfg = (b4 & 0x60);
 	// at lower res, the low bits are undefined, so let's zero them

+ 13 - 7
STM32/Core/Src/stm32f1xx_it.c

@@ -43,7 +43,7 @@
 /* Private variables ---------------------------------------------------------*/
 /* USER CODE BEGIN PV */
 uint32_t adcCounter=0;
-uint16_t maxWaveDiff = 0;	// Stores the latest measured ADC Wave data (MAX-MIN)
+int maxWaveDiff = 0;	// Stores the latest measured ADC Wave data (MAX-MIN)
 
 /* USER CODE END PV */
 
@@ -221,26 +221,32 @@ void ADC1_2_IRQHandler(void)
 	static uint16_t adcData = 0;
 	static uint16_t minValue = 0xFFF;
 	static uint16_t maxValue = 0;
+	static uint16_t minCounter = 0;
 
 	static uint32_t cnt = 10000;	// 205 882,35Hz = 4 117,6 samples/wave. 10000 samples = 48mS = 2.4 Waves
 
 	adcData = ADC1->DR;
 
 	if( cnt > 0 ) {
-		if( adcData > maxValue ) maxValue = adcData;
-		else if( adcData < minValue ) minValue = adcData;
+		if( adcData > maxValue ) {
+			maxValue = adcData;
+		}
+		if( adcData < minValue ) {
+			minValue = adcData;
+			minCounter++;
+		}
 		cnt--;
 	}
 	else {
 		cnt = 10000;
-		maxWaveDiff = maxValue - minValue;
-		maxValue = minValue = 0;
+		maxWaveDiff = (int)maxValue - (int)minValue;
+		maxValue = 0;
+		minValue = 0xFFF;
+		minCounter = 0;
 		adcCounter++;
 	}
 
 
-
-
   /* USER CODE END ADC1_2_IRQn 0 */
   /* USER CODE BEGIN ADC1_2_IRQn 1 */
 

+ 1 - 0
main/config.h

@@ -3,6 +3,7 @@
 
 #include "driver/gpio.h"
 
+#define SW_VERSION "1.0"
 
 #define PULSES_PER_KWH      1000
 

+ 20 - 9
main/displayAndSend.c

@@ -32,20 +32,24 @@ void displayAndSendTask(void *pvParameters) {
     SSD1306_DrawVertLine(29,0,128);
     SSD1306_Puts("Home Energy Meter", &Font_7x10,SSD1306_COLOR_WHITE);
     SSD1306_SetPosition(4,31);
-    SSD1306_Puts("v1.0", &Font_7x10,SSD1306_COLOR_WHITE);
+    SSD1306_Puts(SW_VERSION, &Font_7x10,SSD1306_COLOR_WHITE);
     SSD1306_UpdateScreen();
     vTaskDelay(3000 / portTICK_PERIOD_MS);
 
     SSD1306_Clear();
     SSD1306_SetPosition(0,0);
-    SSD1306_Puts("Temp A:", &Font_7x10,SSD1306_COLOR_WHITE);
+    SSD1306_Puts("Internal:", &Font_7x10,SSD1306_COLOR_WHITE);
     SSD1306_SetPosition(0,11);
-    SSD1306_Puts("Temp B:", &Font_7x10,SSD1306_COLOR_WHITE);
+    SSD1306_Puts("Heater:", &Font_7x10,SSD1306_COLOR_WHITE);
     SSD1306_SetPosition(0,22);
     SSD1306_Puts("ADC Vpp:", &Font_7x10,SSD1306_COLOR_WHITE);
     SSD1306_SetPosition(0,33);
     SSD1306_Puts("kWh:", &Font_7x10,SSD1306_COLOR_WHITE);
     SSD1306_UpdateScreen();
+    
+    SSD1306_SetPosition(0,50);
+    sprintf(txt,"HoEnMeter %s",SW_VERSION);
+    SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
 
     // Create the data input queue, now that all is setup
     dataQueue = xQueueCreate( QUEUE_SIZE, sizeof( DisplayData ) );
@@ -60,30 +64,37 @@ void displayAndSendTask(void *pvParameters) {
         if( xQueueReceive(dataQueue,&data, 1000 / portTICK_PERIOD_MS) == pdTRUE ) {
 
             switch( data.type ) {
-                case type_VPP: sprintf(txt,"%d",data.iData);
+                case type_VPP: sprintf(txt,"   %d",data.iData);
                           SSD1306_SetPosition(127-(strlen(txt)*8),22);
                           SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
                           SSD1306_UpdateScreen();
+                          sprintf(txt,"%d",data.iData);
+                          sendMQTTMessage("house/basement/homeEnergyMeter/waterHeaterTotalEnergy", txt);
+                          aliveCnt++;
                           break;
                 case type_TempA:
-                          sprintf(txt,"%.2f\044C",data.dData);
+                          sprintf(txt,"   %.1f\044C",data.dData);
                           SSD1306_SetPosition(127-(strlen(txt)*8),0);
                           SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
                           SSD1306_UpdateScreen();
+                          sprintf(txt,"%.2f",data.dData);
+                          sendMQTTMessage("house/basement/homeEnergyMeter/moduleInternalTemp", txt);
                           break;
                 case type_TempB:
-                          sprintf(txt,"%.2f\044C",data.dData);
+                          sprintf(txt,"   %.1f\044C",data.dData);
                           SSD1306_SetPosition(127-(strlen(txt)*8),11);
                           SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
                           SSD1306_UpdateScreen();
+                          sprintf(txt,"%.2f",data.dData);
+                          sendMQTTMessage("house/basement/homeEnergyMeter/waterHeaterTemp", txt);
                           break;
                 case type_kWh:
-                          sprintf(txt,"%.2f",data.dData);
+                          sprintf(txt,"   %.2f",data.dData);
                           SSD1306_SetPosition(127-(strlen(txt)*8),33);
                           SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
                           SSD1306_UpdateScreen();
                           sprintf(txt,"%.5f",data.dData);
-                          sendMQTTMessage("sensors/TEST/energy/electricalTotal", txt);
+                          sendMQTTMessage("house/basement/homeEnergyMeter/homeTotalEnergy", txt);
                           break;
                 default:
                           break;
@@ -91,7 +102,7 @@ void displayAndSendTask(void *pvParameters) {
         }
         else {
             sprintf(txt,"%u",aliveCnt);
-            if( ++aliveCnt == 10 ) aliveCnt=0;
+            if( aliveCnt == 10 ) aliveCnt=0;
             SSD1306_SetPosition(127-(strlen(txt)*8),50);
             SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
             SSD1306_UpdateScreen();

+ 7 - 3
main/serial.c

@@ -67,16 +67,20 @@ void serialRxTask(void *pvParameters)
 						else if( strcmp(type,"OWT") == 0 ) {
 							float t = 0.0f;
 							const int no = sscanf(data,"%f",&t);
+							
 							if( no == 1 ) {
-								if( strcmp(id,"080C25372F3D253F") == 0 ) {
+								if( strcmp(id,"28412E7B0D00002A") == 0 ) {
 									addDataToQueue(type_TempA,t,0);
 								}
 								else if( strcmp(id,"28FF22DA551603C3") == 0 ) {
 									addDataToQueue(type_TempB,t,0);
 								}
+								else {
+									ESP_LOGE("SERIAL","Unknown OW-ID:%s",id);
+								}
 								char js[50];
-								sprintf(js,"{\"id\":\"%s\",\"temp\":%s}",id,data);
-								ESP_LOGI("SERIAL", "%s",js);
+								//sprintf(js,"{\"id\":\"%s\",\"temp\":%s}",id,data);
+								//ESP_LOGI("SERIAL", "%s",js);
 							}
 						}
 					}

+ 1 - 0
main/ssd1306.h

@@ -30,6 +30,7 @@
 // Hardware Config (page 31)
 #define DISPLAY_START_LINE 0x40
 #define SEGMENT_REMAP 0xA0
+#define SEGMENT_REMAP_FLIP 0xA1
 #define MULTIPLEX_RATIO 0xA8
 #define COM_OUTPUT_SCAN_DIR 0xC0
 #define DISPLAY_OFFSET 0xD3