diff --git a/.vs/MyCore/v15/Server/sqlite3/storage.ide b/.vs/MyCore/v15/Server/sqlite3/storage.ide index b62b3f2..fd9346a 100644 Binary files a/.vs/MyCore/v15/Server/sqlite3/storage.ide and b/.vs/MyCore/v15/Server/sqlite3/storage.ide differ diff --git a/.vs/MyCore/v15/Server/sqlite3/storage.ide-shm b/.vs/MyCore/v15/Server/sqlite3/storage.ide-shm index 239a14b..707a508 100644 Binary files a/.vs/MyCore/v15/Server/sqlite3/storage.ide-shm and b/.vs/MyCore/v15/Server/sqlite3/storage.ide-shm differ diff --git a/.vs/MyCore/v15/Server/sqlite3/storage.ide-wal b/.vs/MyCore/v15/Server/sqlite3/storage.ide-wal index 78bf986..0bfa039 100644 Binary files a/.vs/MyCore/v15/Server/sqlite3/storage.ide-wal and b/.vs/MyCore/v15/Server/sqlite3/storage.ide-wal differ diff --git a/.vs/config/applicationhost.config b/.vs/config/applicationhost.config index 18e2b4a..0093391 100644 --- a/.vs/config/applicationhost.config +++ b/.vs/config/applicationhost.config @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.AssemblyInfo.cs b/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.AssemblyInfo.cs new file mode 100644 index 0000000..7cc1bac --- /dev/null +++ b/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.AssemblyInfo.cs @@ -0,0 +1,16 @@ +//------------------------------------------------------------------------------ +// +// Généré par la classe MSBuild WriteCodeFragment. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MyCore")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MyCore")] +[assembly: System.Reflection.AssemblyTitleAttribute("MyCore")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.RazorAssemblyInfo.cs b/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.RazorAssemblyInfo.cs new file mode 100644 index 0000000..e7636dc --- /dev/null +++ b/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.RazorAssemblyInfo.cs @@ -0,0 +1,13 @@ +//------------------------------------------------------------------------------ +// +// Généré par la classe MSBuild WriteCodeFragment. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.RelatedAssemblyAttribute("MyCore.Views")] +[assembly: Microsoft.AspNetCore.Razor.Hosting.RazorLanguageVersionAttribute("2.1")] +[assembly: Microsoft.AspNetCore.Razor.Hosting.RazorConfigurationNameAttribute("MVC-2.1")] +[assembly: Microsoft.AspNetCore.Razor.Hosting.RazorExtensionAssemblyNameAttribute("MVC-2.1", "Microsoft.AspNetCore.Mvc.Razor.Extensions")] diff --git a/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.csproj.FileListAbsolute.txt b/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..ec4d607 --- /dev/null +++ b/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.csproj.FileListAbsolute.txt @@ -0,0 +1,20 @@ +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\bin\Release\netcoreapp2.1\linux-arm\libhostpolicy.so +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\bin\Release\netcoreapp2.1\linux-arm\libhostfxr.so +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\bin\Release\netcoreapp2.1\linux-arm\MyCore +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\bin\Release\netcoreapp2.1\linux-arm\MyCore.deps.json +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\bin\Release\netcoreapp2.1\linux-arm\MyCore.runtimeconfig.json +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\bin\Release\netcoreapp2.1\linux-arm\MyCore.runtimeconfig.dev.json +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\bin\Release\netcoreapp2.1\linux-arm\MyCore.dll +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\bin\Release\netcoreapp2.1\linux-arm\MyCore.pdb +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\bin\Release\netcoreapp2.1\linux-arm\MyCore.xml +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\MyCore.csprojAssemblyReference.cache +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\MyCore.csproj.CoreCompileInputs.cache +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\MyCore.RazorAssemblyInfo.cache +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\MyCore.RazorAssemblyInfo.cs +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\UserSecretsAssemblyInfo.cs +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\MyCore.AssemblyInfoInputs.cache +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\MyCore.AssemblyInfo.cs +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\MyCore.RazorTargetAssemblyInfo.cache +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\MyCore.dll +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\MyCore.xml +C:\Users\thoma\OneDrive\Documents\Travail\MyCore\MyCore\obj\Release\netcoreapp2.1\linux-arm\MyCore.pdb diff --git a/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.xml b/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.xml new file mode 100644 index 0000000..5e34a12 --- /dev/null +++ b/MyCore/obj/Release/netcoreapp2.1/linux-arm/MyCore.xml @@ -0,0 +1,29 @@ + + + + MyCore + + + + + Retrieve all SmartPrinterMessage + + + + + It's the method to post data from mqtt broker to Database (Thanks Rpi!) + + + + + It's a mqtt publish test ! :) + + + + + It's a test ! :) + + id test + + + diff --git a/MyCore/obj/Release/netcoreapp2.1/linux-arm/UserSecretsAssemblyInfo.cs b/MyCore/obj/Release/netcoreapp2.1/linux-arm/UserSecretsAssemblyInfo.cs new file mode 100644 index 0000000..cd663ea --- /dev/null +++ b/MyCore/obj/Release/netcoreapp2.1/linux-arm/UserSecretsAssemblyInfo.cs @@ -0,0 +1,10 @@ +//------------------------------------------------------------------------------ +// +// Généré par la classe MSBuild WriteCodeFragment. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: Microsoft.Extensions.Configuration.UserSecrets.UserSecretsIdAttribute("6d53b0c4-74d6-41aa-8816-2ec3cf42767a")] diff --git a/MyCore/obj/netcoreapp2.1/linux-arm/host/MyCore b/MyCore/obj/netcoreapp2.1/linux-arm/host/MyCore new file mode 100644 index 0000000..7d4f93e Binary files /dev/null and b/MyCore/obj/netcoreapp2.1/linux-arm/host/MyCore differ diff --git a/RPI Code/BME280/bme280.py b/RPI Code/BME280/bme280.py new file mode 100644 index 0000000..dc48b8c --- /dev/null +++ b/RPI Code/BME280/bme280.py @@ -0,0 +1,172 @@ +#!/usr/bin/python +#-------------------------------------- +# ___ ___ _ ____ +# / _ \/ _ \(_) __/__ __ __ +# / , _/ ___/ /\ \/ _ \/ // / +# /_/|_/_/ /_/___/ .__/\_, / +# /_/ /___/ +# +# bme280.py +# Read data from a digital pressure sensor. +# +# Official datasheet available from : +# https://www.bosch-sensortec.com/bst/products/all_products/bme280 +# +# Author : Matt Hawkins +# Date : 25/07/2016 +# +# http://www.raspberrypi-spy.co.uk/ +# +#-------------------------------------- +import smbus +import time +from ctypes import c_short +from ctypes import c_byte +from ctypes import c_ubyte + +DEVICE = 0x76 # Default device I2C address + + +bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1 + # Rev 1 Pi uses bus 0 + +def getShort(data, index): + # return two bytes from data as a signed 16-bit value + return c_short((data[index+1] << 8) + data[index]).value + +def getUShort(data, index): + # return two bytes from data as an unsigned 16-bit value + return (data[index+1] << 8) + data[index] + +def getChar(data,index): + # return one byte from data as a signed char + result = data[index] + if result > 127: + result -= 256 + return result + +def getUChar(data,index): + # return one byte from data as an unsigned char + result = data[index] & 0xFF + return result + +def readBME280ID(addr=DEVICE): + # Chip ID Register Address + REG_ID = 0xD0 + (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2) + return (chip_id, chip_version) + +def readBME280All(addr=DEVICE): + # Register Addresses + REG_DATA = 0xF7 + REG_CONTROL = 0xF4 + REG_CONFIG = 0xF5 + + REG_CONTROL_HUM = 0xF2 + REG_HUM_MSB = 0xFD + REG_HUM_LSB = 0xFE + + # Oversample setting - page 27 + OVERSAMPLE_TEMP = 2 + OVERSAMPLE_PRES = 2 + MODE = 1 + + # Oversample setting for humidity register - page 26 + OVERSAMPLE_HUM = 2 + bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM) + + control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE + bus.write_byte_data(addr, REG_CONTROL, control) + + # Read blocks of calibration data from EEPROM + # See Page 22 data sheet + cal1 = bus.read_i2c_block_data(addr, 0x88, 24) + cal2 = bus.read_i2c_block_data(addr, 0xA1, 1) + cal3 = bus.read_i2c_block_data(addr, 0xE1, 7) + + # Convert byte data to word values + dig_T1 = getUShort(cal1, 0) + dig_T2 = getShort(cal1, 2) + dig_T3 = getShort(cal1, 4) + + dig_P1 = getUShort(cal1, 6) + dig_P2 = getShort(cal1, 8) + dig_P3 = getShort(cal1, 10) + dig_P4 = getShort(cal1, 12) + dig_P5 = getShort(cal1, 14) + dig_P6 = getShort(cal1, 16) + dig_P7 = getShort(cal1, 18) + dig_P8 = getShort(cal1, 20) + dig_P9 = getShort(cal1, 22) + + dig_H1 = getUChar(cal2, 0) + dig_H2 = getShort(cal3, 0) + dig_H3 = getUChar(cal3, 2) + + dig_H4 = getChar(cal3, 3) + dig_H4 = (dig_H4 << 24) >> 20 + dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F) + + dig_H5 = getChar(cal3, 5) + dig_H5 = (dig_H5 << 24) >> 20 + dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F) + + dig_H6 = getChar(cal3, 6) + + # Wait in ms (Datasheet Appendix B: Measurement time and current calculation) + wait_time = 1.25 + (2.3 * OVERSAMPLE_TEMP) + ((2.3 * OVERSAMPLE_PRES) + 0.575) + ((2.3 * OVERSAMPLE_HUM)+0.575) + time.sleep(wait_time/1000) # Wait the required time + + # Read temperature/pressure/humidity + data = bus.read_i2c_block_data(addr, REG_DATA, 8) + pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4) + temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4) + hum_raw = (data[6] << 8) | data[7] + + #Refine temperature + var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11 + var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14 + t_fine = var1+var2 + temperature = float(((t_fine * 5) + 128) >> 8); + + # Refine pressure and adjust for temperature + var1 = t_fine / 2.0 - 64000.0 + var2 = var1 * var1 * dig_P6 / 32768.0 + var2 = var2 + var1 * dig_P5 * 2.0 + var2 = var2 / 4.0 + dig_P4 * 65536.0 + var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0 + var1 = (1.0 + var1 / 32768.0) * dig_P1 + if var1 == 0: + pressure=0 + else: + pressure = 1048576.0 - pres_raw + pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1 + var1 = dig_P9 * pressure * pressure / 2147483648.0 + var2 = pressure * dig_P8 / 32768.0 + pressure = pressure + (var1 + var2 + dig_P7) / 16.0 + + # Refine humidity + humidity = t_fine - 76800.0 + humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity))) + humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0) + if humidity > 100: + humidity = 100 + elif humidity < 0: + humidity = 0 + + return temperature/100.0,pressure/100.0,humidity + +def main(): + + (chip_id, chip_version) = readBME280ID() + print ("Chip ID :", chip_id) + print ("Version :", chip_version) + + temperature,pressure,humidity = readBME280All() + + print ("Temperature : ", temperature, "C") + print ("Pressure : ", pressure, "hPa") + print ("Humidity : ", humidity, "%") + +if __name__=="__main__": + main() diff --git a/RPI Code/MQ-2/test-mq2.py b/RPI Code/MQ-2/test-mq2.py new file mode 100644 index 0000000..48405f4 --- /dev/null +++ b/RPI Code/MQ-2/test-mq2.py @@ -0,0 +1,5 @@ +import RPi.GPIO as GPIO +GPIO.setmode(GPIO.BCM) +GPIO.setup(4, GPIO.IN) + +print GPIO.input(4) diff --git a/RPI Code/Mqtt_To_Http/mqtt_to_http.py b/RPI Code/Mqtt_To_Http/mqtt_to_http.py new file mode 100644 index 0000000..ca1a4bf --- /dev/null +++ b/RPI Code/Mqtt_To_Http/mqtt_to_http.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +import requests +import signal +import time +import json +import paho.mqtt.client as mqtt + +broker="localhost" +#username="oilkfgjy" +#password="lEyZb90q49Rf" + +# defining the api-endpoint +API_ENDPOINT = 'http://192.168.0.17:3000/api/iot/0' + +delay = 5000 + +mqttc = mqtt.Client('Mqtt_To_Http_Interceptor') +#mqttc.username_pw_set(username, password) + +mqttc.connect(broker, 1883) + +TOKEN_URL = 'http://192.168.0.17:3000/api/token?username=Thomas&password=MonsieurMagic' + +r = requests.post(TOKEN_URL) + +if r.status_code == 200 : + token = r.text + print('we have a token!') + +hed = {'Authorization': "Bearer " + token +"f", 'Content-Type': "application/json"} +print(hed) + +def on_message(mosq, obj, msg): + print(msg.topic) + + if msg.topic == '3DPrinterSensors' : + print(str(msg.payload, "utf-8")) + print(API_ENDPOINT) + # Add increment and test = if data length >= 10, push to DB via Http + # Add Verification on token.. if status code == 401 forbidden then get token and call again the service + + jsonData = json.dumps([{'Time': '14/04/19', 'Temperature': 26.5, 'Pressure': 1004.3, 'Smoke': 100}]) + anotherR = requests.post(API_ENDPOINT,data=jsonData, headers=hed) + print (anotherR.text) + print(anotherR.status_code) + + # Extracting data in json format + #data = r.json() + + elif msg.topic == 'SmartGarden' : + print(str(msg.payload, "utf-8")) + + # data to be sent to api + data = {'api_dev_key':'', + 'api_option':'paste', + 'api_paste_code':source_code, + 'api_paste_format':'python'} + + + # sending post request and saving response as response object + r = requests.post(url = API_ENDPOINT, data = data) + + # extracting response text + pastebin_url = r.text + print("The pastebin URL is:%s"%pastebin_url) + else: + print("Unknown topic") + + +mqttc.on_message=on_message +##### +print("connecting to broker ",broker) +mqttc.loop_start() #start loop to process received messages +print("subscribing ") +mqttc.subscribe("SmartGarden")#subscribe +mqttc.subscribe("3DPrinterSensors")#subscribe + + +signal.pause() +mqttc.loop_forever() + + diff --git a/RPI Code/SmartGarden/ADS1x15Test.py b/RPI Code/SmartGarden/ADS1x15Test.py new file mode 100644 index 0000000..ce84988 --- /dev/null +++ b/RPI Code/SmartGarden/ADS1x15Test.py @@ -0,0 +1,53 @@ +# Simple demo of reading each analog input from the ADS1x15 and printing it to +# the screen. +# Author: Tony DiCola +# License: Public Domain +import time + +# Import the ADS1x15 module. +import Adafruit_ADS1x15 + + +# Create an ADS1115 ADC (16-bit) instance. +adc = Adafruit_ADS1x15.ADS1115() + +# Or create an ADS1015 ADC (12-bit) instance. +#adc = Adafruit_ADS1x15.ADS1015() + +# Note you can change the I2C address from its default (0x48), and/or the I2C +# bus by passing in these optional parameters: +#adc = Adafruit_ADS1x15.ADS1015(address=0x49, busnum=1) + +# Choose a gain of 1 for reading voltages from 0 to 4.09V. +# Or pick a different gain to change the range of voltages that are read: +# - 2/3 = +/-6.144V +# - 1 = +/-4.096V +# - 2 = +/-2.048V +# - 4 = +/-1.024V +# - 8 = +/-0.512V +# - 16 = +/-0.256V +# See table 3 in the ADS1015/ADS1115 datasheet for more info on gain. +GAIN = 1 + +print('Reading ADS1x15 values, press Ctrl-C to quit...') +# Print nice channel column headers. +print('| {0:>6} | {1:>6} | {2:>6} | {3:>6} |'.format(*range(4))) +print('-' * 37) +# Main loop. +while True: + # Read all the ADC channel values in a list. + values = [0]*4 + for i in range(4): + # Read the specified ADC channel using the previously set gain value. + values[i] = adc.read_adc(i, gain=GAIN) + # Note you can also pass in an optional data_rate parameter that controls + # the ADC conversion time (in samples/second). Each chip has a different + # set of allowed data rate values, see datasheet Table 9 config register + # DR bit values. + #values[i] = adc.read_adc(i, gain=GAIN, data_rate=128) + # Each value will be a 12 or 16 bit signed integer value depending on the + # ADC (ADS1015 = 12-bit, ADS1115 = 16-bit). + # Print the ADC values. + print('| {0:>6} | {1:>6} | {2:>6} | {3:>6} |'.format(*values)) + # Pause for half a second. + time.sleep(0.5) diff --git a/RPI Code/SmartGarden/Relay.py b/RPI Code/SmartGarden/Relay.py new file mode 100644 index 0000000..4b38920 --- /dev/null +++ b/RPI Code/SmartGarden/Relay.py @@ -0,0 +1,38 @@ +import RPi.GPIO as GPIO +import time +GPIO.setmode(GPIO.BCM) # GPIO Numbers instead of board numbers +RELAIS_1_GPIO = 27 +GPIO.setup(RELAIS_1_GPIO, GPIO.OUT) # GPIO Assign mode + +# here you would put all your code for setting up GPIO, +# we'll cover that tomorrow +# initial values of variables etc... +counter = 0 + +try: + # here you put your main loop or block of code + while True: + # count up to 9000000 - takes ~20s + time.sleep(3) + print ("Hellooooo") + if counter % 2 ==0: + GPIO.output(RELAIS_1_GPIO, GPIO.LOW) # out + else: + GPIO.output(RELAIS_1_GPIO, GPIO.HIGH) # out + + counter += 1 + print ("Target reached: %d" % counter) + +except KeyboardInterrupt: + # here you put any code you want to run before the program + # exits when you press CTRL+C + print ("\n", counter) # print value of counter + +except: + # this catches ALL other exceptions including errors. + # You won't get any error messages for debugging + # so only use it once your code is working + print ("Other error or exception occurred!") + +finally: + GPIO.cleanup() # this ensures a clean exit diff --git a/RPI Code/SmartGarden/allInOne.py b/RPI Code/SmartGarden/allInOne.py new file mode 100644 index 0000000..b0f1786 --- /dev/null +++ b/RPI Code/SmartGarden/allInOne.py @@ -0,0 +1,261 @@ +import smbus +import time +import json +from ctypes import c_short +from ctypes import c_byte +from ctypes import c_ubyte +import paho.mqtt.client as mqtt +import socket + +broker="localhost" +#username="oilkfgjy" +#password="lEyZb90q49Rf" + +mqttc = mqtt.Client("SmartGarden_PiZero") +#mqttc.username_pw_set(username, password) + + +DEVICE = 0x76 # Default device I2C address + + +bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3ses bus 1 + # Rev 1 Pi uses bus 0 + +def get_ip_address(): + ip_address = ''; + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(("8.8.8.8",80)) + ip_address = s.getsockname()[0] + s.close() + return ip_address + +def getShort(data, index): + # return two bytes from data as a signed 16-bit value + return c_short((data[index+1] << 8) + data[index]).value + +def getUShort(data, index): + # return two bytes from data as an unsigned 16-bit value + return (data[index+1] << 8) + data[index] + +def getChar(data,index): + # return one byte from data as a signed char + result = data[index] + if result > 127: + result -= 256 + return result + +def getUChar(data,index): + # return one byte from data as an unsigned char + result = data[index] & 0xFF + return result + +def readBME280ID(addr=DEVICE): + # Chip ID Register Address + REG_ID = 0xD0 + (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2) + return (chip_id, chip_version) + +def readBME280All(addr=DEVICE): + # Register Addresses + REG_DATA = 0xF7 + REG_CONTROL = 0xF4 + REG_CONFIG = 0xF5 + + REG_CONTROL_HUM = 0xF2 + REG_HUM_MSB = 0xFD + REG_HUM_LSB = 0xFE + + # Oversample setting - page 27 + OVERSAMPLE_TEMP = 2 + OVERSAMPLE_PRES = 2 + MODE = 1 + + # Oversample setting for humidity register - page 26 + OVERSAMPLE_HUM = 2 + bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM) + + control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE + bus.write_byte_data(addr, REG_CONTROL, control) + + # Read blocks of calibration data from EEPROM + # See Page 22 data sheet + cal1 = bus.read_i2c_block_data(addr, 0x88, 24) + cal2 = bus.read_i2c_block_data(addr, 0xA1, 1) + cal3 = bus.read_i2c_block_data(addr, 0xE1, 7) + + # Convert byte data to word values + dig_T1 = getUShort(cal1, 0) + dig_T2 = getShort(cal1, 2) + dig_T3 = getShort(cal1, 4) + + dig_P1 = getUShort(cal1, 6) + dig_P2 = getShort(cal1, 8) + dig_P3 = getShort(cal1, 10) + dig_P4 = getShort(cal1, 12) + dig_P5 = getShort(cal1, 14) + dig_P6 = getShort(cal1, 16) + dig_P7 = getShort(cal1, 18) + dig_P8 = getShort(cal1, 20) + dig_P9 = getShort(cal1, 22) + + dig_H1 = getUChar(cal2, 0) + dig_H2 = getShort(cal3, 0) + dig_H3 = getUChar(cal3, 2) + + dig_H4 = getChar(cal3, 3) + dig_H4 = (dig_H4 << 24) >> 20 + dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F) + + dig_H5 = getChar(cal3, 5) + dig_H5 = (dig_H5 << 24) >> 20 + dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F) + + dig_H6 = getChar(cal3, 6) + + # Wait in ms (Datasheet Appendix B: Measurement time and current calculation) + wait_time = 1.25 + (2.3 * OVERSAMPLE_TEMP) + ((2.3 * OVERSAMPLE_PRES) + 0.575) + ((2.3 * OVERSAMPLE_HUM)+0.575) + time.sleep(wait_time/1000) # Wait the required time + + # Read temperature/pressure/humidity + data = bus.read_i2c_block_data(addr, REG_DATA, 8) + pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4) + temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4) + hum_raw = (data[6] << 8) | data[7] + + #Refine temperature + var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11 + var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14 + t_fine = var1+var2 + temperature = float(((t_fine * 5) + 128) >> 8); + + # Refine pressure and adjust for temperature + var1 = t_fine / 2.0 - 64000.0 + var2 = var1 * var1 * dig_P6 / 32768.0 + var2 = var2 + var1 * dig_P5 * 2.0 + var2 = var2 / 4.0 + dig_P4 * 65536.0 + var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0 + var1 = (1.0 + var1 / 32768.0) * dig_P1 + if var1 == 0: + pressure=0 + else: + pressure = 1048576.0 - pres_raw + pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1 + var1 = dig_P9 * pressure * pressure / 2147483648.0 + var2 = pressure * dig_P8 / 32768.0 + pressure = pressure + (var1 + var2 + dig_P7) / 16.0 + + # Refine humidity + humidity = t_fine - 76800.0 + humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity))) + humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0) + if humidity > 100: + humidity = 100 + elif humidity < 0: + humidity = 0 + + return temperature/100.0,pressure/100.0,humidity + +import time + +# Import the ADS1x15 module. +import Adafruit_ADS1x15 +import RPi.GPIO as GPIO + +#################### HERE IS THE MAIN CODE #################### + +# Create an ADS1115 ADC (16-bit) instance. +adc = Adafruit_ADS1x15.ADS1115() + +# bus by passing in these optional parameters: +#adc = Adafruit_ADS1x15.ADS1015(address=0x49, busnum=1) + +# Choose a gain of 1 for reading voltages from 0 to 4.09V. +GAIN = 1 + +# GPIO Numbers instead of board numbers +GPIO.setmode(GPIO.BCM) +#Set the relay pin to 27 +RELAIS_1_GPIO = 27 +GPIO.setup(RELAIS_1_GPIO, GPIO.OUT) # GPIO Assign mode +GPIO.output(RELAIS_1_GPIO, GPIO.HIGH) + +def on_message(mosq, obj, msg): + print(str(msg.payload, "utf-8")) + d = json.loads(str(msg.payload, "utf-8")) + print (d['Irrigate']) + if d['Irrigate'] >= 2 : + print('Im irrigating ! :)') + GPIO.output(RELAIS_1_GPIO, GPIO.LOW) + time.sleep(int(d['Irrigate'])) + GPIO.output(RELAIS_1_GPIO, GPIO.HIGH) + else: + print("uncorrect payload") + +mqttc.connect(broker, 1883) + +mqttc.publish("IpAddress", get_ip_address()) + +mqttc.on_message=on_message + +mqttc.loop_start() #start loop to process received messages + +mqttc.subscribe("SmartGarden_WaterRelay")#subscribe + +print('Reading ADS1x15 values, press Ctrl-C to quit...') +# Print nice channel column headers. +print('| {0:>6} | {1:>6} | {2:>6} | {3:>6} |'.format(*range(4))) +print('-' * 37) +try: + # Main loop. + while True: + # Read all the ADC channel values in a list. + values = [0]*4 + for i in range(4): + # Read the specified ADC channel using the previously set gain value. + values[i] = adc.read_adc(i, gain=GAIN) + # Note you can also pass in an optional data_rate parameter that controls + # the ADC conversion time (in samples/second). Each chip has a different + # set of allowed data rate values, see datasheet Table 9 config register + # DR bit values. + #values[i] = adc.read_adc(i, gain=GAIN, data_rate=128) + # Each value will be a 12 or 16 bit signed integer value depending on the + # ADC (ADS1015 = 12-bit, ADS1115 = 16-bit). + # Print the ADC values. + + #print ("values[0] : ", values[0]) + + #if values[0] < 15000 : + # print ("I'm in") + # GPIO.output(RELAIS_1_GPIO, GPIO.LOW) + #else: + # print ("I'm in 2") + # GPIO.output(RELAIS_1_GPIO, GPIO.HIGH) + + temperature,pressure,humidity = readBME280All() + print('| {0:>6} | {1:>6} | {2:>6} | {3:>6} | '.format(*values), "Temperature : ", temperature, "C", " | Pressure : ", pressure, "hPa"," | Humidity : ", humidity, "%") + + valuesToSend = '{"Temperature": ' + str(temperature) + ', "Pressure": '+ str(pressure) +', "Humidity": ' + str(humidity) + ', "Water": ' + str(values[0]) + ', "Light": ' + str(values[1]) + '}' + + mqttc.publish("SmartGarden", valuesToSend) + #print ("Temperature : ", temperature, "C") + #print ("Pressure : ", pressure, "hPa") + #print ("Humidity : ", humidity, "%") + # Pause for ten seconds. + time.sleep(10) + +except KeyboardInterrupt: + # here you put any code you want to run before the program + # exits when you press CTRL+C + print ("It's a KeyboardInterrupt") + GPIO.output(RELAIS_1_GPIO, GPIO.HIGH) #ensure that the pump is close + +except: + # this catches ALL other exceptions including errors. + # You won't get any error messages for debugging + # so only use it once your code is working + print ("Other error or exception occurred!") + +finally: + GPIO.output(RELAIS_1_GPIO, GPIO.HIGH) #ensure that the pump is close + GPIO.cleanup() # this ensures a clean exit + diff --git a/RPI Code/SmartGarden/bme280.py b/RPI Code/SmartGarden/bme280.py new file mode 100644 index 0000000..dc48b8c --- /dev/null +++ b/RPI Code/SmartGarden/bme280.py @@ -0,0 +1,172 @@ +#!/usr/bin/python +#-------------------------------------- +# ___ ___ _ ____ +# / _ \/ _ \(_) __/__ __ __ +# / , _/ ___/ /\ \/ _ \/ // / +# /_/|_/_/ /_/___/ .__/\_, / +# /_/ /___/ +# +# bme280.py +# Read data from a digital pressure sensor. +# +# Official datasheet available from : +# https://www.bosch-sensortec.com/bst/products/all_products/bme280 +# +# Author : Matt Hawkins +# Date : 25/07/2016 +# +# http://www.raspberrypi-spy.co.uk/ +# +#-------------------------------------- +import smbus +import time +from ctypes import c_short +from ctypes import c_byte +from ctypes import c_ubyte + +DEVICE = 0x76 # Default device I2C address + + +bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1 + # Rev 1 Pi uses bus 0 + +def getShort(data, index): + # return two bytes from data as a signed 16-bit value + return c_short((data[index+1] << 8) + data[index]).value + +def getUShort(data, index): + # return two bytes from data as an unsigned 16-bit value + return (data[index+1] << 8) + data[index] + +def getChar(data,index): + # return one byte from data as a signed char + result = data[index] + if result > 127: + result -= 256 + return result + +def getUChar(data,index): + # return one byte from data as an unsigned char + result = data[index] & 0xFF + return result + +def readBME280ID(addr=DEVICE): + # Chip ID Register Address + REG_ID = 0xD0 + (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2) + return (chip_id, chip_version) + +def readBME280All(addr=DEVICE): + # Register Addresses + REG_DATA = 0xF7 + REG_CONTROL = 0xF4 + REG_CONFIG = 0xF5 + + REG_CONTROL_HUM = 0xF2 + REG_HUM_MSB = 0xFD + REG_HUM_LSB = 0xFE + + # Oversample setting - page 27 + OVERSAMPLE_TEMP = 2 + OVERSAMPLE_PRES = 2 + MODE = 1 + + # Oversample setting for humidity register - page 26 + OVERSAMPLE_HUM = 2 + bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM) + + control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE + bus.write_byte_data(addr, REG_CONTROL, control) + + # Read blocks of calibration data from EEPROM + # See Page 22 data sheet + cal1 = bus.read_i2c_block_data(addr, 0x88, 24) + cal2 = bus.read_i2c_block_data(addr, 0xA1, 1) + cal3 = bus.read_i2c_block_data(addr, 0xE1, 7) + + # Convert byte data to word values + dig_T1 = getUShort(cal1, 0) + dig_T2 = getShort(cal1, 2) + dig_T3 = getShort(cal1, 4) + + dig_P1 = getUShort(cal1, 6) + dig_P2 = getShort(cal1, 8) + dig_P3 = getShort(cal1, 10) + dig_P4 = getShort(cal1, 12) + dig_P5 = getShort(cal1, 14) + dig_P6 = getShort(cal1, 16) + dig_P7 = getShort(cal1, 18) + dig_P8 = getShort(cal1, 20) + dig_P9 = getShort(cal1, 22) + + dig_H1 = getUChar(cal2, 0) + dig_H2 = getShort(cal3, 0) + dig_H3 = getUChar(cal3, 2) + + dig_H4 = getChar(cal3, 3) + dig_H4 = (dig_H4 << 24) >> 20 + dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F) + + dig_H5 = getChar(cal3, 5) + dig_H5 = (dig_H5 << 24) >> 20 + dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F) + + dig_H6 = getChar(cal3, 6) + + # Wait in ms (Datasheet Appendix B: Measurement time and current calculation) + wait_time = 1.25 + (2.3 * OVERSAMPLE_TEMP) + ((2.3 * OVERSAMPLE_PRES) + 0.575) + ((2.3 * OVERSAMPLE_HUM)+0.575) + time.sleep(wait_time/1000) # Wait the required time + + # Read temperature/pressure/humidity + data = bus.read_i2c_block_data(addr, REG_DATA, 8) + pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4) + temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4) + hum_raw = (data[6] << 8) | data[7] + + #Refine temperature + var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11 + var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14 + t_fine = var1+var2 + temperature = float(((t_fine * 5) + 128) >> 8); + + # Refine pressure and adjust for temperature + var1 = t_fine / 2.0 - 64000.0 + var2 = var1 * var1 * dig_P6 / 32768.0 + var2 = var2 + var1 * dig_P5 * 2.0 + var2 = var2 / 4.0 + dig_P4 * 65536.0 + var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0 + var1 = (1.0 + var1 / 32768.0) * dig_P1 + if var1 == 0: + pressure=0 + else: + pressure = 1048576.0 - pres_raw + pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1 + var1 = dig_P9 * pressure * pressure / 2147483648.0 + var2 = pressure * dig_P8 / 32768.0 + pressure = pressure + (var1 + var2 + dig_P7) / 16.0 + + # Refine humidity + humidity = t_fine - 76800.0 + humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity))) + humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0) + if humidity > 100: + humidity = 100 + elif humidity < 0: + humidity = 0 + + return temperature/100.0,pressure/100.0,humidity + +def main(): + + (chip_id, chip_version) = readBME280ID() + print ("Chip ID :", chip_id) + print ("Version :", chip_version) + + temperature,pressure,humidity = readBME280All() + + print ("Temperature : ", temperature, "C") + print ("Pressure : ", pressure, "hPa") + print ("Humidity : ", humidity, "%") + +if __name__=="__main__": + main()