Browse Source

Working with JSON output

Thomas Chef 3 years ago
parent
commit
fa3cb5bb38
3 changed files with 42 additions and 15 deletions
  1. 1 0
      STM32/Core/Inc/oneWire.h
  2. 24 11
      STM32/Core/Src/main.c
  3. 17 4
      STM32/Core/Src/oneWire.c

+ 1 - 0
STM32/Core/Inc/oneWire.h

@@ -15,6 +15,7 @@ void reset_oneWireSearch();
 
 float readTemperature();
 
+void setConfigRegister(const uint64_t adr, const uint8_t value);
 
 
 #endif /* INC_ONEWIRE_H_ */

+ 24 - 11
STM32/Core/Src/main.c

@@ -34,6 +34,7 @@
 
 /* Private define ------------------------------------------------------------*/
 /* USER CODE BEGIN PD */
+#define MAX_NO_OF_OW 5
 /* USER CODE END PD */
 
 /* Private macro -------------------------------------------------------------*/
@@ -157,22 +158,26 @@ int main(void)
   /* Infinite loop */
   /* USER CODE BEGIN WHILE */
 
-  printf("VVB Energy Sensor\n\n");
-
   // ------------- Search for OneWireSensors
   //Found device: 0x080C25372F3D253F <-- Crap
   //Found device: 0x28FF22DA551603C3 <-- This is the probe
 
   reset_oneWireSearch();
-  uint64_t adr = 0;
-  while( oneWireSearch(&adr) ) {
-	  printf("Found device: 0x");
-	  for( uint8_t i = 8; i>0; i--) printf("%02X",(uint8_t)(adr >> ((i-1)*8))&0xFF);
-	  printf("\n");
+  uint64_t adr[MAX_NO_OF_OW] = {0,0,0,0,0};
+  uint8_t adrCnt=0;
+
+  while( oneWireSearch(adr+adrCnt) ) {
+	  //printf("Found device: 0x");
+	  //for( uint8_t i = 8; i>0; i--) printf("%02X",(uint8_t)(adr[adrCnt] >> ((i-1)*8))&0xFF);
+	  //printf("\n");
+	  adrCnt++;
   }
-  printf("\n");
+  //printf("\n");
   reset_oneWireSearch();
 
+  //adr = 0x28FF22DA551603C3;
+  //setConfigRegister(adr, 0x00); // 9-bit resolution
+
   while (1)
   {
     /* USER CODE END WHILE */
@@ -181,12 +186,20 @@ int main(void)
 	  HAL_GPIO_TogglePin (GPIOC, GPIO_PIN_13);
 
 	  //adr = 0x080C25372F3D253F;
-	  adr = 0x28FF22DA551603C3;
-	  /*float temp = */readTemperature(adr);
+
+	  for(uint8_t sId=0;sId<MAX_NO_OF_OW && adr[sId]>0 ;sId++) {
+		  float temp = readTemperature(adr[sId]);
+		  printf("{\"type\":\"temp\",\"id\":\"");
+		  for( uint8_t i = 8; i>0; i--) printf("%02X",(uint8_t)(adr[sId] >> ((i-1)*8))&0xFF);
+		  printf("\",\"value1\":%.2f}\n",temp);
+	  }
 
 
 	  uint16_t adcDiff = getADCDiff();
-	  printf("Cnt:%lu  Diff:%u   mV:%u\n",adcCounter, adcDiff, (adcDiff*805)/1000);
+	  //printf("Cnt:%lu  Diff:%u   mV:%u\n",adcCounter, adcDiff, (adcDiff*805)/1000);
+
+	  printf("{\"type\":\"vpp\",\"id\":\"0");
+	  printf("\",\"value1\":%u}\n",adcDiff);
 
 	  HAL_Delay(1000);
   }

+ 17 - 4
STM32/Core/Src/oneWire.c

@@ -142,11 +142,23 @@ bool oneWireSearch(uint64_t *newAddr )
 	return search_result;
 }
 
-
-static void sendROMCode(const uint64_t adr){
+static void sendROMCode(const uint64_t adr) {
 	for( uint8_t i = 8; i>0; i--) writeByte( (uint8_t)(adr >> ((i-1)*8))&0xFF );
 }
 
+
+void setConfigRegister(const uint64_t adr, const uint8_t value) {
+	oneWire_init();
+	writeByte(0x55); // match ROM
+	sendROMCode(adr);
+	writeByte(0x55); // Write Scratchpad (3 bytes)
+	writeByte(0x00);
+	writeByte(0x00);
+	writeByte( (((value)|0x1F)&0x7F) );
+}
+
+
+
 static uint32_t initReadTemp(const uint64_t adr)
 {
 	uint32_t noOfSlots = 0;
@@ -157,6 +169,7 @@ static uint32_t initReadTemp(const uint64_t adr)
 	while( readSlot() == 0 ) {
 		noOfSlots++;
 		us_delay(1000);
+		if( noOfSlots > 800 ) break; 	// Cancel after 800mS
 	}
 	return noOfSlots;
 }
@@ -185,7 +198,7 @@ float readTemperature(const uint64_t adr)
 	else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
 	//// default is 12 bit resolution, 750 ms conversion time
 	float temperature = (float)raw / 16.0;
-	printf("%lumS  :  %02X %02X %02X %02X %02X",time_ms,b0,b1,b2,b3,b4);
-	printf(" %02X %02X %02X = %.02f\n",b5,b6,b7,temperature);
+	//printf("%lumS  :  %02X %02X %02X %02X %02X",time_ms,b0,b1,b2,b3,b4);
+	//printf(" %02X %02X %02X = %.02f\n",b5,b6,b7,temperature);
 	return temperature;
 }