Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed Servo NeoMatrix mbed-rtos 4DGL-uLCD-SE PinDetect PololuLedStrip
main.cpp
- Committer:
- oscargao
- Date:
- 2020-12-02
- Revision:
- 6:c3d7597d2129
- Parent:
- 5:61e7a1d16b21
File content as of revision 6:c3d7597d2129:
#include "mbed.h"
#include "uLCD_4DGL.h"
#include "PinDetect.h"
#include "rtos.h"
#include "Servo.h"
//#include "PololuLedStrip.h"
#include "NeoMatrix.h"
#define LED_COUNT 24 // uses a 24-led ring
uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
Serial pc(USBTX, USBRX); // tx, rx
Timeout countdown; // for alarm duration
// pb
PinDetect button1(p7,PullDown);
PinDetect button2(p8,PullDown);
// sensors
AnalogIn waterSensor(p20);
AnalogIn moistureSensor(p19);
AnalogIn lightSensor(p18);
// outputs
PwmOut speaker(p21);
PwmOut led(p22);
PwmOut led1(LED1);
// motors
Servo Shade(p23);
Servo Pipe(p24);
// led panel
NeoArr array(p5, 1);
// global variables
Mutex myMut;
//volatile int button1_push = 0;
//volatile int button2_push = 0;
volatile float setWaterLevel = 0;
volatile float setMoistLevel = 0.0;
volatile float setLightLevelHigh = 0.5;
volatile float setLightLevelLow = 0.2;
volatile float shadePosition = 0.0;
volatile float pipePosition = 0.0;
// debug varibles
volatile int counting = 0; // keep track of how many seconds has passed
// sensor readings
volatile float water = 0.0;
volatile float light = 0.0;
volatile float moist = 0.0;
// callback functinos for 2 pushbuttons
void Button1_Callback (void){
setLightLevelHigh -= .1;
setLightLevelHigh = setLightLevelHigh>0? setLightLevelHigh:0;
}
void Button2_Callback (void){
setLightLevelHigh += .1;
setLightLevelHigh = setLightLevelHigh<1? setLightLevelHigh:1;
}
// move the servos, also light an LED
void motors_function(void const *argument){
while(1){
if (light>setLightLevelHigh)
{
array.fillScreen(0,0,0,0);
array.write();
/*
code for lower the shade here
*/
pc.printf("case 1\n\r");
}
else if (light<setLightLevelLow)
{
array.fillScreen(0,255,255,255);
array.write();
pc.printf("case 2\n\r");
}
else
{
array.fillScreen(0,0,0,0);
array.write();
Shade = 0;
/*
code for openning the shade here
*/
pc.printf("case 3\n\r");
}
pipePosition = moist<0.6? 1:0;
Pipe = pipePosition;
Thread::wait(1000);
}
}
int main() {
uLCD.printf("\n\rstart printing\n");
uLCD.cls();
speaker.period(1.0/800.0);
// led init
array.setBrightness(.1); // set brightness to 0.1
array.clear();
// attach button callbacks
button1.attach_deasserted(&Button1_Callback);
button1.setSampleFrequency();
button2.attach_deasserted(&Button2_Callback);
button2.setSampleFrequency();
// attach threads
Thread motors(motors_function);
while(1) {
water = waterSensor.read();
moist = moistureSensor.read();
light = lightSensor.read();
myMut.lock();
uLCD.locate(0,2);
uLCD.printf("%d:\n\r",counting);
uLCD.printf("water: %f\n\r",water);
uLCD.printf("moist: %f\n\r",moist);
uLCD.printf("light: %f\n\r",light);
uLCD.locate(0,10);
uLCD.printf("SetLightHigh: %1.1f\n\r", setLightLevelHigh);
uLCD.printf("SetLightLow: %1.1f\n\r", setLightLevelLow);
uLCD.printf("SetMoistLevel: %1.1f\n\r", setMoistLevel);
myMut.unlock();
counting++;
// sound the alarm if water level too low
speaker = moist<setMoistLevel? 0.01:0;
Thread::wait(1000); // every one second
}
}