// SerialIn_SerialOut_HM-10_01 // // Uses hardware serial to talk to the host computer and AltSoftSerial for communication with the bluetooth module // // What ever is entered in the serial monitor is sent to the connected device // Anything received from the connected device is copied to the serial monitor // Does not send line endings to the HM-10 // // Pins // BT VCC to Arduino 5V out. // BT GND to GND // Arduino D8 (SS RX) - BT TX no need voltage divider // Arduino D9 (SS TX) - BT RX through a voltage divider (5v to 3.3v) // #include AltSoftSerial BTserial; //subscribtions; bool subbutton = false; char c=' '; boolean NL = true; //for sendeing messages char message[15]; String dummy; char incoming[15]; boolean msgrec=false; char group; char specifier; const int buttonPin = 2; int buttonState = 0; const int ledPin = 5; void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); Serial.print("Sketch: "); Serial.println(__FILE__); Serial.print("Uploaded: "); Serial.println(__DATE__); Serial.println(" "); BTserial.begin(9600); Serial.println("BTserial started at 9600"); } void loop() { // Read from the Bluetooth module int i = 0; if(BTserial.available()) { c = BTserial.read(); if(c=='[') { incoming[i]=c; i++; msgrec=true; //delay because the ble module has to send the new data delay(2); while(BTserial.available()) { c = BTserial.read(); if(c==']') { incoming[i]=c; evaluateInput(incoming,i); i++; break; } incoming[i]=c; i++; //delay because the ble module has to send the new data delay(2); } } } //print to screen maybe debug? if(msgrec) { for(int j = 0; j" character. if (NL) { Serial.print("\r\n>"); NL = false; } Serial.write(c); if (c==10) { NL = true; } }*/ } void evaluateInput(char message[],int lastchar) { int colonCount=0; int secondColonPos; for(int i = 1;i<= lastchar;i++) { if(message[i]==':') { colonCount++; if(colonCount == 2) { secondColonPos = i; } } } if(colonCount!=2) { Serial.println("msg incorrect format ::"); return; } int payloadSize = lastchar-secondColonPos-1; if(secondColonPos != 4) { Serial.println("msg incorrect format second Colon Pos"); return; } Serial.println(); Serial.println("payloadSize"); Serial.print(payloadSize); Serial.println(); group = message[1]; specifier = message[3]; char payload[payloadSize]; for(int i=0; i< payloadSize;i++) { payload[i]=message[secondColonPos+1+i]; } if(payloadSize==1) { executeFunctionCode(payload,group,specifier); return; } executeSetCode(payload,group,specifier); } void executeFunctionCode(char payload[],char group,char specifier) { switch (payload[0]) { case 'p': poll(group,specifier); break; case 's': subscribe(group,specifier); break; case 'u': unsubscribe(group,specifier); break; default: Serial.println(); Serial.println("payload problems in switch case payload1"); break; } } void unsubscribe(char group,char specifier) { switch (group) { case '1': //product info // poll_identification(specifier); break; case '2': //field sensor // poll_field(specifier); break; case '3': // left blank since the is no gyro break; case '4': //sensors and outputs unsub_sens(specifier); break; default: Serial.println(); Serial.println("payload problems in switch case spec1"); break; } } void unsub_sens(char specifier) { switch (specifier) { case '0': //LED color break; case '1': //vibro break; case '2': //buzzer break; case '3': subbutton=false; Serial.println(); Serial.println("button subscribed"); break; default: Serial.println(); Serial.println("payload problems in switch case indentifier1"); break; } } void subscribe(char group,char specifier) { switch (group) { case '1': //product info // poll_identification(specifier); break; case '2': //field sensor // poll_field(specifier); break; case '3': // left blank since the is no gyro break; case '4': //sensors and outputs sub_sens(specifier); break; default: Serial.println(); Serial.println("payload problems in switch case spec1"); break; } } void sub_sens(char specifier) { switch (specifier) { case '0': //LED clor break; case '1': //vibro break; case '2': //buzzer break; case '3': subbutton=true; Serial.println(); Serial.println("button subscribed"); break; default: Serial.println(); Serial.println("payload problems in switch case indentifier1"); break; } } void poll(char group,char specifier) { switch (group) { case '1': //product info poll_identification(specifier); break; case '2': //field sensor poll_field(specifier); break; case '3': // left blank since the is no gyro break; case '4': //sensors and outputs poll_sens(specifier); break; default: Serial.println(); Serial.println("payload problems in switch case group1"); break; } } void poll_identification(char specifier) { switch (specifier) { case '0': BTserial.write("[0:0:pengigle_1]"); break; case '1': BTserial.write("[0:0:PEN1]"); break; case '2': BTserial.write("[0:0:PENGIGB1]"); break; default: Serial.println(); Serial.println("payload problems in switch case indentifier1"); break; } } void poll_field(char specifier) { if(specifier == '0') { //call field sensor code } else { Serial.println(); Serial.println("Invalid command in poll_field"); } } void poll_sens(char specifier) { switch (specifier) { case '0': //LED clor break; case '1': //vibro break; case '2': //buzzer break; case '3': send_Button_data(); break; default: Serial.println(); Serial.println("payload problems in switch case indentifier1"); break; } } void send_Button_data() { buttonState = digitalRead(buttonPin); Serial.print("Button1: "); Serial.println(buttonState); dummy = "[4:2:"; dummy = dummy + buttonState + "]"; dummy.toCharArray(message,15); BTserial.write(message); } void executeSetCode(char payload[],char group,char specifier) { Serial.print("here"); if(payload[0] == '0' && group == '0' && specifier == '0'){ digitalWrite(ledPin,LOW); } if(payload[0] == '1' && group == '0' && specifier == '0'){ Serial.print("here"); digitalWrite(ledPin,HIGH); } } void checkButton() { if( buttonState != digitalRead(buttonPin)) { send_Button_data(); } }