INF1510
Cyberplant
Tekniskdokumentasjon
Luna Wei Shen (lunas) Herman Loennechen (hermanlo)Victor Risopatron (victori)
The Faculty of Mathematics and Natural SciencesUniversity of Oslo
Norway
Innhold1 Innledning 4
2 Video 4
3 Teknisk dokumentasjon av Cyberplant 43.1 Komponenter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.2 Funksjoner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4 Kode 54.1 Arduinokode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
5 Skjemaer og Datasheets 115.1 Arduino Nano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115.2 ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125.3 TSL2561 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125.4 WS2812b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135.5 YL-69 og YL-38 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145.6 TMP36(GZ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
INF1510 Cyberplant Teknisk Dokumentasjon
1 Innledning
Målet for prosjektet er å lage et produkt til vår målgruppe med problemstillingen"Hvordan kan vi hjelpe hobbygartnere med overvåkning av plantenes helse og inn-samling av plantedata?". Vår målgruppe ønsker en artifakt som kan hjelpe han medhage arbeidet og vårt mål er å lage en teknisk løsning som kan hjelpe han. Prototy-pen vår vil hjelpe vår målgruppe å se hvordan planten har det med tanke på vann,temperatur og lys til enhver tid og bidra med å gi han informasjon til hva som mågjøres for å gi planten bedre leveforhold.
2 Video
Videoen viser utviklingen av Cyberplant fra tidlig konsept til den endelige prototypen,1.gangsinteraksjon av målgruppe og demonstrasjon av funksjonene.
Videolink: https://www.youtube.com/watch?v=sUky9X-d9wo&feature=youtu.be
3 Teknisk dokumentasjon av Cyberplant
Figur 1: Oppkobling av krets
4
INF1510 Cyberplant Teknisk Dokumentasjon
3.1 Komponenter
Arduino Nano
ESP8266/ESP12e/NodeMCU dev board
Lux-sensor TSL2561
WS2812b LED-strip 8stk
Soil Moisture Sensor YL-69
Soil Moisture Sensor kontroller YL-38
Temperature sensor TMP36 (36GZ)
6V driftspenning via 2 stk 3V CR2 lithium batterier.
3.2 Funksjoner
Cyberplant har følgende funksjoner:
Lyssensor fra 0-17000 Lux med varsling via LED-lys.
Temperatursensor fra -55°C til 150°C med varsling via LED-lys.
Jordfuktighet/humidity med varsling via LED-lys.
Støtte for seriell dataoverføring via kabel eller WiFi.
6-10 Volts driftspenning.
4 Kode
4.1 Arduinokode
Listing 1: Some Code
#inc lude <Wire . h>#inc lude <Adafruit_Sensor . h>#inc lude <Adafruit_TSL2561_U . h>#inc lude <Adafruit_NeoPixel . h>
byte humidity_sensor_pin = A1 ;byte humidity_sensor_vcc = 6 ;i n t tempPin = A2 ;i n t PIN = 7 ;i n t totalLEDs = 8 ;i n t de l ayva l = 250 ;i n t va l = 0 ; // t e s t v a l u e hum senso r to w i f i module
Adafruit_NeoPixel l e d s = Adafruit_NeoPixel ( totalLEDs , PIN ,↪→ NEO_GRB + NEO_KHZ800) ;
Adafruit_TSL2561_Unified t s l = Adafruit_TSL2561_Unified (↪→ TSL2561_ADDR_FLOAT, 12345) ;
void setup ( ) {
// Setup S e r i a lwhi l e ( ! S e r i a l ) ;
5
INF1510 Cyberplant Teknisk Dokumentasjon
de lay (1000) ;S e r i a l . begin (9600) ;
// I n i t i a l i s e LEDsl ed s . begin ( ) ;l e d s . s e tBr i gh tne s s (50) ; // s e t s l e d s to s t r ength value
↪→ between 0−255l ed s . show ( ) ; // I n i t i a l i z e a l l p i x e l s to ’ o f f ’
// I n i t i a l i s e the humidity s enso r boardpinMode ( humidity_sensor_vcc , OUTPUT) ;d i g i t a lWr i t e ( humidity_sensor_vcc , LOW) ;
// I n i t i a l i s e the LUX−s enso r// I n i t i a l i s e the s enso ri f ( ! t s l . beg in ( ) ){
// Problem de t e c t i ng the TSL2561S e r i a l . p r i n t ("No TSL2561 detec ted ") ;whi l e (1 ) ;
}
// Display some bas i c in fo rmat ion on t h i s s enso rd i s p l aySen s o rDe t a i l s ( ) ;// Setup the s enso r gain and i n t e g r a t i o n timecon f i gu r eSenso r ( ) ;
S e r i a l . p r i n t l n ("") ;
}
i n t read_humidity_sensor ( ) {d i g i t a lWr i t e ( humidity_sensor_vcc , HIGH) ;de lay (250) ;i n t va lue = analogRead ( humidity_sensor_pin ) ;d i g i t a lWr i t e ( humidity_sensor_vcc , LOW) ;i n t humidity = 1023 − value ;
// Super dry 0−50i f ( humidity <= 50) {
de lay (500) ;l e d s . s e tP ix e lCo l o r (4 , 245 , 60 , 5) ; // orangel e d s . s e tP ix e lCo l o r (5 , 245 , 60 , 5) ; // orangel e d s . s e tP ix e lCo l o r (6 , 245 , 60 , 5) ; // orangel e d s . s e tP ix e lCo l o r (7 , 245 , 60 , 5) ; // orange
}// Dry 50 − 150i f ( humidity > 50 && humidity < 150) {
de lay (500) ;l e d s . s e tP ix e lCo l o r (4 , 245 , 60 , 5) ; // orangel e d s . s e tP ix e lCo l o r (5 , 245 , 60 , 5) ; // orangel e d s . s e tP ix e lCo l o r (6 , 190 , 0 , 250) ; // purplel e d s . s e tP ix e lCo l o r (7 ,190 , 0 , 250) ; // purple
}
// Need water
6
INF1510 Cyberplant Teknisk Dokumentasjon
i f ( humidity > 150 && humidity < 300) {de lay (500) ;l e d s . s e tP i x e lCo l o r (4 , 190 , 0 , 250) ; // purplel e d s . s e tP i x e lCo l o r (5 , 190 , 0 , 250) ; // purplel e d s . s e tP i x e lCo l o r (6 , 190 , 0 , 250) ; // purplel e d s . s e tP i x e lCo l o r (7 , 0 , 0 , 150) ; // blue
}
// humid 300−500i f ( humidity > 300 && humidity < 500) {
de lay (500) ;l e d s . s e tP i x e lCo l o r (4 , 190 , 0 , 250) ; // purplel e d s . s e tP i x e lCo l o r (5 , 190 , 0 , 250) ; // purplel e d s . s e tP i x e lCo l o r (6 , 0 , 0 , 150) ; // bluel e d s . s e tP i x e lCo l o r (7 , 0 , 0 , 150) ; // blue
}
// so watery 500−600i f ( humidity > 500 && humidity < 600) {
de lay (500) ;l e d s . s e tP i x e lCo l o r (4 , 190 , 0 , 250) ; // purplel e d s . s e tP i x e lCo l o r (5 , 0 , 0 , 150) ; // bluel e d s . s e tP i x e lCo l o r (6 , 0 , 0 , 150) ; ; / / bluel e d s . s e tP i x e lCo l o r (7 , 0 , 0 , 150) ; // blue
}
// Fu l l 600−850i f ( humidity > 600 && humidity < 850) {
de lay (500) ;l e d s . s e tP i x e lCo l o r (4 , 0 , 0 , 150) ; // purplel e d s . s e tP i x e lCo l o r (5 , 0 , 0 , 150) ; // bluel e d s . s e tP i x e lCo l o r (6 , 0 , 0 , 150) ; ; / / bluel e d s . s e tP i x e lCo l o r (7 , 0 , 0 , 150) ; // blue
}
// submerged in water (MAX) 850+i f ( humidity >= 850) {
de lay (500) ;l e d s . s e tP i x e lCo l o r (4 , 255 , 0 , 0) ; // Redl ed s . s e tP i x e lCo l o r (5 , 190 , 0 , 250) ; // purplel e d s . s e tP i x e lCo l o r (6 , 0 , 0 , 255) ; // bluel e d s . s e tP i x e lCo l o r (7 , 0 , 0 , 255) ; // blue
}
return 1023 − value ;}
i n t read_temperature ( ) {// g e t t i n g the vo l tage read ing from the temperature s enso r
i n t read ing = analogRead ( tempPin ) ;// conver t ing that read ing to vo l tage , f o r 3 . 3 v arduino use
↪→ 3 .3f l o a t vo l t age = read ing ∗ 5 . 0 ;vo l tage /= 1024 . 0 ;
// p r i n t out the vo l tage// S e r i a l . p r i n t ( vo l tage ) ; S e r i a l . p r i n t l n (" v o l t s ") ;
7
INF1510 Cyberplant Teknisk Dokumentasjon
// now pr in t out the temperaturef l o a t temperatureC = ( vo l tage − 0 . 5 ) ∗ 100 ; // conver t ing
↪→ from 10 mv per degree wit 500 mV o f f s e t// to degree s
↪→ ( (↪→ vo l tage↪→ − 500mV)↪→ t imes↪→ 100)
S e r i a l . p r i n t ( temperatureC ) ;
i f ( temperatureC < 10 . 0 ) {l e d s . s e tP ix e lCo l o r (0 , 0 , 0 , 255) ; // temp too low − blue
}
e l s e i f ( temperatureC > 32 . 0 ) {l e d s . s e tP ix e lCo l o r (0 , 255 , 0 , 0) ; // temp too high − red
}
e l s e {l e d s . s e tP ix e lCo l o r (0 , 0 , 255 , 0) ; // good temp − green
}
}
void d i s p l aySen s o rDe t a i l s ( void ){
sensor_t senso r ;t s l . ge tSensor (&senso r ) ;S e r i a l . p r i n t l n("−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−");S e r i a l . p r i n t (" Sensor : ") ; S e r i a l . p r i n t l n ( s enso r .
↪→ name) ;S e r i a l . p r i n t (" Driver Ver : ") ; S e r i a l . p r i n t l n ( s enso r .
↪→ ve r s i on ) ;S e r i a l . p r i n t (" Unique ID : ") ; S e r i a l . p r i n t l n ( s enso r .
↪→ sensor_id ) ;S e r i a l . p r i n t ("Max Value : ") ; S e r i a l . p r i n t ( s enso r .
↪→ max_value ) ; S e r i a l . p r i n t l n (" lux ") ;S e r i a l . p r i n t ("Min Value : ") ; S e r i a l . p r i n t ( s enso r .
↪→ min_value ) ; S e r i a l . p r i n t l n (" lux ") ;S e r i a l . p r i n t (" Reso lut ion : ") ; S e r i a l . p r i n t ( s enso r .
↪→ r e s o l u t i o n ) ; S e r i a l . p r i n t l n (" lux ") ;S e r i a l . p r i n t l n("−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−");S e r i a l . p r i n t l n ("") ;de lay (500) ;
}
// Conf igures the gain and i n t e g r a t i o n time f o r the TSL2561
void con f i gu r eSen so r ( void ){
// You can a l s o manually s e t the gain or enable auto−gain↪→ support
// t s l . setGain (TSL2561_GAIN_1X) ; // No gain . . . use in↪→ br i gh t l i g h t to avoid senso r s a tu ra t i on
// t s l . setGain (TSL2561_GAIN_16X) ; // 16x gain . . . use↪→ in low l i g h t to boost s e n s i t i v i t y
8
INF1510 Cyberplant Teknisk Dokumentasjon
t s l . enableAutoRange ( t rue ) ; // Auto−gain . . .↪→ sw i t che s automat i ca l l y between 1x and 16x
// Changing the i n t e g r a t i o n time g i v e s you be t t e r s enso r↪→ r e s o l u t i o n (402ms = 16−b i t data )
t s l . s e t Integrat i onTime (TSL2561_INTEGRATIONTIME_13MS) ;↪→ // f a s t but low r e s o l u t i o n
// t s l . s e t Integrat i onTime (TSL2561_INTEGRATIONTIME_101MS) ;↪→ // medium r e s o l u t i o n and speed
// t s l . s e t Integrat i onTime (TSL2561_INTEGRATIONTIME_402MS) ;↪→ // 16−b i t data but s l owes t conve r s i on s
// Update these va lue s depending on what you ’ ve s e t above !S e r i a l . p r i n t l n("−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−");S e r i a l . p r i n t ("Gain : ") ; S e r i a l . p r i n t l n ("Auto") ;S e r i a l . p r i n t ("Timing : ") ; S e r i a l . p r i n t l n ("13 ms") ;S e r i a l . p r i n t l n("−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−");
}
void loop ( ) {
l e d s . show ( ) ; // This sends the updated p i x e l c o l o r to the↪→ hardware .
de lay ( de l ayva l ) ; // Delay f o r a per iod o f time ( in↪→ mi l l i s e c ond s ) .
// Get a new senso r eventsensors_event_t event ;t s l . getEvent(&event ) ;
// Display the r e s u l t s ( l i g h t i s measured in lux )i f ( event . l i g h t ){
S e r i a l . p r i n t (" I l luminance : ") ;S e r i a l . p r i n t ( event . l i g h t ) ;S e r i a l . p r i n t l n (" lux ") ;
}e l s e{
// I f event . l i g h t = 0 lux , no r e l i a b l e data from senso r (↪→ s a tu ra t i on )
S e r i a l . p r i n t l n (" Sensor over load ") ;}
i f ( event . l i g h t < 10 .0 && event . l i g h t != 0) {l ed s . s e tP i x e lCo l o r (1 , 0 , 0 , 255) ; // not enough l i g h t / n ight
↪→ time − blue}
i f ( event . l i g h t > 10 && event . l i g h t < 100 .0 ) {l e d s . s e tP i x e lCo l o r (1 , 190 , 0 , 250) ; // not enough l i g h t −
↪→ purple}
i f ( event . l i g h t > 100 && event . l i g h t < 10000 .0 ) {l e d s . s e tP i x e lCo l o r (1 , 0 , 250 ,0) ; //good s h i t − green
9
INF1510 Cyberplant Teknisk Dokumentasjon
}
i f ( event . l i g h t > 10000 && event . l i g h t <= 17000 .0 ) {l e d s . s e tP ix e lCo l o r (1 , 250 , 0 ,0) ; // too much − red
}
S e r i a l . p r i n t (" Humidity (0−1023) : ") ;S e r i a l . p r i n t l n ( read_humidity_sensor ( ) ) ;S e r i a l . p r i n t (" Temperature : ") ;S e r i a l . p r i n t ( read_temperature ( ) ) ;S e r i a l . p r i n t l n (" C") ;de lay (1000) ;
}
10
INF1510 Cyberplant Teknisk Dokumentasjon
5 Skjemaer og Datasheets
5.1 Arduino Nano
Datasheet: https://www.arduino.cc/en/uploads/Main/ArduinoNanoManual23.pdf
Figur 2: Skjema 1
Figur 3: Skjema 2
11
INF1510 Cyberplant Teknisk Dokumentasjon
5.2 ESP8266
Datasheet: http://download.arduino.org/products/UNOWIFI/0A-ESP8266-Datasheet-EN-v4.3.pdf
Figur 4: ESP8266 PIN out
5.3 TSL2561
Datasheet: https://cdn-shop.adafruit.com/datasheets/TSL2561.pdf
Figur 5: TSL2561 Lux-sensor skjema
12
INF1510 Cyberplant Teknisk Dokumentasjon
5.4 WS2812b
Datasheet: https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf
Figur 6: WS2812b
13
INF1510 Cyberplant Teknisk Dokumentasjon
5.5 YL-69 og YL-38
Figur 7: YL69 og YL-38
5.6 TMP36(GZ)
Datasheet: http://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf
Figur 8: TMP36-sensor skjema
14