iot_smart_hedgehog_home

Dependencies:   4DGL-uLCD-SE LCD_fonts PinDetect Servo mbed-rtos mbed wave_player

Committer:
albertoli
Date:
Wed Nov 29 06:17:30 2017 +0000
Revision:
0:87d9eb921232
first_commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
albertoli 0:87d9eb921232 1 #include "mbed.h"
albertoli 0:87d9eb921232 2 #include "Servo.h"
albertoli 0:87d9eb921232 3 #include "rtos.h"
albertoli 0:87d9eb921232 4 #include "SDFileSystem.h"
albertoli 0:87d9eb921232 5 #include "wave_player.h"
albertoli 0:87d9eb921232 6 RawSerial pi(USBTX, USBRX);
albertoli 0:87d9eb921232 7 Mutex serial_mutex;
albertoli 0:87d9eb921232 8
albertoli 0:87d9eb921232 9 Servo myservo(p21);
albertoli 0:87d9eb921232 10 AnalogIn LM61(p15);
albertoli 0:87d9eb921232 11
albertoli 0:87d9eb921232 12 SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
albertoli 0:87d9eb921232 13 AnalogOut DACout(p18);
albertoli 0:87d9eb921232 14 //On Board Speaker
albertoli 0:87d9eb921232 15 //PwmOut PWMout(p25);
albertoli 0:87d9eb921232 16 wave_player waver(&DACout);
albertoli 0:87d9eb921232 17
albertoli 0:87d9eb921232 18 volatile float temp_out;
albertoli 0:87d9eb921232 19 volatile float rpm_out;
albertoli 0:87d9eb921232 20 volatile float wheel_speed_out;
albertoli 0:87d9eb921232 21 volatile int treat = 0;
albertoli 0:87d9eb921232 22 volatile int music = 0;
albertoli 0:87d9eb921232 23 volatile bool x;
albertoli 0:87d9eb921232 24
albertoli 0:87d9eb921232 25 DigitalOut myled1(LED1);
albertoli 0:87d9eb921232 26 DigitalOut myled2(LED2);
albertoli 0:87d9eb921232 27 DigitalOut myled3(LED3);
albertoli 0:87d9eb921232 28
albertoli 0:87d9eb921232 29 volatile long int count;
albertoli 0:87d9eb921232 30
albertoli 0:87d9eb921232 31 Serial pc(USBTX, USBRX);
albertoli 0:87d9eb921232 32 Timer t;
albertoli 0:87d9eb921232 33 InterruptIn risingEdge(p11);
albertoli 0:87d9eb921232 34
albertoli 0:87d9eb921232 35 void dev_recv()
albertoli 0:87d9eb921232 36 { while(1){
albertoli 0:87d9eb921232 37 char temp = 0;
albertoli 0:87d9eb921232 38 while(pi.readable()) {
albertoli 0:87d9eb921232 39 myled3 = !myled3;
albertoli 0:87d9eb921232 40 serial_mutex.lock();
albertoli 0:87d9eb921232 41 temp = pi.getc();
albertoli 0:87d9eb921232 42 if (temp=='t'){
albertoli 0:87d9eb921232 43 myled2=1;
albertoli 0:87d9eb921232 44 treat=1;
albertoli 0:87d9eb921232 45 }
albertoli 0:87d9eb921232 46 if (temp=='m'){
albertoli 0:87d9eb921232 47 myled1=1;
albertoli 0:87d9eb921232 48 music=1;
albertoli 0:87d9eb921232 49 }
albertoli 0:87d9eb921232 50 serial_mutex.unlock();
albertoli 0:87d9eb921232 51 }
albertoli 0:87d9eb921232 52 }
albertoli 0:87d9eb921232 53 }
albertoli 0:87d9eb921232 54
albertoli 0:87d9eb921232 55 void check_temp() {
albertoli 0:87d9eb921232 56 float tempC, tempF;
albertoli 0:87d9eb921232 57 while (1) {
albertoli 0:87d9eb921232 58 //conversion to degrees C - from sensor output voltage per LM61 data sheet
albertoli 0:87d9eb921232 59 tempC = ((LM61*3.3) - 0.600)*100.0;
albertoli 0:87d9eb921232 60 //convert to degrees F
albertoli 0:87d9eb921232 61 tempF = (9.0*tempC) / 5.0 + 32.0;
albertoli 0:87d9eb921232 62 temp_out = tempF + 16.7;
albertoli 0:87d9eb921232 63 //print current temp
albertoli 0:87d9eb921232 64 Thread::wait(500);
albertoli 0:87d9eb921232 65 }
albertoli 0:87d9eb921232 66 }
albertoli 0:87d9eb921232 67
albertoli 0:87d9eb921232 68 void deliver_snack()
albertoli 0:87d9eb921232 69 { while(1){
albertoli 0:87d9eb921232 70 if (treat == 1) {
albertoli 0:87d9eb921232 71 myservo = 1; //closed position
albertoli 0:87d9eb921232 72 Thread::wait(1000);
albertoli 0:87d9eb921232 73 myservo = .7; //open position
albertoli 0:87d9eb921232 74 Thread::wait(200); // open for .2 secs delivers half a small tupperware
albertoli 0:87d9eb921232 75 myservo = 1;
albertoli 0:87d9eb921232 76 Thread::wait(500);
albertoli 0:87d9eb921232 77 treat = 0;
albertoli 0:87d9eb921232 78 myled2=0;
albertoli 0:87d9eb921232 79 }
albertoli 0:87d9eb921232 80 Thread::yield();
albertoli 0:87d9eb921232 81 }
albertoli 0:87d9eb921232 82 }
albertoli 0:87d9eb921232 83
albertoli 0:87d9eb921232 84
albertoli 0:87d9eb921232 85
albertoli 0:87d9eb921232 86
albertoli 0:87d9eb921232 87 char* getOut()
albertoli 0:87d9eb921232 88 {
albertoli 0:87d9eb921232 89 char output[22];
albertoli 0:87d9eb921232 90
albertoli 0:87d9eb921232 91 snprintf(output, 22, "%3.1f, %4.0f, %1.5f \n", temp_out, rpm_out, wheel_speed_out);
albertoli 0:87d9eb921232 92 return output;
albertoli 0:87d9eb921232 93 }
albertoli 0:87d9eb921232 94
albertoli 0:87d9eb921232 95 void send_data() {
albertoli 0:87d9eb921232 96 while(1)
albertoli 0:87d9eb921232 97 {
albertoli 0:87d9eb921232 98 serial_mutex.lock();
albertoli 0:87d9eb921232 99 pi.puts(getOut());
albertoli 0:87d9eb921232 100 serial_mutex.unlock();
albertoli 0:87d9eb921232 101 Thread::wait(5000);
albertoli 0:87d9eb921232 102
albertoli 0:87d9eb921232 103 }
albertoli 0:87d9eb921232 104 }
albertoli 0:87d9eb921232 105
albertoli 0:87d9eb921232 106 void pulses() {
albertoli 0:87d9eb921232 107 count++;
albertoli 0:87d9eb921232 108 }
albertoli 0:87d9eb921232 109
albertoli 0:87d9eb921232 110 void check_wheel() {
albertoli 0:87d9eb921232 111 double rpm = 0;
albertoli 0:87d9eb921232 112 double speed = 0;
albertoli 0:87d9eb921232 113 double circumference = 0.266 * 3.1416; // 26. cm wheel diameter * pi
albertoli 0:87d9eb921232 114 risingEdge.rise(&pulses);
albertoli 0:87d9eb921232 115 long int temp = count;
albertoli 0:87d9eb921232 116 while (1) {
albertoli 0:87d9eb921232 117 count = 0;
albertoli 0:87d9eb921232 118 t.reset();
albertoli 0:87d9eb921232 119 t.start();
albertoli 0:87d9eb921232 120 while (t.read_ms() < 2001) {
albertoli 0:87d9eb921232 121 ;
albertoli 0:87d9eb921232 122 }
albertoli 0:87d9eb921232 123 t.stop();
albertoli 0:87d9eb921232 124 temp=count;
albertoli 0:87d9eb921232 125 double rev = (double)temp;
albertoli 0:87d9eb921232 126 double rpm = rev * 30;
albertoli 0:87d9eb921232 127 double speed = circumference * rev;
albertoli 0:87d9eb921232 128 rpm_out = (float)rpm;
albertoli 0:87d9eb921232 129 wheel_speed_out = (float)speed;
albertoli 0:87d9eb921232 130 }
albertoli 0:87d9eb921232 131 }
albertoli 0:87d9eb921232 132
albertoli 0:87d9eb921232 133
albertoli 0:87d9eb921232 134 int main() {
albertoli 0:87d9eb921232 135 //printf("Hello, in Main");
albertoli 0:87d9eb921232 136 Thread t1(check_temp);
albertoli 0:87d9eb921232 137 Thread t2(send_data);
albertoli 0:87d9eb921232 138 Thread t3(check_wheel);
albertoli 0:87d9eb921232 139 Thread t4(dev_recv);
albertoli 0:87d9eb921232 140 Thread t5(deliver_snack);
albertoli 0:87d9eb921232 141
albertoli 0:87d9eb921232 142 while (1) {
albertoli 0:87d9eb921232 143 if (music == 1) {
albertoli 0:87d9eb921232 144 FILE *wave_file = fopen("/sd/wavfiles/crickets.wav", "r");
albertoli 0:87d9eb921232 145 waver.play(wave_file);
albertoli 0:87d9eb921232 146 fclose(wave_file);
albertoli 0:87d9eb921232 147 Thread::wait(1000);
albertoli 0:87d9eb921232 148 music = 0;
albertoli 0:87d9eb921232 149 myled2=0;
albertoli 0:87d9eb921232 150 }
albertoli 0:87d9eb921232 151 }
albertoli 0:87d9eb921232 152 }