Arduino Green House Code


SUBMITTED BY: spinka

DATE: June 26, 2021, 9:13 a.m.

FORMAT: Text only

SIZE: 13.9 kB

HITS: 23939

  1. /*
  2. ############################################################
  3. # File: Arduino_GreenHouse_Controling_sustem.ino #
  4. # Processor: Arduino UNO, MEGA #
  5. # Language: Wiring / C / Arduino IDE #
  6. # Objectives: Heating - Aeration - Irrigation #
  7. # Behavior: Event when the temperature is low #
  8. # or high and the soil is dry #
  9. # Note: 1.8 TFT LCD 128160 #
  10. # DHT-22 Sensor of Temperature and Humitide #
  11. # Sensor Temperature and Humidity External #
  12. # Soil Moisture Sensor and Hygrometer Module #
  13. # Potentiometer1 change limit Moisture #
  14. # Potentiometer2 change limit Temperature #
  15. # Relay1_AirIn to Blower Fan IN #
  16. # Relay2_AirOut to Blower Fan OUT #
  17. # Relay3_Lamp to Hot Lamp #
  18. # Relay4_Water to Water Pump #
  19. # #
  20. # Author: Billy Gkekas #
  21. # Date: Saturday, 29-10-2018 #
  22. # place: Greece, Ptolemaida #
  23. # #
  24. # This project contains public domain code. #
  25. # The modification is allowed without notice. #
  26. ############################################################
  27. */
  28. // DHT22
  29. #include <DHT.h>
  30. #define DHTPIN 1
  31. #define DHTPIN21 3
  32. // #define DHTTYPE DHT11 // DHT 11)
  33. #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
  34. #define DHTTYPE21 DHT21 // DHT 21 (AM2301)
  35. DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor for normal 16mhz Arduino
  36. DHT dht21(DHTPIN21, DHTTYPE21); // Initialize DHT sensor for normal 16mhz Arduino
  37. // ****************************************
  38. // 1.8 TFT LCD 128X 160
  39. #include <Adafruit_GFX.h>
  40. #include <Adafruit_ST7735.h>
  41. #include <SPI.h>
  42. //#include "Adafruit_SHT31.h"
  43. //Adafruit_SHT31 sht31 = Adafruit_SHT31();
  44. #define BLACK 0x0000
  45. #define BLUE 0x001F
  46. #define RED 0xF800
  47. #define GREEN 0x07E0
  48. #define MAGENTA 0xF81F
  49. #define YELLOW 0xFFE0
  50. #define WHITE 0xFFFF
  51. #define GRAY 0x7BEF
  52. #define LIGHT_GRAY 0xC618
  53. #define LIME 0x87E0
  54. #define AQUA 0x5D1C
  55. #define CYAN 0x07FF
  56. #define DARK_CYAN 0x03EF
  57. #define ORANGE 0xFCA0
  58. #define PINK 0xF97F
  59. #define BROWN 0x8200
  60. #define VIOLET 0x9199
  61. #define SILVER 0xA510
  62. #define GOLD 0xA508
  63. #define NAVY 0x000F
  64. #define MAROON 0x7800
  65. #define PURPLE 0x780F
  66. #define OLIVE 0x7BE0
  67. #define TFT_SCLK 13
  68. #define TFT_MOSI 11
  69. #define TFT_CS 10
  70. #define TFT_RST 9
  71. #define TFT_DC 8
  72. Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
  73. // Variable Definitions
  74. float temp_internal; // Stores internal temperature value
  75. float hum_internal; // Stores internal humidity value
  76. float temp_external; // Stores external temperature value
  77. float hum_external; // Stores external humidity value
  78. int state; // Condition of pins
  79. int valMoisture = 0; // Stores Moisture value
  80. int kath = 5000; // Delay
  81. int LimM = 1023 ; // Stores value after edit
  82. int LimT = 25 ; // Stores value after edit
  83. int manytimes = 1;
  84. int total;
  85. //pin definitions
  86. int MoisturePin = A0; // Moisture Analog pin
  87. int potention1 = A2; // Potentiometer to change Temperature Limit
  88. int potention2 = A1; // Potentiometer to change Moisture Limit
  89. int Relay1_AirIn = 4; // airRelay1 Blower Air Fan IN
  90. int Relay2_AirOut = 5; // airRelay2 Blower Air Fan OUT
  91. int Relay3_Lamp = 6; // Relay3_Lamp Hot Lamp
  92. int Relay4_Water = 7; // Relay4_Water Pump
  93. int soilPower = 2; // Moisture Soil power
  94. // *******************************************************
  95. void setup() {
  96. Serial.begin(9600);
  97. dht.begin(); // DHT22 Starts
  98. dht21.begin(); // DHT21 Starts
  99. tft.initR(INITR_BLACKTAB); // Initialize 1.8 TFT LCD 128 X 160
  100. tft.fillScreen(BLACK);
  101. tft.setRotation(0);
  102. // Initialize Sensor Moisture
  103. pinMode(soilPower, OUTPUT); // Set D7 as an OUTPUT
  104. digitalWrite(soilPower, LOW); // Set to LOW, no power in the sensor
  105. // Initialize Relays
  106. pinMode(potention1, INPUT);
  107. pinMode(potention2, INPUT);
  108. pinMode(Relay1_AirIn, OUTPUT);
  109. pinMode(Relay2_AirOut, OUTPUT);
  110. pinMode(Relay3_Lamp, OUTPUT);
  111. pinMode(Relay4_Water, OUTPUT);
  112. digitalWrite(Relay1_AirIn, LOW);
  113. digitalWrite(Relay2_AirOut, LOW);
  114. digitalWrite(Relay3_Lamp, LOW);
  115. digitalWrite(Relay4_Water, LOW);
  116. }
  117. void loop() {
  118. // Read data from Sensors
  119. // 1. Read data from Internal Sensor and store it to variables temp_internal and hum_internal
  120. hum_internal = dht21.readHumidity();
  121. temp_internal = dht21.readTemperature();
  122. // 2. Read data from DHT22 and store it to variables hum and temp
  123. hum_internal = dht.readHumidity();
  124. temp_internal = dht.readTemperature();
  125. // This Function send power and then reads from Moisture Sensor
  126. int readSoil() ;
  127. digitalWrite(soilPower, HIGH); // turn D2 "On"
  128. delay(10); // wait 10 milliseconds giving time to Moisture Sensor
  129. // 3. Read the SIG value (data) from the sensor and counted percent degrees
  130. valMoisture = (analogRead(MoisturePin) - 23) / 10;
  131. digitalWrite(soilPower, LOW); // turn power on D2 "Off"
  132. // 4. Read from potentiometers limit of Temperature and Humidity
  133. LimT = (analogRead(potention1) - 23) / 10; // Read limit from Potentiometer
  134. LimM = (analogRead(potention2) - 21) / 10; // Read limit from Potentiometer
  135. // ***************************************************************************
  136. // Print readed values of External and Internal Temperature
  137. tft.fillRect(0, 0, 64, 20, RED);
  138. printText1(temp_external, WHITE, 2, 2, 2);
  139. tft.fillRect(64, 0, 64, 20, MAGENTA);
  140. printText1(temp_internal, WHITE, 66, 2, 2);
  141. tft.fillRect(43, 20, 45, 20, CYAN);
  142. printText("EXT", WHITE, 2, 23, 2);
  143. tft.setCursor(50, 23);
  144. tft.setTextColor(BLACK);
  145. tft.print(LimT);
  146. printText("INT", WHITE, 90, 23, 2);
  147. // ***************************************************************************
  148. // Print readed values of Internal and Internal Humidity
  149. tft.fillRect(0, 40, 64, 20, VIOLET);
  150. printText1(hum_external, WHITE, 2, 43, 2);
  151. tft.fillRect(64, 40, 64, 20, YELLOW);
  152. printText1(hum_internal, BLACK, 66, 43, 2);
  153. tft.fillRect(58, 60, 128, 20, CYAN);
  154. printText("LimM", WHITE, 2, 63, 2);
  155. tft.setCursor(65,63);
  156. tft.setTextColor(BLACK);
  157. tft.print(LimM);
  158. tft.print(" %");
  159. // ***************************************************************************
  160. // Print on Serial Window readed values
  161. Serial.print("Counter = ");
  162. Serial.println(manytimes);
  163. Serial.print("TOTAL = ");
  164. Serial.println(total);
  165. state = digitalRead(Relay1_AirIn);
  166. Serial.print("Air In = ");
  167. Serial.println(state);
  168. state = digitalRead(Relay2_AirOut);
  169. Serial.print("Air Out = ");
  170. Serial.println(state);
  171. state = digitalRead(Relay3_Lamp);
  172. Serial.print("Lamp = ");
  173. Serial.println(state);
  174. state = digitalRead(Relay4_Water);
  175. Serial.print("Water = ");
  176. Serial.println(state);
  177. Serial.println("");
  178. // ***************************************************************************
  179. // 1. Check limit value for Moisture Soil Sensor and control Relay4_Water
  180. Serial.print("Soil: ");
  181. Serial.println(valMoisture);
  182. printText("SOIL", WHITE, 2, 83, 2);
  183. printText("WATER", WHITE, 5, 143, 2);
  184. if (valMoisture >= LimM) {
  185. digitalWrite(Relay4_Water, HIGH);
  186. tft.fillRect(58, 80, 128, 20, AQUA);
  187. printText1(valMoisture, WHITE, 65, 83, 2);
  188. tft.fillRect(80, 140, 128, 20, AQUA);
  189. printText("ON", WHITE, 85, 143, 2);
  190. }
  191. else {
  192. digitalWrite(Relay4_Water, LOW);
  193. tft.fillRect(58, 80, 128, 20, BLUE);
  194. printText1(valMoisture, WHITE, 65, 83, 2);
  195. tft.fillRect(80, 140, 128, 20, RED);
  196. printText("OFF", WHITE, 85, 143, 2);
  197. }
  198. // ***************************************************************************
  199. printText("AIR ", WHITE, 2, 103, 2);
  200. printText("LAMP", WHITE, 5, 123, 2);
  201. // 2. Check greenhouse's Internal Condition and control Relays of Fans & Hot Lamp
  202. if (temp_internal >= LimT) {
  203. if (temp_internal > temp_external) {
  204. Serial.println("1. t_int >= LimT & t_int > t_ext");
  205. Serial.print(temp_internal);
  206. Serial.print(" >= ");
  207. Serial.print(LimT);
  208. Serial.print(" & > ");
  209. Serial.print(temp_external);
  210. Serial.println(" AirIn On - AirOut On - Lamp Off");
  211. tft.fillRect(40, 100, 42, 20, GREEN);
  212. printText("IN ", BLACK, 45, 103, 2);
  213. state = digitalRead(Relay1_AirIn);
  214. if (state == 1) {
  215. // do nothing
  216. }
  217. else {
  218. digitalWrite(Relay1_AirIn, HIGH);
  219. }
  220. tft.fillRect(80, 100, 128, 20, GREEN);
  221. printText("OUT", BLACK, 85, 103, 2);
  222. state = digitalRead(Relay2_AirOut);
  223. if (state == 1) {
  224. // do nothing
  225. }
  226. else {
  227. digitalWrite(Relay2_AirOut, HIGH);
  228. }
  229. tft.fillRect(80, 120, 128, 20, RED);
  230. printText("OFF", WHITE, 85, 123, 2);
  231. state = digitalRead(Relay3_Lamp);
  232. if (state == 0) {
  233. // do nothing
  234. }
  235. else {
  236. digitalWrite(Relay3_Lamp, LOW);
  237. }
  238. }
  239. else {
  240. Serial.println("else 1. t_int >= LimT & t_int < t_ext");
  241. Serial.print(temp_external);
  242. Serial.print(" > ");
  243. Serial.print(temp_internal);
  244. Serial.print(" >= ");
  245. Serial.print(LimT);
  246. Serial.println(" AirIn Off - AirOut On - Lamp Off");
  247. tft.fillRect(40, 100, 42, 20, RED);
  248. printText("IN ", WHITE, 45, 103, 2);
  249. state = digitalRead(Relay1_AirIn);
  250. if (state == 0) {
  251. // do nothing
  252. }
  253. else {
  254. digitalWrite(Relay1_AirIn, LOW);
  255. }
  256. tft.fillRect(80, 100, 128, 20, GREEN);
  257. printText("OUT", BLACK, 85, 103, 2);
  258. state = digitalRead(Relay2_AirOut);
  259. if (state == 1) {
  260. // do nothing
  261. }
  262. else {
  263. digitalWrite(Relay2_AirOut, HIGH);
  264. }
  265. tft.fillRect(80, 120, 128, 20, RED);
  266. printText("OFF", WHITE, 85, 123, 2);
  267. state = digitalRead(Relay3_Lamp);
  268. if (state == 0) {
  269. // do nothing
  270. }
  271. else {
  272. digitalWrite(Relay3_Lamp, LOW);
  273. }
  274. }
  275. }
  276. if (temp_internal < LimT) {
  277. if (temp_internal <= temp_external) {
  278. Serial.println("2. t_int < LimT & t_int >= t_ext");
  279. Serial.print(temp_external);
  280. Serial.print(" <= ");
  281. Serial.print(temp_internal);
  282. Serial.print(" < ");
  283. Serial.print(LimT);
  284. Serial.println(" AirIn ON - AirOut Off - Lamp On");
  285. tft.fillRect(40, 100, 42, 20, GREEN);
  286. printText("IN", BLACK, 50, 103, 2);
  287. if (state == 1) {
  288. // do nothing
  289. }
  290. else {
  291. digitalWrite(Relay1_AirIn, HIGH);
  292. }
  293. tft.fillRect(80, 100, 128, 20, RED);
  294. printText("OUT", WHITE, 85, 103, 2);
  295. state = digitalRead(Relay2_AirOut);
  296. if (state == 0) {
  297. // do nothing
  298. }
  299. else {
  300. digitalWrite(Relay2_AirOut, LOW);
  301. }
  302. tft.fillRect(80, 120, 128, 20, GREEN);
  303. printText("ON", BLACK, 85, 123, 2);
  304. state = digitalRead(Relay3_Lamp);
  305. if (state == 1) {
  306. // do nothing
  307. }
  308. else {
  309. digitalWrite(Relay3_Lamp, HIGH);
  310. }
  311. }
  312. else {
  313. Serial.println("else 2. t_int < LimT & t_int < t_ext");
  314. Serial.print(temp_internal);
  315. Serial.print(" < ");
  316. Serial.print(LimT);
  317. Serial.print(" & ");
  318. Serial.print(temp_external);
  319. Serial.println("AirIn OFF - AirOut Off - Lamp On");
  320. tft.fillRect(40, 100, 42, 20, RED);
  321. printText("IN", WHITE, 44, 103, 2);
  322. state = digitalRead(Relay1_AirIn);
  323. if (state == 0) {
  324. // do nothing
  325. }
  326. else {
  327. digitalWrite(Relay1_AirIn, LOW);
  328. }
  329. tft.fillRect(80, 100, 128, 20, RED);
  330. printText("OUT", WHITE, 85, 103, 2);
  331. state = digitalRead(Relay2_AirOut);
  332. if (state == 0) {
  333. // do nothing
  334. }
  335. else {
  336. digitalWrite(Relay2_AirOut, LOW);
  337. }
  338. tft.fillRect(80, 120, 128, 20, RED);
  339. printText("OFF", WHITE, 85, 123, 2);
  340. state = digitalRead(Relay3_Lamp);
  341. if (state == 1) {
  342. // do nothing
  343. }
  344. else {
  345. digitalWrite(Relay3_Lamp, HIGH);
  346. }
  347. }
  348. }
  349. // 3. Refresh screen after 50 times
  350. manytimes++;
  351. total++;
  352. if (manytimes == 50) {
  353. tft.fillScreen(BLACK);
  354. printText("Smart", LIME, 15, 20, 2);
  355. printText("GreenHouse", GREEN, 5, 50, 2);
  356. printText("v4.0", AQUA, 15, 80, 2);
  357. delay(3000);
  358. manytimes = 0;
  359. }
  360. delay(kath);
  361. tft.setTextSize(1);
  362. tft.fillRect(50, 80, 128, 40, BLACK);
  363. tft.setTextColor(WHITE);
  364. }
  365. // ***************************************************************************
  366. // Function Print Text
  367. void printText(char *text, uint16_t color, int x, int y, int textSize)
  368. {
  369. tft.setCursor(x, y);
  370. tft.setTextColor(color);
  371. tft.setTextSize(textSize);
  372. tft.setTextWrap(true);
  373. tft.print(text);
  374. // printText("MAX", RED,18,130,1);
  375. }
  376. // ***************************************************************************
  377. // Function Print float
  378. void printText1(float num, uint16_t color, int x, int y, int textSize)
  379. {
  380. tft.setCursor(x, y);
  381. tft.setTextColor(color);
  382. tft.setTextSize(textSize);
  383. tft.setTextWrap(true);
  384. tft.print(num);
  385. // printText1(value, RED,18,130,1);
  386. }

comments powered by Disqus