This the the improved and updated project and program for the earlier automatic pill dispenser project. Includes and rfid, stepper, servo, led-ldr and a load sensor integrate. time stamp is sent to the cloud and saved..
Dependencies: EthernetInterface FXAS21002 FXOS8700 M2XStreamClient MFRC522 Servo jsonlite mbed-rtos mbed
Fork of Accel_Mag_Gyro_SensorStream_K64F_AGM01_M2X by
Revision 2:104683639374, committed 2018-04-26
- Comitter:
- khp007
- Date:
- Thu Apr 26 17:52:37 2018 +0000
- Parent:
- 1:5e587e213940
- Commit message:
- automated pill dispenser project model 2
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MFRC522.lib Thu Apr 26 17:52:37 2018 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/AtomX/code/MFRC522/#63d729186747
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Servo.lib Thu Apr 26 17:52:37 2018 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/Servo/#36b69a7ced07
--- a/main.cpp Tue Apr 25 23:41:37 2017 +0000 +++ b/main.cpp Thu Apr 26 17:52:37 2018 +0000 @@ -1,103 +1,179 @@ -/* - * Copyright (c) 2015 - 2016, Freescale Semiconductor, Inc. - * Copyright 2016-2017 NXP - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * o Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * - * o Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * o Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "FXAS21002.h" -#include "FXOS8700.h" +/////////Automated Pill Dispenser///////////// #include "mbed.h" #include "M2XStreamClient.h" #include "EthernetInterface.h" - -// Initialize Serial port -Serial pc(USBTX, USBRX); +#include "MFRC522.h" +#include "Servo.h" -// Initialize pins for I2C communication for sensors. Set jumpers J6,J7 in FRDM-STBC-AGM01 board accordingly. -FXOS8700 accel(D14,D15); -FXOS8700 mag(D14,D15); -FXAS21002 gyro(D14,D15); +#define SPI_SCLK D13 +#define SPI_MISO D12 +#define SPI_MOSI D11 //pints for the RFID reader +#define SPI_CS D10 +#define MF_RESET D9 + +MFRC522 RfChip(SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_CS, MF_RESET); //for the RFID chip +DigitalOut LedRed (LED_RED); // LED Red +DigitalOut LedGreen (LED_GREEN); // LED green +DigitalOut LedBlue (LED_BLUE); // LED blue + +DigitalOut pin1(D4); //output pins for the stepper motor +DigitalOut pin2(D5); +DigitalOut pin3(D6); +DigitalOut pin4(D7); + +AnalogIn LDRpin(A0); //analog output pin for the LDR + +AnalogIn gp1(A2); //Pins for the weight sensor +AnalogIn gp2(A3); + +Serial pc(USBTX, USBRX); +Servo LRmyservo(PTC5); // Set Sensor Stream details -char deviceId[] = "8b34bc421abf15b7ec6471fa19513a98"; // Device you want to push to -char streamAcc[] = "acc_rms"; // Stream you want to push to -char streamMag[] = "mag_rms"; // Stream you want to push to -char streamGyr[] = "gyr_rms"; // Stream you want to push to -char m2xKey[] = "737018ea33de7760ab346c85ae2d9d27"; // Your M2X API Key or Master API Key +char deviceId[] = "8b23ea86abb3aa26711d4d6b92cbfe12"; // Device you want to push to +char streamLdr[] = "ldr_data"; // Stream you want to push to +char streamLoad[] = "load_data"; // Stream you want to push to +char m2xKey[] = "e952c10fdf5d62986f9e229564c92c83"; // Your M2X API Key or Master API Key -int main() +//Sequence for the stepper motor +int stepSequence[8][4] = { + {0,0,0,1}, + {0,0,1,1}, + {0,0,1,0}, + {0,1,1,0}, + {0,1,0,0}, + {1,1,0,0}, + {1,0,0,0}, + {1,0,0,1}, +}; + +int main(){ + wait_ms(3000); + //turn all LEDs off + LedRed = 1; + LedGreen = 1; + LedBlue = 1; + // Intialize Ethernet connection -EthernetInterface eth; -eth.init(); -eth.connect(); -printf("Success. Connected!. Device IP Address is %s\r\n", eth.getIPAddress()); - - // Initialize the M2X client -Client client; -M2XStreamClient m2xClient(&client, m2xKey); -int ret; - - - // Configure Accelerometer FXOS8700, Magnetometer FXOS8700 & Gyroscope FXAS21002 - accel.accel_config(); - mag.mag_config(); - gyro.gyro_config(); + EthernetInterface eth; + eth.init(); + eth.connect(); + printf("Success. Connected!. Device IP Address is %s\r\n", eth.getIPAddress()); + // Initialize the M2X client + Client client; + M2XStreamClient m2xClient(&client, m2xKey); + int ret; + + //float ldr_time[3]; + float ldr_data=0.0; + //float load_time[3]; + float load_data=0.0; + + RfChip.PCD_Init(); // initialize RDID chip + + while (LedRed == 1) { + //code for stepper motor + int count_third = 0; + for(int j = 0; j <= 512; j++){ + if (count_third%3 == 0){ // rotate a third of a whole revolution + for (int i = 0; i < 8; i++){ + pin1 = stepSequence[i][0]; + pin2 = stepSequence[i][1]; + pin3 = stepSequence[i][2]; + pin4 = stepSequence[i][3]; + wait_ms(2); + } + } + count_third++; + } + LedRed = 1; + LedGreen = 1; + LedBlue = 1; + wait_ms(500); + + //code for RFID reader + for ( int k = 0; k < 40; k++){ + if ( ! RfChip.PICC_IsNewCardPresent()){ + wait_ms(50); + continue; + } + LedRed = 0; - float accel_data[3]; float accel_rms=0.0; - float mag_data[3]; float mag_rms=0.0; - float gyro_data[3]; float gyro_rms=0.0; - - printf("Begin Data Acquisition from FXOS8700 and FXAS21002....\r\n\r\n"); - wait(0.5); + // Select one of the cards + if ( ! RfChip.PICC_ReadCardSerial()){ + wait_ms(50); + continue; + } + // Print Card type + uint8_t piccType = RfChip.PICC_GetType(RfChip.uid.sak); + wait_ms(100); + } + } + /////Servo Time!!!!!!///// + float range = .0009; + LRmyservo.calibrate(range,45); + bool stop_Servo = false; + bool pill_Detected = false; + while (stop_Servo == false) { + LRmyservo = 1.45; + wait_ms(400); + LRmyservo = 0.45; + wait_ms(4000); + + for (int m = 0; m < 20; m++){ + float x = LDRpin * 1000; + if (x < 140){ + pill_Detected = true; + } + } + float x = LDRpin * 1000; + if (pill_Detected == true && x > 200){ + LedBlue = 0; + wait_ms(500); + stop_Servo = true; + ldr_data = 111; + } + } + ret = m2xClient.updateStreamValue(deviceId, streamLdr, ldr_data); + printf("send() returned %d\r\n", ret); + ldr_data = 0; + ret = m2xClient.updateStreamValue(deviceId, streamLdr, ldr_data); + printf("send() returned %d\r\n", ret); + - while(1) - { - accel.acquire_accel_data_g(accel_data); - accel_rms = sqrt(((accel_data[0]*accel_data[0])+(accel_data[1]*accel_data[1])+(accel_data[2]*accel_data[2]))/3); - printf("%4.2f,\t%4.2f,\t%4.2f,\t",accel_data[0],accel_data[1],accel_data[2]); - wait(0.01); - - mag.acquire_mag_data_uT(mag_data); - printf("%4.2f,\t%4.2f,\t%4.2f,\t",mag_data[0],mag_data[1],mag_data[2]); - mag_rms = sqrt(((mag_data[0]*mag_data[0])+(mag_data[1]*mag_data[1])+(mag_data[2]*mag_data[2]))/3); - wait(0.01); - - gyro.acquire_gyro_data_dps(gyro_data); - printf("%4.2f,\t%4.2f,\t%4.2f\r\n",gyro_data[0],gyro_data[1],gyro_data[2]); - gyro_rms = sqrt(((gyro_data[0]*gyro_data[0])+(gyro_data[1]*gyro_data[1])+(gyro_data[2]*gyro_data[2]))/3); - wait(0.01); - - ret = m2xClient.updateStreamValue(deviceId, streamAcc, accel_rms); - printf("send() returned %d\r\n", ret); - ret = m2xClient.updateStreamValue(deviceId, streamMag, mag_rms); - printf("send() returned %d\r\n", ret); - ret = m2xClient.updateStreamValue(deviceId, streamGyr, gyro_rms); - printf("send() returned %d\r\n", ret); - wait(1); + //Weight Sensor!!!!!!// + //Calibrate Sensor +// float sum = 0; +// for (int i = 0; i< 1000; i ++){ +// wait_ms(50); +// sum = (gp2) *10000 + sum; +// } + + float ave = 6877.67; +// float ave = sum/1000; + printf("the average is : %0.5f \r\n", ave); + bool stop_load = false; + while (stop_load == false) { + float weightOut1 = gp1*10000; + float weightOut2 = gp2*10000; + float difference = weightOut2-ave; + wait_ms(1000); + if (difference > 15){ + printf("I made it here"); + bool stop_load = true; + break; + } } - -} \ No newline at end of file + LedRed = 1; + LedGreen = 0; + LedBlue = 1; + + //mag.acquire_mag_data_uT(mag_data); + load_data = 0; + ret = m2xClient.updateStreamValue(deviceId, streamLoad, load_data); + load_data = 222; + ret = m2xClient.updateStreamValue(deviceId, streamLoad, load_data); + load_data = 0; + ret = m2xClient.updateStreamValue(deviceId, streamLoad, load_data); +} \ No newline at end of file