////////////////////////////////////////////////////////////////////////////////
// Name: FloraGarden2560-01 //
// Platform: Arduino Mega 2560 //
// Created by: HARB rboek2@gmail.com April 2018 GPL copyrights //
// http://robotigs.nl/robotigs/includes/bots_header.php?idbot=18 //
// This robot is built to test several moisture sensors. //
// As outputs the following modules are mounted: //
// - Standard Serial Monitor output //
// - Standard Arduino Onboard LED (PWM) //
// - 3 color LED (PWM) //
// - Activ loudspeaker //
// As inputs the following modules are mounted: //
// - DS1307 Real Time Clock //
// - DHT22 air temperature and air humidity sensor //
// - CJMCU soil huidity sensor (TWI) //
////////////////////////////////////////////////////////////////////////////////
// SET PRECOMPILER OPTIONS *****************************************************
// Initialse conditional compiling, uncomment to include, comment to exclude ---
// Do comment the next line for runtime versions -------------------------------
#define RS232 //Uncomment to include Serial Monitor sections
// #ifdef RS232 //Only include these lines if the variable has been defined
// Define the needed header files for the precompiler, no charge if not used ---
#include <DHT.h> //Needed for DHT22 and DHT11 Temperature and humidity sensors
#include <Wire.h> //Two Wire Interface
#include <RTClib.h> //connected via I2C and Wire lib
// Define precompiler variables -----------------(Runs faster & doesn`t use RAM)
// Define PINS -----------------------------------------------------------------
#define buzAct 14 //Define to which I/O pin the activ BUZZER is connected
#define ledRedPin 44 //3 Colour LED, to which PWM pin RED is connected
#define ledBluPin 45 //3 Colour LED, to which PWM pin BLUE is connected
#define ledGrePin 46 //3 Colour LED, to which PWM pin GREEN is connected
#define DHTPIN 47 //What DIO pin is DHT22 connected to
#define DHTTYPE DHT22 //DHT 22 (AM2302), AM2321
// Initialize objects ----------------------------------------------------------
DHT dht(DHTPIN, DHTTYPE); //Initialize DHT sensor1
DS1307 rtc; //Initialize Real Time Clock object
//END OF PRECOMPILER OPTIONS ---------------------------------------------------
//DEFINE VARIABLES -------------------------------------------------------------
bool ledOnBoardVal = LOW; //You can chose HIGH-on or LOW-off for LED_BUILTIN
byte msWait = 1; //Test your patience during the LED test
byte brillance = 0; //Brightness of any color, just to test LEDs PWM
float grenairtmp1; //Temperature as measured by DHT22
float grenairhum1; //Humidity as measured by DHT22
word grensolhum1; //Soil humidity as measured by Chirp
word grensoltmp1; //Temperature as measured by Chirp
word grensollum1; //Solar power as measured by Chirp
word valMQ7; //Value gassensor as measured by MQ7 sensor
void setup() {
disable_jtag(); //Disable jtag to free port C, enabled by default
pinMode(LED_BUILTIN, OUTPUT); //Arduino boards contain an onboard LED_BUILTIN
pinMode(buzAct, OUTPUT); //Make the LED connections output pins
pinMode(ledRedPin, OUTPUT); //Make the RED LED connection an output pin
pinMode(ledBluPin, OUTPUT); //Make the BLUE LED connection an output pin
pinMode(ledGrePin, OUTPUT); //Make the GREEN LED connection an output pin
dht.begin(); //Start DHT sensor
Wire.begin(); //Start the Two Wire Interface
writeI2CRegister8bit(0x20, 6); //Reset DHT22 sensor to tell it is a slave
rtc.begin(); //Start the DS1307 Real Time Clock
if (! rtc.isrunning()) { //Meaning something is wrong but we don't halt
Serial.println("RTC is NOT running!");
rtc.adjust(DateTime(__DATE__, __TIME__)); //Set the RTC sketch was compiled
} //End of if (! rtc.isrunning())
test_LEDs(); //PWM fade in and fade out for all 4 LEDs on board
beep(1); //Create a test beep with KY-012 active buzzer
#if defined(RS232) //Only compiled in if Serial Monitor must be included
Serial.begin(9600); //Nothing more needed for the Serial Monitor to function
Serial.println("Setup done"); //Print a message to test the serial monitor
#endif //End of conditional compiling
} //End of setup
void loop() { //KEEP ON RUNNING THIS LOOP FOREVER
// 1) FIRST STEP IS TO READ ALL SENSORS --------------------------------------
analogWrite(ledBluPin, 5); //Blue HIGH=on, LOW=off
grenairtmp1 = dht.readTemperature(); //DHT22 read temperature as Celsius
grenairhum1 = dht.readHumidity();//DHT22 reading sensor takes 250 milliseconds
DateTime now = rtc.now(); //Read the current time from DS1307 into the object
// 2) SECOND STEP IS TO CALCULATE THE DESIRED SETTING OF THE SWITCHES --------
//calculate_lightswitch(); //Calculate lightSwitch ON or OFF according clock
//calculate_soilswitch(); //Calculate builtin heater of the propagator
// 3) THIRD STEP IS TO SET THE SWITCHES AS DESIRED ---------------------------
//switch_light(); //Switch the LED lighting ON or OFF according lightSwitch
//switch_propagator(); //Switch the propagator heater
// 4) LAST STEP IS TO COMMUNICATE TO THE SERIAL PORT AND FINISH LOOP ---------
#if defined(RS232) //Only compiled in if Serial Monitor must be included
Serial.print("Temperatuur:"); //Print a value to the serial monitor
Serial.print(grenairtmp1); //Print a value to the serial monitor
Serial.print(" Luchtvochtigheid:"); //Print a value to the serial monitor
Serial.print(grenairhum1); //Print a value to the serial monitor
Serial.println(" "); //Print a value to the serial monitor
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
#endif //End of conditional compiling
// 5) RETURN TO START AGAIN --------------------------------------------------
toggle_ledOnBoard(); //Toggles the LED_BUILTIN on-board LED on or off
//beep(1); //Create a test beep with KY-012 active buzzer
digitalWrite(ledBluPin, LOW); //Blue HIGH=on, LOW=off
delay (60000); //Test your patience here
} //End of void loop() //KEEP ON RUNNING THIS LOOP FOREVER
////////////////////////////////////////////////////////////////////////////////
// PIN ALLOCATIONS TABLE ARDUINO MEGA 2560 //
// Board -Atmel- PIN - IDE - Function - External Connection FUNC //
// //
// CONNECTIONS RAILS TOP LEFT: DIGITAL PWM<~> ******************************* //
// SCL - 28 - PC5 -19/A5- ADC5/SCL/PCINT13 - TWI //
// SDA - 27 - PC4 -18/A4- ADC4/SDA/PCINT12 - TWI //
// AREF - 31 - REF - - AREF - REF //
// GND - 32 - GND - - GND - GND //
// 13 PWM - 26 - PB7 - 13 - OC0A/OC1C/PCINT17 - LED Arduino LED_BUILTIN PWM //
// 12 PWM - 18 - PB6 - 12 - OC1B/PCINT16 - PWM //
// 11 PWM - 17 - PB3 - 11 - MOSI/OC2A/PCINT3 - PWM //
// 10 PWM - 16 - PB2 - 10 - SS/OC1B/PCINT2 - PWM //
// 9 PWM - 15 - PB1 - 9 - OC1A/PCINT1 - PWM //
// 8 PWM - 14 - PB0 - 8 - PCINT0/CLK0/ICP1 - DIO //
// //
// CONNECTIONS RAILS TOP MIDDLE: DIGITAL PWM<~> ***************************** //
// 7 PWM - 13 - PD7 - 7 - PCINT23/AIN1 - PWM //
// 6 PWM - 12 - PD6 - 6 - PCINT22/OCA0/AIN0 - PWM //
// 5 PWM - 11 - PD5 - 5 - PCINT21/OC0B/T1 - PWM //
// 4 PWM - 6 - PD4 - 4 - PCINT20/XCK/T0 - PWM //
// 3 PWM - 5 - PD3 - 3 - PCINT19/OC2B/INT1 - PWM //
// 2 PWM - 4 - PD2 - 2 - PCINT18/INT0 - INT //
// 1 TX0 - 3 - PD1 - 1 - PCINT17/TXD - Serial monitor TX0 //
// 0 RX0 - 2 - PD0 - 0 - PCINT16/RCD - Serial Monitor RC0 //
// //
// CONNECTIONS RAILS TOP RIGHT: DIGITAL PWM<~> ****************************** //
// 14 TX3 - 13 - PD7 - 7 - PCINT23/AIN1 - Activ buzzer DIO //
// 15 RX3 - 12 - PD6 - 6 - PCINT22/OCA0/AIN0 - PWM //
// 16 TX2 - 11 - PD5 - 5 - PCINT21/OC0B/T1 - TX2 //
// 17 RX2 - 6 - PD4 - 4 - PCINT20/XCK/T0 - RX2 //
// 18 TX1 - 5 - PD3 - 3 - PCINT19/OC2B/INT1 - INT //
// 19 RX1 - 4 - PD2 - 2 - PCINT18/INT0 - INT //
// 20 SDA - 3 - PD1 - 1 - PCINT17/TXD - SDA //
// 21 SCL - 2 - PD0 - 0 - PCINT16/RCD - SCL //
// //
// CONNECTIONS RAILS BOTTOM LEFT: POWER ************************************* //
// 5V - 7 - VCC - - VCC - VCC //
// RES - 1 - RES - - PCINT14/RESET - RES //
// 3.3V - - - - - //
// 5V - - - - - //
// GND - - - - - //
// GND - - - - - //
// Vin - - - - - //
// //
// CONNECTIONS RAILS BOTTOM CENTER: ANALOG IN ******************************* //
// A0 - 23 - PC0 -A0/14- ADC0/PCINT8 - ADC //
// A1 - 24 - PC1 -A1/15- ADC1/PCINT9 - ADC //
// A2 - 25 - PC2 -A2/16- ADC2/PCINT10 - ADC //
// A3 - 26 - PC3 -A3/17- ADC3/PCINT12 - ADC //
// A4 - 27 - PC4 -A4/18- ADC4/SDA/PCINT12 - TWI //
// A5 - 28 - PC5 -A5/19- ADC5/SCL/PCINT13 - TWI //
// //
// CONNECTIONS RAILS BOTTOM RIGHT: ANALOG IN ******************************** //
// A08 - 89 - PK0 - - ADC1 4/PCINT? - ADC //
// A09 - 88 - PK1 - - ADC15/PCINT? - ADC //
// A10 - 87 - PK2 - - ADC14/PCINT? - ADC //
// A11 - 86 - PK3 - - ADC15/PCINT? - ADC //
// A12 - 85 - PK4 - - ADC14/PCINT? - ADC //
// A13 - 84 - PK5 - - ADC15/PCINT? - ADC //
// A14 - 83 - PK6 - - ADC14/PCINT22 - ADC //
// A15 - 82 - PK7 - - ADC15/PCINT23 - ADC //
// //
// CONNECTIONS RAILS QUER RIGHT ********************************************* //
// Board -Atmel- PIN - IDE - Function - External Connection FUNC //
// 32 - 58 - PC5 - - DIO - DIO //
// 44 - 40 - PL5 - - OC5C - 3 Color led Red PWM //
// 45 - 39 - PL4 - - OC5B - 3 Color led Blue PWM //
// 46 - 38 - PL3 - - OC5A - 3 Color led Green PWM //
// 47 - ?? - PL2?- - ? - DHT22 communication DIO?//
// 50 - 22 - PB3 - - MISO/PCINT3 - SPI //
// 51 - 21 - PB2 - - MOSI/PCINT2 - SPI //
// 52 - 20 - PB1 - - SCK/PCINT1 - SPI //
// 53 - 19 - PB1 - - SS/PCINT0 - SPI //
////////////////////////////////////////////////////////////////////////////////
//345678911234567892123456789312345678941234567895123456789612345678971234567898
// EEPROM MEMORY MAP: //
// Start End Number Description //
// 0000 0000 1 Never use this memory location to be AVR compatible //
////////////////////////////////////////////////////////////////////////////////
//345678911234567892123456789312345678941234567895123456789612345678971234567898
////////////////////////////////////////////////////////////////////////////////
// FUSES (can always be altered by using the STK500) //
// On-Chip Debug Enabled: off (OCDEN=0) //
// JTAG Interface Enabled: off (JTAGEN=0) //
// Preserve EEPROM mem through the Chip Erase cycle: On (EESAVE = 0) //
// Boot Flash section = 2048 words, Boot startaddr=$3800 (BOOTSZ=00) //
// Boot Reset vector Enabled, default address=$0000 (BOOTSTR=0) //
// CKOPT fuse (operation dependent of CKSEL fuses (CKOPT=0) //
// Brown-out detection level at VCC=2,7V; (BODLEVEL=1) //
// Ext. Cr/Res High Freq.; Start-up time: 16K CK + 64 ms (CKSEL=1111 SUT=11) //
// LOCKBITS (are dangerous to change, since they cannot be reset) //
// Mode 1: No memory lock features enabled //
// Application Protect Mode 1: No lock on SPM and LPM in Application Section //
// Boot Loader Protect Mode 1: No lock on SPM and LPM in Boot Loader Section //
////////////////////////////////////////////////////////////////////////////////
unsigned int readI2CRegister16bit(int addr, int reg){ //Read any TWI register **
Wire.beginTransmission(addr);
Wire.write(reg);
Wire.endTransmission();
delay(20);
Wire.requestFrom(addr, 2);
unsigned int t = Wire.read() << 8;
t = t | Wire.read();
return t;
} //Exit readI2CRegister16bit --------------------------------------------------
void writeI2CRegister8bit(int addr, int value){ //Reset DHT22 sensor **********
Wire.beginTransmission(addr);
Wire.write(value);
Wire.endTransmission();
} //Exit writeI2CRegister8bit --------------------------------------------------
void test_LEDs(void){ //PWM fade in and fade out for all 4 LEDs on board *******
while (brillance<255){
analogWrite(LED_BUILTIN, brillance); //Set to desired PWM value LED_BUILTIN
brillance++;
delay (msWait);
}
while (brillance>0){
analogWrite(LED_BUILTIN, brillance); //Set to desired PWM value LED_BUILTIN
brillance--;
delay (msWait);
}
analogWrite(LED_BUILTIN, 0); //Set LED to desired PWM value = off LED_BUILTIN
while (brillance<255){
analogWrite(ledRedPin, brillance); //Set LED to desired PWM value RED
brillance++;
delay (msWait);
}
while (brillance>0){
analogWrite(ledRedPin, brillance); //Set LED to desired PWM value RED
brillance--;
delay (msWait);
}
analogWrite(ledRedPin, 0); //Set LED to desired PWM value = off RED
while (brillance<255){
analogWrite(ledGrePin, brillance); //Set LED to desired PWM value GREEN
brillance++;
delay (msWait);
}
while (brillance>0){
analogWrite(ledGrePin, brillance); //Set LED to desired PWM value GREEN
brillance--;
delay (msWait);
}
analogWrite(ledGrePin, 0); //Set LED to desired PWM value = off GREEN
while (brillance<255){
analogWrite(ledBluPin, brillance); //Set LED to desired PWM value BLUE
brillance++;
delay (msWait);
}
while (brillance>0){
analogWrite(ledBluPin, brillance); //Set LED to desired PWM value BLUE
brillance--;
delay (msWait);
}
analogWrite(ledBluPin, 0); //Set LED to desired PWM value = off BLUE
} //Exit test_LEDs -------------------------------------------------------------
void beep(uint8_t ms) { //Create a beep with KY-012 active buzzer **************
digitalWrite(buzAct,HIGH); //Turn buzzer on
while (ms > 0){ //Timer of the duration of the beep
delay(5); //Wait milliseconds
ms--; //Countdown untill we reached zero
} //Timer of the duration of the beep has been counted down to zero
digitalWrite(buzAct,LOW); //Turn annoying buzzer off as fast as you can
} //Exit beep ------------------------------------------------------------------
void toggle_ledOnBoard(void){ //Toggles the LED_BUILTIN on-board LED on or off *
ledOnBoardVal = !ledOnBoardVal; //Toggle value
digitalWrite(LED_BUILTIN, ledOnBoardVal); //Set Arduino boards onboard LED
} //Exit toggle_ledBin ---------------------------------------------------------
void disable_jtag(void) { //Disable jtag to free port C, enabled by default ****
#if defined(JTD) //Not all AVR controller include jtag
MCUCR |= ( 1 << JTD ); //Write twice to disable
MCUCR |= ( 1 << JTD ); //So stutter once
#endif //End of conditional compiling
} //Exit jtag_disable ----------------------------------------------------------