Release 1.0 supporting the Kinetis Freedom K64F board and NimbeLink NL-AB-ST-NCL and NimbeLink NL-SWSK. Tested with NL-SW-1xRTT-V and NL-SW-EVDO-V modems.
Dependencies: LIS3DH LM75B LPS331 mbed hts221
Getting Started Guide
Note for the NL-AB-ST-NCL: In order to use the NimbeLink NL-AB-ST-NCL with the NXP FRDM-K64F, you must populate Resistors R2 and R8 while removing resistors R1 and R7. The NimbeLink NL-AB-ST-NCL will not work with the FRDM-K64F unless this change is made.
Note for the NL-SWSK: In order to use the NimbeLink NL-SWSK with the NXP FRDM-K64F, you must move Jumpers J3 and J4 to pins 2 and 3. The NimbeLink NL-SWSK will not work with the FRDM-K64F unless this change is made.
- Place the Skywire Shield onto the FRDM-K64F as pictured
- Place the Skywire modem onto the Shield as picture and attach the antenna U.FL coax cable as pictured
- Screw in the antenna
- Plug the 12V wall supply into the Skywire Shield
- For serial debugging, plug a micro-USB cable into port J26 of the FRDM-K64F. If you are using Windows, make sure you have the serial drivers installed-please consult the guide at https://developer.mbed.org/handbook/Windows-serial-configuration for installation.Use a terminal emulation program such as TeraTerm with the following settings:
- Baud Rate: 115200
- Data: 8 bit
- Parity: none
- Stop: 1 bit
- Flow Control: none
- Go to https://freeboard.io/ and create a user account
- Once you are logged into your Freeboard account, go to https://freeboard.io/board/LhnbrX and clone the dashboard by clicking the CLONE link in the lower right corner
- Old revision of dashboard is available here: https://freeboard.io/board/jqlneI
- The new dashboard will show up on you account list under My Freeboards, you can then edit the name to whatever you like
- Under the Datasources tab on the dashboard, click the skywire link
- Change the THING NAME field to the MEID of the Skywire Modem. The MEID is printed on top of the modem. Otherwise, you can get the MEID from the serial output.
- Next Import the Skywire_Kinetis_K64_demo program into the online compiler
- Compile and upload to the FRDM-K64F, cycle power to the shield and the sensor data should start to upload to your new Freeboard.
main.cpp
- Committer:
- kylerodgers
- Date:
- 2015-08-12
- Revision:
- 1:e05da6207ebb
- Parent:
- 0:a096c02fb1b0
File content as of revision 1:e05da6207ebb:
/* main.cpp */ /* v1.1 * Copyright (C) 2015 nimbelink.com, MIT License * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "mbed.h" #include "LPS331.h" #include "LIS3DH.h" #include "LM75B.h" #include "hts221.h" // #define DeviceID "A100003E4226B3" //Freeboard DweetIO unique ID // dynamically assigning this based on modem's unique identifier below char DeviceID[15]; DigitalOut skywire_en(PTD3); //K64 FRDM DigitalOut skywire_rts(PTD2); //K64 FRDM DigitalOut skywire_dtr(PTD0); //K64 FRDM DigitalOut led_red(LED_RED); DigitalOut led_green(LED_GREEN); DigitalIn sw2(SW2); DigitalIn sw3(SW3); Serial pc(USBTX, USBRX); Serial skywire(PTC17, PTC16); //K64 FRDM I2C i2c(PTE25,PTE24); char msg[3]; LPS331 pressure(i2c); LM75B LM75_temp(PTE25,PTE24); LIS3DH accel(i2c, LIS3DH_V_CHIP_ADDR, LIS3DH_DR_NR_LP_100HZ, LIS3DH_FS_2G); HTS221 humidity(PTE25, PTE24); char str[255]; float latitude; float longitude; int number; volatile int rx_in=0; volatile int rx_out=0; const int buffer_size = 255; char rx_buffer[buffer_size+1]; char rx_line[buffer_size]; void Skywire_Rx_interrupt() { // Loop just in case more than one character is in UART's receive FIFO buffer // Stop if buffer full while ((skywire.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) { rx_buffer[rx_in] = skywire.getc(); rx_in = (rx_in + 1) % buffer_size; } return; } void read_line() { int i; i = 0; // Start Critical Section - don't interrupt while changing global buffer variables __disable_irq(); // Loop reading rx buffer characters until end of line character while ((i==0) || (rx_line[i-1] != '\n')) { // Wait if buffer empty if (rx_in == rx_out) { // End Critical Section - need to allow rx interrupt to get new characters for buffer __enable_irq(); while (rx_in == rx_out) { //pc.printf("..Read_line entered2.5\r\n"); } // Start Critical Section - don't interrupt while changing global buffer variables __disable_irq(); } rx_line[i] = rx_buffer[rx_out]; i++; rx_out = (rx_out + 1) % buffer_size; } // End Critical Section __enable_irq(); rx_line[i-1] = 0; return; } int WaitForResponse(char* response, int num) { do { read_line(); pc.printf("Waiting for: %s, Recieved: %s\r\n", response, rx_line); } while (strncmp(rx_line, response, num)); return 0; } void check_sw2(void) { if (sw2 == 0) { pc.printf("SW2 button pressed. \r\n"); // turn RED LED on to indicate provisioning process has started led_red = 0; led_green = 1; wait(1); // turn LEDs off led_red = 1; led_green = 1; skywire.printf("ATD*22899;\r\n"); WaitForResponse("#OTASP: 0", 9); pc.printf("Provisioning: #OTASP: 0 reached. \r\n"); // turn RED LED on led_red = 0; led_green = 1; WaitForResponse("#OTASP: 1", 9); pc.printf("Provisioning: #OTASP: 1 reached. \r\n"); // turn both LEDs on led_red = 0; led_green = 0; WaitForResponse("#OTASP: 2", 9); pc.printf("Provisioning: #OTASP: 2 reached. \r\n"); // turn GREEN LED on led_red = 1; led_green = 0; WaitForResponse("NO CARRIER", 10); pc.printf("Provisioning successfully completed. \r\n"); skywire.printf("AT#REBOOT"); // wait 10 seconds wait(10); } } void blinkRG(int blinkduration) { // blinkduration is measured in seconds led_red=1; led_green=0; while (blinkduration-- >=1){ led_red = led_green; led_green=!led_red; wait(1); } // leave the function with LEDs both off led_red=1; led_green=1; } void check_sw3(void) { if (sw3 == 0) { pc.printf("SW3 button pressed. \r\n"); // this button press is used to pause transmissions (to save data if the device is on forever); pc.printf("Transmissions are paused. \r\n"); // turn on RED LED led_green = 1; led_red = 0; // wait a few seconds for user to release the button. wait(3); // wait until user presses the button again to unpause while(sw3 ==1); pc.printf("Transmissions resumed. \r\n"); // turn LEDs off led_green = 1; led_red = 1; } } int main() { led_red = 1; led_green = 1; float axis[3]; float press; float temp; float humi; float dummy_temp; // turn on Skywire modem skywire_en = 1; // setup skywire UART skywire_rts=0; skywire_dtr=0; skywire.baud(115200); skywire.format(8, Serial::None, 1); // setup Skywire UART interrupt skywire.attach(&Skywire_Rx_interrupt, skywire.RxIrq); pc.baud(115200); pc.printf("Hello World from FRDM-K64F board.\r\n"); pc.printf("Starting Demo...\r\n"); pc.printf("Waiting for Skywire to Boot...\r\n"); // wait 10 seconds for modem to boot up and connect to network blinkRG(10); pc.printf("Waiting complete...\r\n"); LM75_temp.open(); //Turn off echo skywire.printf("ATE0\r\n"); WaitForResponse("OK", 2); // check to see if switch 2 is pressed, if so, execute provisioning sequence check_sw2(); // read out MEID number to use as unique identifier skywire.printf("AT#MEIDESN?\r\n"); wait(2); read_line(); read_line(); sscanf(rx_line, "%*s %14s,", DeviceID); pc.printf("Device MEID: %s \r\n", DeviceID); pc.printf("Connecting to Network...\r\n"); // get IP address skywire.printf("AT#SGACT=1,1\r\n"); WaitForResponse("#SGACT", 6); WaitForResponse("OK", 2); // use LEDs to indicate we're connected to the newtork led_red=0; led_green=0; // connect to dweet.io skywire.printf("AT#HTTPCFG=1,\"dweet.io\",80,0\r\n"); WaitForResponse("OK", 2); //get location approximation from cell tower information skywire.printf("AT#AGPSSND\r\n"); WaitForResponse("#AGPSRING:", 10); //debug_pc.printf("Skywire says: %s\r\n", rx_line); sscanf(rx_line, "%s %d,%f,%f,", str, &number, &latitude, &longitude); //debug_pc.printf("Location: Latt:%f, Long:%f\r\n", latitude, longitude); wait(3); while(1) { temp = (float)LM75_temp; temp = temp *9 /5 + 32; pc.printf("Temp = %.3f\r\n", temp); press=(float)pressure.value() / 4096; pc.printf("Pressure = %.3f\r\n", press); humidity.ReadTempHumi(&dummy_temp, &humi); pc.printf("Humidity = %.3f\r\n", humi); accel.read_data(axis); pc.printf("Accel = %.3f, %.3f, %.3f\r\n", axis[0], axis[1], axis[2]); wait(0.25); // turn LED Green to indicate transmission led_red=1; led_green = 0; //Report Sensor Data to dweet.io skywire.printf("AT#HTTPQRY=1,0,\"/dweet/for/%s?temp=%.3f&press=%.3f&humi=%.3f&X=%.3f&Y=%.3f&Z=%.3f&Latitude=%f&Longitude=%f\"\r\n", DeviceID, temp, press, humi, axis[0], axis[1], axis[2], latitude, longitude); WaitForResponse("#HTTPRING", 9); skywire.printf("AT#HTTPRCV=1\r\n"); WaitForResponse("OK", 2); led_green = 1; wait(2); // see if user has requested to pause transmissions check_sw3(); } }