You need to drink more water
Dependencies: HX711 SeeedGrayOLED XBeeLib mbed
main.cpp
- Committer:
- jehoon
- Date:
- 2015-09-23
- Revision:
- 0:6b3f26e7b431
File content as of revision 0:6b3f26e7b431:
#include "mbed.h" #include "XBeeLib.h" #include "HX711.h" #include "SeeedGrayOLED.h" // Seeed Grove: OLED Display 0.96" 96x96 #define REMOTE_NODE_ADDR64_MSB ((uint32_t)0x0013A200) #define REMOTE_NODE_ADDR64_LSB ((uint32_t)0x40e8282a) //#define REMOTE_NODE_ADDR64_LSB ((uint32_t)0x40B8EBCE) #define REMOTE_NODE_ADDR16 ((uint16_t)0xFFFF) #define REMOTE_NODE_ADDR64 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB) //// #define BOTTLE_SAMPLE_RATE 10 #define MAX_WATER 2000 // 2L unsigned int waterlog = 0; //// enum dataType { REQTOTAL = 0, SENDDATA }; enum status { NEED_SET_DEFAULT = 0, SET_DEFAULT, CHECK_BOTTLE, SENSE_WATER_LEVEL, WAIT_INPUT }; using namespace XBeeLib; Serial pc(DEBUG_TX, DEBUG_RX); HX711 gram(A1, A0, 64); DigitalIn default_button(D7); DigitalIn bottle_weight(D8); DigitalOut LED(D6); SeeedGrayOLED SeeedGrayOled(D14, D15); void Draw_OLED_log(uint8_t val); void OLED_Display(float val); static void receiveXbee(const RemoteXBee802& remote, bool broadcast, const uint8_t *const data, uint16_t len) { char tmp[50] = {'\0'}; #ifdef _DBG if (remote.is_valid_addr16b()) { printf("\r\n>> Got a %s 16-bit RX packet [%04x], len %d\r\nData: ", broadcast ? "BROADCAST" : "UNICAST", remote.get_addr16(), len); } else { printf("\r\n>> Got a %s 64-bit RX packet [%08x:%08x], len %d\r\nData: ", broadcast ? "BROADCAST" : "UNICAST", remote.get_addr64(), len); } #endif for (int i = 1; i < len; i++){ printf("%c", data[i]); tmp[i - 1] = data[i]; } printf("\r\n"); if(!strncmp("init",(char*)data,len)){ waterlog = 0; } } static void sendRemoteXbee(XBee802& xbee, const RemoteXBee802& RemoteDevice, uint8_t type ,long weight) { char data[20] = {'\0'}; sprintf(data, "%1d%i\0",type, weight); const uint16_t data_len = strlen(data); const TxStatus txStatus = xbee.send_data(RemoteDevice, (const uint8_t *)data, data_len); if (txStatus == TxStatusSuccess) printf(">> Send_data_to_remote_node OK... %s\r\n",data); else printf(">> send_data_to_remote_node failed with %d\r\n", (int)txStatus); } int checkWeight(){ long sum = 0; for(int i = 0; i < BOTTLE_SAMPLE_RATE; i++){ sum += gram.getGram(); wait_ms(100); } return sum / BOTTLE_SAMPLE_RATE; } void ledBlink(int cnt, int delay_ms = 50){ LED = 0; for(int i = 0; i < cnt; i++){ LED = 1; wait_ms(delay_ms); LED = 0; wait_ms(delay_ms); } } ////////////////////////////////////// ////////////////////////////////////// ////////////////////////////////////// ////////////////////////////////////// ////////////////////////////////////// ////////////////////////////////////// ////////////////////////////////////// int main() { pc.baud(9600); XBee802 xbee = XBee802(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600); /* Register callback */ xbee.register_receive_cb(&receiveXbee); RadioStatus const radioStatus = xbee.init(); MBED_ASSERT(radioStatus == Success); const RemoteXBee802 remoteDevice64b = RemoteXBee802(REMOTE_NODE_ADDR64); SeeedGrayOled.init(); // Initialize SEEED OLED display SeeedGrayOled.clearDisplay(); // Clear Display SeeedGrayOled.setNormalDisplay(); // Set Normal Display Mode // for(int i=0; i<2000; i+=100) // OLED_Display((float)i); OLED_Display(0); long Weight; //current weight long botWeight = 0; //bottle weight long WaterLevel = 0; long pWaterLevel = 0; long dWaterLevel = 0; uint8_t Status; Status = NEED_SET_DEFAULT; while (true) { if(!default_button) Status = SET_DEFAULT; else if(!bottle_weight) Status = CHECK_BOTTLE; switch(Status){ case NEED_SET_DEFAULT: // printf(">>> You need to set the default.\n>>>Press the SET KEY\n\n"); printf("."); wait(1); break; case SET_DEFAULT: gram.tare(); ledBlink(1, 100); printf(">>> Set the base weight\n"); Weight = 0; botWeight = 0; WaterLevel = 0; pWaterLevel = 0; Status = WAIT_INPUT; break; case CHECK_BOTTLE: pWaterLevel = 0; botWeight = checkWeight(); printf(">>> Your Bottle is %i g\n", botWeight); ledBlink(3); Status = SENSE_WATER_LEVEL; break; case SENSE_WATER_LEVEL: Weight = checkWeight(); WaterLevel = Weight - botWeight; printf("W: %i \t B: %i\n",WaterLevel,pWaterLevel); if(WaterLevel <= 10 && WaterLevel > -10) // allowable error break; else if(WaterLevel <= -10){ // error printf("WaterLevel: %i\n",WaterLevel); //Status = NEED_SET_DEFAULT; break; } if(WaterLevel < (pWaterLevel*0.95)){ wait(1); long check_again = checkWeight(); if(check_again < (WaterLevel*0.98) || check_again > (WaterLevel*1.02)) break; dWaterLevel = pWaterLevel - WaterLevel; ledBlink(5); waterlog += dWaterLevel; OLED_Display((float)waterlog); sendRemoteXbee(xbee, remoteDevice64b, SENDDATA,dWaterLevel); pWaterLevel = WaterLevel; } else if(WaterLevel > pWaterLevel){ wait(1); long check_again = checkWeight(); if(check_again < (WaterLevel*0.98) || check_again > (WaterLevel*1.02)) break; pWaterLevel = WaterLevel; } break; case WAIT_INPUT: default: break; } wait_ms(100); } } void OLED_Display(float val) { if(val < MAX_WATER*0.03) Draw_OLED_log(0); else if(val < MAX_WATER*0.10) Draw_OLED_log(10); else if(val < MAX_WATER*0.30) Draw_OLED_log(30); else if(val < MAX_WATER*0.40) Draw_OLED_log(40); else if(val < MAX_WATER*0.60) Draw_OLED_log(60); else if(val < MAX_WATER*0.70) Draw_OLED_log(70); else if(val < MAX_WATER*0.80) Draw_OLED_log(80); else if(val < MAX_WATER*0.90) Draw_OLED_log(90); else if(val < MAX_WATER) Draw_OLED_log(100); else Draw_OLED_log(0); } void Draw_OLED_log(uint8_t val) { SeeedGrayOled.setTextXY(0, 1); SeeedGrayOled.putString("more water"); SeeedGrayOled.setTextXY(11, 0); SeeedGrayOled.putString("Reach to 2L"); switch(val) { case 0: SeeedGrayOled.setTextXY(1, 0); SeeedGrayOled.putString("==========="); SeeedGrayOled.setTextXY(2, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(3, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(4, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(5, 0); SeeedGrayOled.putString("| 0 % |"); SeeedGrayOled.setTextXY(6, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(7, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(8, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(9, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(10, 0); SeeedGrayOled.putString("-----------"); break; case 10: SeeedGrayOled.setTextXY(1, 0); SeeedGrayOled.putString("==========="); SeeedGrayOled.setTextXY(2, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(3, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(4, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(5, 0); SeeedGrayOled.putString("| 10 % |"); SeeedGrayOled.setTextXY(6, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(7, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(8, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(9, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(10, 0); SeeedGrayOled.putString("-----------"); break; case 30: SeeedGrayOled.setTextXY(1, 0); SeeedGrayOled.putString("==========="); SeeedGrayOled.setTextXY(2, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(3, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(4, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(5, 0); SeeedGrayOled.putString("| 30 % |"); SeeedGrayOled.setTextXY(6, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(7, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(8, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(9, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(10, 0); SeeedGrayOled.putString("-----------"); break; case 40: SeeedGrayOled.setTextXY(1, 0); SeeedGrayOled.putString("==========="); SeeedGrayOled.setTextXY(2, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(3, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(4, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(5, 0); SeeedGrayOled.putString("| 40 % |"); SeeedGrayOled.setTextXY(6, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(7, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(8, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(9, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(10, 0); SeeedGrayOled.putString("-----------"); break; case 60: SeeedGrayOled.setTextXY(1, 0); SeeedGrayOled.putString("==========="); SeeedGrayOled.setTextXY(2, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(3, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(4, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(5, 0); SeeedGrayOled.putString("| 60 % |"); SeeedGrayOled.setTextXY(6, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(7, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(8, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(9, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(10, 0); SeeedGrayOled.putString("-----------"); break; case 70: SeeedGrayOled.setTextXY(1, 0); SeeedGrayOled.putString("==========="); SeeedGrayOled.setTextXY(2, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(3, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(4, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(5, 0); SeeedGrayOled.putString("|~~ 70 %~~|"); SeeedGrayOled.setTextXY(6, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(7, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(8, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(9, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(10, 0); SeeedGrayOled.putString("-----------"); break; case 80: SeeedGrayOled.setTextXY(1, 0); SeeedGrayOled.putString("==========="); SeeedGrayOled.setTextXY(2, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(3, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(4, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(5, 0); SeeedGrayOled.putString("|~~ 80 %~~|"); SeeedGrayOled.setTextXY(6, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(7, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(8, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(9, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(10, 0); SeeedGrayOled.putString("-----------"); break; case 90: SeeedGrayOled.setTextXY(1, 0); SeeedGrayOled.putString("==========="); SeeedGrayOled.setTextXY(2, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(3, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(4, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(5, 0); SeeedGrayOled.putString("|~~ 90 %~~|"); SeeedGrayOled.setTextXY(6, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(7, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(8, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(9, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(10, 0); SeeedGrayOled.putString("-----------"); break; case 100: SeeedGrayOled.setTextXY(1, 0); SeeedGrayOled.putString("==========="); SeeedGrayOled.setTextXY(2, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(3, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(4, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(5, 0); SeeedGrayOled.putString("|~~100 %~~|"); SeeedGrayOled.setTextXY(6, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(7, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(8, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(9, 0); SeeedGrayOled.putString("|~~~~~~~~~|"); SeeedGrayOled.setTextXY(10, 0); SeeedGrayOled.putString("-----------"); break; default: // 20 SeeedGrayOled.setTextXY(2, 0); SeeedGrayOled.putString("-----------"); SeeedGrayOled.setTextXY(3, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(4, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(5, 0); SeeedGrayOled.putString("| 0 % |"); SeeedGrayOled.setTextXY(6, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(7, 0); SeeedGrayOled.putString("| ~"); SeeedGrayOled.setTextXY(8, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(9, 0); SeeedGrayOled.putString("| |"); SeeedGrayOled.setTextXY(10, 0); SeeedGrayOled.putString("-----------"); break; } }