The use of the KL-46Z FRDM microcontroller to handle the I/O to detect water moisture and light exposure for a potted plant using a 555 Timer Chip and onboard visible light sensor. This project is incomplete as of 4/26/15
main.cpp
- Committer:
- bomalley
- Date:
- 2015-04-26
- Revision:
- 0:1a57cdd09c38
- Child:
- 1:5b951fe1f430
File content as of revision 0:1a57cdd09c38:
#include "mbed.h" #include "SLCD.h" #define PROGNAME "Plant Vital Sign Detector v1 v3\r\n" #define HIGH 1 #define LOW 0 #define PIN_2_555 D2 #define PIN_3_555 D3 #define PIN_3_CLONE LED_GREEN #define LEDON LOW #define LEDOFF HIGH #define OUTPULSELEN 100 // ms #define DATATIME 100 #define SERIALSPEED 57600 #define MAX_OUT 1500 // ms #define MIN_OUT 500 #define ABORTTIME 3500 #define INPUTSTART 1 #define DATARATE 1000 // ms time between data takes. #define LCDLEN 10 #define MAXTIME 500 #define TIMERSTATE 0 #define CHECKMOISTURE 1 #define MOREMOISTURE 2 #define CHECKLIGHT 3 #define MORELIGHT 4 #define LESSLIGHT 5 #define LIGHTMIN .100 #define LIGHTMAX .900 #define ML "MORE LIGHT" #define LL "LESS LIGHT" #define MW "MORE WATER" // this constant won't change: DigitalOut oneShotIn (PIN_2_555); // the pin that the pushbutton is attached to DigitalIn oneShotOut (PIN_3_555); DigitalOut ledPin(PIN_3_CLONE); // the pin that the LED is attached to AnalogIn LightSensor(PTE22); // define light sensor Serial pc(USBTX, USBRX); SLCD slcd; Timer milliTimer; int PgmState; long oneShotLen; long timeOut = ABORTTIME; long nextDataTake = DATARATE; long oneShotBegin; long oneShotEnd; // Variables will change: int buttonPushCounter = 0; // counter for the number of button presses int buttonState = 0; // current state of the button int lastButtonState = 0; // previous state of the button float lightVal; //value of the light sensor unsigned short lightWord; int timerChip; char lcdData[LCDLEN]; void LCDMess(char *lMess){ slcd.Home(); slcd.clear(); slcd.printf(lMess); } void pulseOut (long pulseLen){ oneShotIn.write(LOW); wait_us(pulseLen); oneShotIn.write(HIGH); } void setup() { // initialize serial communication: pc.printf(PROGNAME); oneShotIn.write(HIGH); oneShotOut.mode(PullNone); ledPin.write(LOW); milliTimer.start(); milliTimer.reset(); nextDataTake = DATARATE; lastButtonState = LOW; oneShotLen = 0; } void readLightSensor() { lightVal = LightSensor.read(); lightWord = LightSensor.read_u16(); pc.printf("LS => %1.3f %5d \r\n", lightVal, lightWord); if(lightVal <= LIGHTMIN) { PgmState = LESSLIGHT; } else if(lightVal >= LIGHTMAX) { PgmState = MORELIGHT; } } void readTimerChip() { timerChip = oneShotOut.read(); // pc.printf(); } int main(){ setup(); pulseOut(OUTPULSELEN); LCDMess(PROGNAME); milliTimer.start(); milliTimer.reset(); PgmState = TIMERSTATE; while (true) { switch(PgmState) { case TIMERSTATE: //loops until timer => MAXTIME //Go on to CHECKMOISTURE if(milliTimer.read_ms() >= MAXTIME) { milliTimer.reset(); PgmState = CHECKMOISTURE; } break; case CHECKMOISTURE: //call readTimerChip(); readTimerChip(); break; case MOREMOISTURE: //Output to PC "NEEDS WATER" //Change state to CHECKLIGHT pc.printf(MW); break; case CHECKLIGHT: //call readLightSensor readLightSensor(); break; case MORELIGHT: //output to PC "MORE LIGHT" //CHange state to TIMERSTATE pc.printf(ML); PgmState = TIMERSTATE; break; case LESSLIGHT: //OP to PC "LESS LIGHT" //Chane State to TIMERSTATE pc.printf(LL); PgmState = TIMERSTATE; break; } wait(DATATIME); } }