**Tutorial on how to count warmwater consuption with temperature sensor** Peter Cordova pc222hf In this project I try to count my monthly warmwater consuption with detailed costs. I use temperature sensor and Pycom device to send data to Pybytes plattform that gather information and visualize it in charts. It takes about 5 hours to set-up everything and about 5-10 minutes a day for maintenance. **Objective** I chose this project because i was curious about finding out speific warmwater costs. Every month I get a invoice for warm water that is around 450sek. I just get amount without any specifications. Then I was intrested to find out how costs are devided and asigned. Thats why I decided to create a device that count my warmwater consuption during the day. I think this information is usefull to know for both invironment and better private economy. **Material** I used following material: | Material | Purpose | | -------- | -------- | | Pycom ExtansionBoard | connection and power Lopy4|network and programming Lora Anthena|network USB cable|power supply sensor DHT11|measure temperature I bought the material on Electrokit.se and I paid 995SEK for a set. I got all I needed plus other sensors that I didnt use. ![](https://i.imgur.com/KRT8FGe.png) ExtansionBoard and Lopy4 ![](https://i.imgur.com/ggkT4f7.jpg)Lora Anthena ![](https://i.imgur.com/G4ZggJf.jpg) DHT11 Temperature and Humidity sensor **Computer setup** I installed and used Atom as IDE and Pymakr plugins. I uploaded all the code through the Atom and used Pybytes plattform to get the data. I followed Pybytes tutorials for setting Wifi and Lora connections. **Putting everything together** I started with connection of my Lopy4 to the computer, checked the connection and network, sended some signals to Pybytes through Atom/Pymakr. Then I turned off the Pycom device and connected my DHT11 to extansionboard: ground(brown cable) to GND, VCC to 3VR on the board and finally data to P23. ![](https://i.imgur.com/FIzNhMD.jpg) **Platform** I used Pybytes cloud plattform and I think its very easy to use, simple with step by step guides. I used free version. Pybytes had good mobile version, in case you want to check your device outside. And firware over the air worked quickly without any errors. **The code** The code is attached below: ``` # https://github.com/JurassicPork/DHT_PyCom import time import pycom from machine import enable_irq, disable_irq, Pin class DHTResult: 'DHT sensor result returned by DHT.read() method' ERR_NO_ERROR = 0 ERR_MISSING_DATA = 1 ERR_CRC = 2 error_code = ERR_NO_ERROR temperature = -1 humidity = -1 def __init__(self, error_code, temperature, humidity): self.error_code = error_code self.temperature = temperature self.humidity = humidity def is_valid(self): return self.error_code == DHTResult.ERR_NO_ERROR class DHT: 'DHT sensor (dht11, dht21,dht22) reader class for Pycom' #__pin = Pin('P3', mode=Pin.OPEN_DRAIN) __dhttype = 0 def __init__(self, pin, sensor=0): self.__pin = Pin(pin, mode=Pin.OPEN_DRAIN) self.__dhttype = sensor self.__pin(1) time.sleep(1.0) def read(self): # pull down to low self.__send_and_sleep(0, 0.019) data = pycom.pulses_get(self.__pin,100) self.__pin.init(Pin.OPEN_DRAIN) self.__pin(1) #print(data) bits = [] for a,b in data: if a ==1 and 18 <= b <= 28: bits.append(0) if a ==1 and 65 <= b <= 75: bits.append(1) #print("longueur bits : %d " % len(bits)) if len(bits) != 40: return DHTResult(DHTResult.ERR_MISSING_DATA, 0, 0) #print(bits) # we have the bits, calculate bytes the_bytes = self.__bits_to_bytes(bits) # calculate checksum and check checksum = self.__calculate_checksum(the_bytes) if the_bytes[4] != checksum: return DHTResult(DHTResult.ERR_CRC, 0, 0) # ok, we have valid data, return it [int_rh, dec_rh, int_t, dec_t, csum] = the_bytes if self.__dhttype==0: #dht11 rh = int_rh #dht11 20% ~ 90% t = int_t #dht11 0..50°C else: #dht21,dht22 rh = ((int_rh * 256) + dec_rh)/10 t = (((int_t & 0x7F) * 256) + dec_t)/10 if (int_t & 0x80) > 0: t *= -1 return DHTResult(DHTResult.ERR_NO_ERROR, t, rh) def __send_and_sleep(self, output, mysleep): self.__pin(output) time.sleep(mysleep) def __bits_to_bytes(self, bits): the_bytes = [] byte = 0 for i in range(0, len(bits)): byte = byte << 1 if (bits[i]): byte = byte | 1 else: byte = byte | 0 if ((i + 1) % 8 == 0): the_bytes.append(byte) byte = 0 #print(the_bytes) return the_bytes def __calculate_checksum(self, the_bytes): return the_bytes[0] + the_bytes[1] + the_bytes[2] + the_bytes[3] & 255 ``` ``` # Data is sent to Pybytes. Needs to flashed with Pybyte firmware import time from machine import Pin from dht import DHT # https://github.com/JurassicPork/DHT_PyCom # Type 0 = dht11 # Type 1 = dht22 th = DHT(Pin('P23', mode=Pin.OPEN_DRAIN), 0) time.sleep(2) while True: result = th.read() while not result.is_valid(): time.sleep(.5) result = th.read() print('Temp:', result.temperature) print('RH:', result.humidity) pybytes.send_signal(1,result.temperature) pybytes.send_signal(2,result.humidity) time.sleep(5) ``` DHT and DHTResult classes are responsible for taking the valid information and main class kör några metoder som skickar data till både atom terminal och pybytes. **Transmitting the data / connectivity** Data is sent every 7 seconds, and I used Wifi as first choice for network, MQTT protocol. **Presenting the data** The data is sent every 7th second to pybytes and displays in the linechart diagram, the example bellow shows last 4 hours. ![](https://i.imgur.com/0roBKi4.png) **Finalizing the design** I am happy with my discoveries and I find out that it cost for me around 1,8SEK to shower, 2,5SEK for dishwashing and 0,09SEK each time I wash my hands. To use warm water for one minute cost 0,18SEK. Here is the picture of my device in action ![](https://i.imgur.com/dGJQeel.jpg)