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()