final

Dependencies:   mbed Servo NeoMatrix mbed-rtos 4DGL-uLCD-SE PinDetect PololuLedStrip

Committer:
oscargao
Date:
Wed Dec 02 21:49:58 2020 +0000
Revision:
6:c3d7597d2129
Parent:
5:61e7a1d16b21
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
oscargao 0:941787ae3c86 1 #include "mbed.h"
oscargao 1:5ceaf94b79e4 2 #include "uLCD_4DGL.h"
oscargao 1:5ceaf94b79e4 3 #include "PinDetect.h"
oscargao 2:95f72e92b370 4 #include "rtos.h"
oscargao 2:95f72e92b370 5 #include "Servo.h"
oscargao 5:61e7a1d16b21 6 //#include "PololuLedStrip.h"
oscargao 5:61e7a1d16b21 7 #include "NeoMatrix.h"
oscargao 5:61e7a1d16b21 8 #define LED_COUNT 24 // uses a 24-led ring
oscargao 1:5ceaf94b79e4 9
oscargao 1:5ceaf94b79e4 10 uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
oscargao 2:95f72e92b370 11 Serial pc(USBTX, USBRX); // tx, rx
oscargao 5:61e7a1d16b21 12 Timeout countdown; // for alarm duration
oscargao 1:5ceaf94b79e4 13
oscargao 2:95f72e92b370 14 // pb
oscargao 2:95f72e92b370 15 PinDetect button1(p7,PullDown);
oscargao 2:95f72e92b370 16 PinDetect button2(p8,PullDown);
oscargao 2:95f72e92b370 17
oscargao 2:95f72e92b370 18 // sensors
oscargao 0:941787ae3c86 19 AnalogIn waterSensor(p20);
oscargao 0:941787ae3c86 20 AnalogIn moistureSensor(p19);
oscargao 0:941787ae3c86 21 AnalogIn lightSensor(p18);
oscargao 2:95f72e92b370 22
oscargao 2:95f72e92b370 23 // outputs
oscargao 0:941787ae3c86 24 PwmOut speaker(p21);
oscargao 0:941787ae3c86 25 PwmOut led(p22);
oscargao 2:95f72e92b370 26 PwmOut led1(LED1);
oscargao 2:95f72e92b370 27 // motors
oscargao 2:95f72e92b370 28 Servo Shade(p23);
oscargao 2:95f72e92b370 29 Servo Pipe(p24);
oscargao 5:61e7a1d16b21 30 // led panel
oscargao 5:61e7a1d16b21 31 NeoArr array(p5, 1);
oscargao 2:95f72e92b370 32
oscargao 5:61e7a1d16b21 33 // global variables
oscargao 2:95f72e92b370 34 Mutex myMut;
oscargao 5:61e7a1d16b21 35 //volatile int button1_push = 0;
oscargao 5:61e7a1d16b21 36 //volatile int button2_push = 0;
oscargao 5:61e7a1d16b21 37 volatile float setWaterLevel = 0;
oscargao 5:61e7a1d16b21 38 volatile float setMoistLevel = 0.0;
oscargao 5:61e7a1d16b21 39 volatile float setLightLevelHigh = 0.5;
oscargao 5:61e7a1d16b21 40 volatile float setLightLevelLow = 0.2;
oscargao 4:2a561107cc01 41 volatile float shadePosition = 0.0;
oscargao 4:2a561107cc01 42 volatile float pipePosition = 0.0;
oscargao 2:95f72e92b370 43
oscargao 5:61e7a1d16b21 44 // debug varibles
oscargao 2:95f72e92b370 45 volatile int counting = 0; // keep track of how many seconds has passed
oscargao 2:95f72e92b370 46
oscargao 2:95f72e92b370 47 // sensor readings
oscargao 2:95f72e92b370 48 volatile float water = 0.0;
oscargao 2:95f72e92b370 49 volatile float light = 0.0;
oscargao 2:95f72e92b370 50 volatile float moist = 0.0;
oscargao 2:95f72e92b370 51
oscargao 2:95f72e92b370 52 // callback functinos for 2 pushbuttons
oscargao 5:61e7a1d16b21 53 void Button1_Callback (void){
oscargao 5:61e7a1d16b21 54 setLightLevelHigh -= .1;
oscargao 5:61e7a1d16b21 55 setLightLevelHigh = setLightLevelHigh>0? setLightLevelHigh:0;
oscargao 5:61e7a1d16b21 56 }
oscargao 5:61e7a1d16b21 57 void Button2_Callback (void){
oscargao 5:61e7a1d16b21 58 setLightLevelHigh += .1;
oscargao 5:61e7a1d16b21 59 setLightLevelHigh = setLightLevelHigh<1? setLightLevelHigh:1;
oscargao 1:5ceaf94b79e4 60 }
oscargao 1:5ceaf94b79e4 61
oscargao 2:95f72e92b370 62 // move the servos, also light an LED
oscargao 2:95f72e92b370 63 void motors_function(void const *argument){
oscargao 2:95f72e92b370 64 while(1){
oscargao 5:61e7a1d16b21 65 if (light>setLightLevelHigh)
oscargao 5:61e7a1d16b21 66 {
oscargao 5:61e7a1d16b21 67 array.fillScreen(0,0,0,0);
oscargao 5:61e7a1d16b21 68 array.write();
oscargao 5:61e7a1d16b21 69 /*
oscargao 5:61e7a1d16b21 70 code for lower the shade here
oscargao 5:61e7a1d16b21 71 */
oscargao 5:61e7a1d16b21 72 pc.printf("case 1\n\r");
oscargao 5:61e7a1d16b21 73 }
oscargao 5:61e7a1d16b21 74 else if (light<setLightLevelLow)
oscargao 5:61e7a1d16b21 75 {
oscargao 5:61e7a1d16b21 76 array.fillScreen(0,255,255,255);
oscargao 5:61e7a1d16b21 77 array.write();
oscargao 5:61e7a1d16b21 78 pc.printf("case 2\n\r");
oscargao 5:61e7a1d16b21 79 }
oscargao 5:61e7a1d16b21 80 else
oscargao 5:61e7a1d16b21 81 {
oscargao 5:61e7a1d16b21 82 array.fillScreen(0,0,0,0);
oscargao 5:61e7a1d16b21 83 array.write();
oscargao 5:61e7a1d16b21 84 Shade = 0;
oscargao 5:61e7a1d16b21 85 /*
oscargao 5:61e7a1d16b21 86 code for openning the shade here
oscargao 5:61e7a1d16b21 87 */
oscargao 5:61e7a1d16b21 88 pc.printf("case 3\n\r");
oscargao 5:61e7a1d16b21 89
oscargao 5:61e7a1d16b21 90 }
oscargao 5:61e7a1d16b21 91
oscargao 4:2a561107cc01 92 pipePosition = moist<0.6? 1:0;
oscargao 4:2a561107cc01 93 Pipe = pipePosition;
oscargao 2:95f72e92b370 94 Thread::wait(1000);
oscargao 2:95f72e92b370 95 }
oscargao 2:95f72e92b370 96 }
oscargao 2:95f72e92b370 97
oscargao 0:941787ae3c86 98 int main() {
oscargao 1:5ceaf94b79e4 99 uLCD.printf("\n\rstart printing\n");
oscargao 2:95f72e92b370 100 uLCD.cls();
oscargao 2:95f72e92b370 101 speaker.period(1.0/800.0);
oscargao 5:61e7a1d16b21 102
oscargao 5:61e7a1d16b21 103 // led init
oscargao 5:61e7a1d16b21 104 array.setBrightness(.1); // set brightness to 0.1
oscargao 5:61e7a1d16b21 105 array.clear();
oscargao 2:95f72e92b370 106
oscargao 5:61e7a1d16b21 107 // attach button callbacks
oscargao 2:95f72e92b370 108 button1.attach_deasserted(&Button1_Callback);
oscargao 2:95f72e92b370 109 button1.setSampleFrequency();
oscargao 2:95f72e92b370 110 button2.attach_deasserted(&Button2_Callback);
oscargao 2:95f72e92b370 111 button2.setSampleFrequency();
oscargao 2:95f72e92b370 112
oscargao 5:61e7a1d16b21 113 // attach threads
oscargao 2:95f72e92b370 114 Thread motors(motors_function);
oscargao 5:61e7a1d16b21 115
oscargao 0:941787ae3c86 116 while(1) {
oscargao 0:941787ae3c86 117 water = waterSensor.read();
oscargao 0:941787ae3c86 118 moist = moistureSensor.read();
oscargao 0:941787ae3c86 119 light = lightSensor.read();
oscargao 2:95f72e92b370 120 myMut.lock();
oscargao 2:95f72e92b370 121 uLCD.locate(0,2);
oscargao 1:5ceaf94b79e4 122 uLCD.printf("%d:\n\r",counting);
oscargao 2:95f72e92b370 123 uLCD.printf("water: %f\n\r",water);
oscargao 2:95f72e92b370 124 uLCD.printf("moist: %f\n\r",moist);
oscargao 2:95f72e92b370 125 uLCD.printf("light: %f\n\r",light);
oscargao 5:61e7a1d16b21 126
oscargao 5:61e7a1d16b21 127 uLCD.locate(0,10);
oscargao 5:61e7a1d16b21 128 uLCD.printf("SetLightHigh: %1.1f\n\r", setLightLevelHigh);
oscargao 5:61e7a1d16b21 129 uLCD.printf("SetLightLow: %1.1f\n\r", setLightLevelLow);
oscargao 5:61e7a1d16b21 130 uLCD.printf("SetMoistLevel: %1.1f\n\r", setMoistLevel);
oscargao 2:95f72e92b370 131 myMut.unlock();
oscargao 0:941787ae3c86 132 counting++;
oscargao 2:95f72e92b370 133
oscargao 2:95f72e92b370 134 // sound the alarm if water level too low
oscargao 5:61e7a1d16b21 135 speaker = moist<setMoistLevel? 0.01:0;
oscargao 5:61e7a1d16b21 136 Thread::wait(1000); // every one second
oscargao 0:941787ae3c86 137 }
oscargao 2:95f72e92b370 138 }