Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed X_NUCLEO_IKS01A2 X_NUCLEO_IDB0XA1 BLE_API
Revision 3:60fe58ad8c7d, committed 2017-11-24
- Comitter:
- waby38
- Date:
- Fri Nov 24 16:03:25 2017 +0000
- Parent:
- 2:74b8978081c5
- Commit message:
- Last updates
Changed in this revision
--- a/X_NUCLEO_IKS01A1.lib Fri Jun 16 12:23:52 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://developer.mbed.org/teams/ST/code/X_NUCLEO_IKS01A1/#d1c67d482bad
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/X_NUCLEO_IKS01A2.lib Fri Nov 24 16:03:25 2017 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/ST/code/X_NUCLEO_IKS01A2/#138a7a28bd21
--- a/main.cpp Fri Jun 16 12:23:52 2017 +0000
+++ b/main.cpp Fri Nov 24 16:03:25 2017 +0000
@@ -15,44 +15,62 @@
*/
#include "mbed.h"
-#include "x_nucleo_iks01a1.h"
+#include "XNucleoIKS01A2.h"
#include "ble/BLE.h"
#include "ble/services/UARTService.h"
#include "Serial.h"
-static uint8_t panel_disppage=0;
-
-/* Instantiate the expansion board */
+/* Instantiate the mems expansion board */
+static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
-static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
-static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
-static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
-static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
-static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
-static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
+/* Retrieve the composing elements of the expansion board */
+static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer;
+static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
+static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
+static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
+static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
+/* BLE part */
#define UART_BUFFER (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN*10)
-
-const static char DEVICE_NAME[] = "LEDPANEL";
+const static char DEVICE_NAME[] = "$PANEL$";
UARTService *uartServicePtr;
static char BLEBuffRX[UART_BUFFER];
static uint8_t BLEBuffPos=0;
+void onBleError(ble_error_t error);
+/* pc uart part */
static char uartBuff[UART_BUFFER];
static uint8_t uartBuffPos=0;
+Serial uart1(USBTX,USBRX);
+#define DEBUG uart1.printf
-void onBleError(ble_error_t error);
+/* Led panel part */
+#define PANEL_PAGE_NUMBER 26
+#define PANEL_PAGE_SIZE 256
+Serial uart_panel(PA_9,PA_10);
+static uint8_t panel_disppage=0;
+static char panel_msg[PANEL_PAGE_NUMBER][PANEL_PAGE_SIZE]={
+ "<FE><MA><WC><FE>Bienvenue a STMicroeletronics",
+ "<FE><MA><WC><FE>Welcome to STMicroeletronics",
+ "<FE><MA><WC><FE>Today is <KD>",
+ "<FE><MA><WC><FE>It is <KT>",
+ "<FE><MA><WC><FE>Temp is <TEMPERAT>",
+ "<FE><MA><WC><FE>I am a <CE>STM32L476",
+ "<FE><MA><WC><FE>with <CE>MEMs <CB>and <CE>BLE <CB>shields"
+};
+
+typedef enum {
+ SCROLL_DEFAULT,
+ SCROLL_LEFT,
+ SCROLL_RIGHT,
+ SCROLL_UP,
+ SCROLL_DOWN
+} panel_effect_e ;
+panel_effect_e panel_effect = SCROLL_DEFAULT;
DigitalOut led1(LED1);
-Serial uart1(USBTX,USBRX);
-Serial uart_panel(PA_9,PA_10);
Ticker ticker;
-
-
-
-#define DEBUG uart1.printf
-
/* Helper function for printing floats & doubles */
static char *printDouble(char* str, double v, int decimalDigits=2)
{
@@ -87,101 +105,166 @@
return str;
}
-/*void temp(void){
- float value1, value2;
- char buffer1[32], buffer2[32];
- temp_sensor1->get_temperature(&value1);
- humidity_sensor->get_humidity(&value2);
- }*/
-/* Ticker */
void panel_sendmsg(char line, char page, char* text){
- char buff[256];
- char* pos_t;
+ char buff[PANEL_PAGE_SIZE];
+ char* pos_t;
+ char* pos_p;
+ char* pos_h;
+ char* pos_e;
+ char* panel_reset;
uint8_t i, checksum=0;
+ pos_t=strstr(text,"<SC>");
+ if(pos_t!=0) {
+ sprintf(buff,"<ID00>%s",text);
+ for(i=6; i<strlen(buff); i++){
+ checksum ^= buff[i];
+ }
+ sprintf(buff,"%s%02X<E>", buff, checksum);
+ uart1.printf("panel msg = %s\r\n", buff);
+ uart_panel.printf(buff);
+ return;
+ }
sprintf(buff, "<ID00><L%c><P%c>%s", line, page, text);
- pos_t=strstr(buff,"<TEMP>");
- if(pos_t!=0){
+ pos_t=strstr(buff,"<TEMPERAT>");
+ if(pos_t!=0) {
float sensor_temp;
char temp[3];
- temp_sensor1->get_temperature(&sensor_temp);
+ hum_temp->get_temperature(&sensor_temp);
sprintf(temp, "%02d", (int)sensor_temp);
buff[pos_t-buff]=' '; /* replace < */
- buff[pos_t-buff+1]=temp[0]; /* replace T */
- buff[pos_t-buff+2]=temp[1]; /* replace E */
- buff[pos_t-buff+3]='°'; /* replace M */
- buff[pos_t-buff+4]='C'; /* replace P */
- buff[pos_t-buff+5]=' '; /* replace > */
+ buff[pos_t-buff+1]=temp[0]; /* replace T */
+ buff[pos_t-buff+2]=temp[1]; /* replace E */
+ buff[pos_t-buff+3]='<'; /* replace M */
+ buff[pos_t-buff+4]='U'; /* replace P */
+ buff[pos_t-buff+5]='3'; /* replace E */
+ buff[pos_t-buff+6]='A'; /* replace R */
+ buff[pos_t-buff+7]='>'; /* replace A */
+ buff[pos_t-buff+8]='C'; /* replace T */
+ buff[pos_t-buff+9]=' '; /* replace > */
+ }
+ pos_p=strstr(buff,"<PRESSI>");
+ if(pos_p!=0) {
+ float sensor_pres;
+ char pres[3];
+ press_temp->get_pressure(&sensor_pres);
+ sprintf(pres, "%02d", (int)sensor_pres);
+ buff[pos_p-buff]=' '; /* replace < */
+ buff[pos_p-buff+1]=pres[0]; /* replace P */
+ buff[pos_p-buff+2]=pres[1]; /* replace R */
+ buff[pos_p-buff+3]='m'; /* replace E */
+ buff[pos_p-buff+4]='B'; /* replace S */
+ buff[pos_p-buff+5]='a'; /* replace S */
+ buff[pos_p-buff+6]='r'; /* replace I */
+ buff[pos_p-buff+7]=' '; /* replace > */
+
}
+ pos_h=strstr(buff,"<HUM>");
+ if(pos_h!=0) {
+ float sensor_hum;
+ char hum[3];
+ hum_temp->get_humidity(&sensor_hum);
+ sprintf(hum, "%02d", (int)sensor_hum);
+ buff[pos_h-buff]=' '; /* replace < */
+ buff[pos_h-buff+1]=hum[0]; /* replace H */
+ buff[pos_h-buff+2]=hum[1]; /* replace U */
+ buff[pos_h-buff+3]='\''; /* replace M */
+ buff[pos_h-buff+4]=' '; /* replace > */
+ }
+ switch(panel_effect) {
+ case SCROLL_RIGHT:
+ pos_e=strstr(buff,"<F");
+ buff[pos_e-buff+2]='F';
+ buff[pos_e-buff+14]='F';
+ break;
+ case SCROLL_LEFT:
+ pos_e=strstr(buff,"<F");
+ buff[pos_e-buff+2]='E';
+ buff[pos_e-buff+14]='E';
+ break;
+ case SCROLL_UP:
+ pos_e=strstr(buff,"<F");
+ buff[pos_e-buff+2]='I';
+ buff[pos_e-buff+14]='I';
+ break;
+ case SCROLL_DOWN:
+ pos_e=strstr(buff,"<F");
+ buff[pos_e-buff+2]='J';
+ buff[pos_e-buff+14]='J';
+ break;
+ case SCROLL_DEFAULT:
+ /* No change */
+ break;
+ }
+ panel_reset=strstr(buff,"<RES>");
+ if(panel_reset!=0){
+ sprintf(buff,"<ID00><D*>");
+ }
+
for(i=6; i<strlen(buff); i++){
checksum ^= buff[i];
}
sprintf(buff,"%s%02X<E>", buff, checksum);
- uart1.printf("pannel msg = %s temp@ %s pos_t@ %d\r\n", buff, pos_t, pos-buff);
+
+ uart1.printf("panel msg = %s pos_d@ %d\r\n", buff, pos_h-buff);
uart_panel.printf(buff);
- wait(1);
+ wait(0.1);
checksum=0;
- if(panel_disppage < (page-'A'+1)){
- panel_disppage = page-'A';
- sprintf(buff, "<ID00><TA>00010100009912302359%c",page);
+ if(panel_disppage < page-'A'+1){
+ panel_disppage = page-'A'+1;
+ sprintf(buff, "<ID00><TA>00010100009912302359");
for(i=0; i<panel_disppage; i++){
-
sprintf(buff,"%s%c",buff,i+'A');
-
- //sprintf(buff,"%s%c",buff,i+'A');
}
for(i=6; i<strlen(buff); i++){
checksum ^= buff[i];
}
sprintf(buff,"%s%02X<E>", buff, checksum);
- uart1.printf("pannel msg = %s\r\n", buff);
+ uart1.printf("panel msg = %s\r\n", buff);
+
uart_panel.printf(buff);
}
}
-void periodicCallback(void)
-{
- float sensor_temp, sensor_humidity;
-// int32_t axes[3];
-// char buffer1[32], buffer2[32];
+void periodicCallback(void){
+ int32_t axes[3];
+ panel_effect_e new_panel_effect;
+ acc_gyro->get_x_axes(axes);
+ new_panel_effect = SCROLL_DEFAULT;
+
+ accelerometer->enable();
+ acc_gyro->enable_x();
- led1 = !led1;
- temp_sensor1->get_temperature(&sensor_temp);
- humidity_sensor->get_humidity(&sensor_humidity);
-// printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
-//magnetometer->get_m_axes(axes);
-// printf("LIS3MDL [mag/mgauss]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
-
-// accelerometer->get_x_axes(axes);
-// printf("LSM6DS0 [acc/mg]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
-#if 0
- gyroscope->get_g_axes(axes);
- if(axes[0]>6000){
- char* gyro_arriere="1A<FE><MA><WC><FE>Axe Z vers l'arriere";
- panel_sendmsg(gyro_arriere[1],gyro_arriere[2],(char *)&gyro_arriere[3]);
+// DEBUG("accelerometer : %d %d %d\r\n", axes[0], axes[1], axes[2]);
+ if(axes[1]<-800){ /* move up */
+ new_panel_effect = SCROLL_UP;
+ }
+ if(axes[1]>800){ /* move down */
+ new_panel_effect = SCROLL_DOWN;
+ }
+ if(axes[0]<-800){ /* move to left */
+ new_panel_effect = SCROLL_LEFT;
}
- else if(axes[0]<-6000){
- char* gyro_avant="1A<FE><MA><WC><FE>Axe Z vers l'avant";
- panel_sendmsg(gyro_avant[1],gyro_avant[2],(char *)&gyro_avant[3]);
+ if(axes[0]>800){ /* move to right */
+ new_panel_effect = SCROLL_RIGHT;
}
- if(axes[1]> 6000){
- char* gyro_droit= "1A<FE><MA><WC><FE>Axe Y vers la gauche";
- panel_sendmsg(gyro_droit[0],gyro_droit[1], (char *)&gyro_droit[2]);}
- else if(axes[2]< -6000){
- char* gyro_gauche= "1A<FE><MA><WC><FE>Axe Y vers la droite";
- panel_sendmsg(gyro_gauche[0],gyro_gauche[1], (char *)&gyro_gauche[2]);}
-
- if(axes[2]> 6000){
- char* gyro_anti_horaire= "1A<FE><MA><WC><FE>Axe X vers la gauche";
- panel_sendmsg(gyro_anti_horaire[0],gyro_anti_horaire[1], (char *)&gyro_anti_horaire[2]);}
- else if(axes[2]< -6000){
- char* gyro_horaire= "1A<FE><MA><WC><FE>Axe X vers la droite";
- panel_sendmsg(gyro_horaire[0],gyro_horaire[1], (char *)&gyro_horaire[2]);}
- }
-// printf("LSM6DS0 [gyro/mdps]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
-#endif
+ if(new_panel_effect != panel_effect){
+ uint8_t i=0;
+ panel_effect=new_panel_effect;
+ /* while(strlen(panel_msg[i])){
+ panel_sendmsg('1','A'+i,panel_msg[i]);
+ i++;
+ } */
+ while(i<26){
+ if(strlen(panel_msg[i])){
+ panel_sendmsg('1','A'+i,panel_msg[i]);
+ }
+ i++;
+ }
+ }
+
}
/* UART */
@@ -194,6 +277,9 @@
/* We are sending the whole string even if less than BLE_UART_SERVICE_MAX_DATA_LEN otherwise we need to wait */
uartServicePtr->write(uartBuff, (uartBuffPos/UARTService::BLE_UART_SERVICE_MAX_DATA_LEN +1) * UARTService::BLE_UART_SERVICE_MAX_DATA_LEN);
DEBUG("TX : %s\r\n", uartBuff);
+ if(uartBuff[0]!='0'){
+ strcpy(panel_msg[uartBuff[1]-'A'],&uartBuff[2]);
+ }
panel_sendmsg(uartBuff[0],uartBuff[1], &uartBuff[2]);
memset(uartBuff, 0, UART_BUFFER);
uartBuffPos = 0;
@@ -207,17 +293,15 @@
void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params) {
DEBUG("BLE Client Connected!\n\r");
DEBUG("Please type a string and press return\r\n");
-
- ticker.attach(periodicCallback, 1);
+ led1 = 1;
}
void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
(void)params;
DEBUG("BLE Client Disconnected!\r\n");
- ticker.detach();
BLE::Instance().gap().startAdvertising(); // restart advertising
- led1=0;
+ led1= 0;
}
void BleOnDataWrittenCallback(const GattWriteCallbackParams *params) {
@@ -230,11 +314,26 @@
}
BLEBuffRX[BLEBuffPos-1]='\0';
DEBUG("TX=>Panel: L%c P%c =>%s<=\r\n", BLEBuffRX[0],BLEBuffRX[1], &BLEBuffRX[2]);
+ DEBUG("pos dans le pannel %x PANEL_PAGE_NUMBER%d\n\r",BLEBuffRX[1]-'A',PANEL_PAGE_NUMBER);
+ if(BLEBuffRX[0]!='0'){
+
+ int dippage=BLEBuffRX[1]-'A';
+ DEBUG("disppage: %x BLEBUFFRX=%d\n\r",dippage,BLEBuffRX[1]);
+ strcpy(panel_msg[BLEBuffRX[1]-'A'],&BLEBuffRX[2]);
+
+ DEBUG("panel_MGS: %s \n\r",panel_msg[26]);
+ }
panel_sendmsg(BLEBuffRX[0],BLEBuffRX[1], &BLEBuffRX[2]);
+ uart1.printf("%c\n",panel_msg);
BLEBuffPos=0;
+
+
+
}
+
}
+
void onBleError(ble_error_t error) {
DEBUG("BLE Error: %d\r\n");
/* Handle error now */
@@ -282,14 +381,22 @@
int main(void)
{
+ uint8_t i=0;
led1=0;
-
+ hum_temp->enable();
+ press_temp->enable();
uart_panel.baud(9600);
uart1.baud(115200);
uart1.attach(uartRx,Serial::RxIrq);
+ /* Init panel */
+ while(strlen(panel_msg[i])){
+ panel_sendmsg('1','A'+i,panel_msg[i]);
+ i++;
+ }
+
+ ticker.attach(periodicCallback, 2);
BLE &ble = BLE::Instance();
ble.init(bleInitComplete);
-
}