Projet de mesure Avec enregistrement sur une carte SD et envoie sur BLUETOOTH ble (bluenrg)
Dependencies: SDFileSystem mbed-rtos mbed-src
main.cpp
- Committer:
- mullercamille
- Date:
- 2015-04-21
- Revision:
- 0:db6d3d47e902
File content as of revision 0:db6d3d47e902:
/* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mbed.h" //#include "BatteryService.h" #include "mbed.h" #include <FileBase.h> #include "SDFileSystem.h" #include "rtos.h" #include <Thread.h> #include <stdio.h> /* C++ header files */ #include <string> #include <vector> /* C header files */ #include <cstdio> #include <cstring> #include <cstdlib> //#include "ST_L152_32MHZ.h" //L152_init32 myinit(0); // use the internal oscillator using namespace std; // DEFINE #define NBFICHIERPOSSIBLE 1000 // STRUCTURE typedef struct { AnalogIn * laPin; DigitalOut * laPinEco; // string leTypeGPIO; // Num ou Anal // string leTypeE; // Entrée ou Sortie int laFrequence; int leModeEco; // Si -1 pas de mode eco sinon numero de pin std::string * leNom; std::string * Path; } laSonde; typedef struct { laSonde * saSonde; float saMesure; int sonTemps; } laMesure; // VAR GLOBAL Mail<laMesure, 30> mail_box; Serial pc1(USBTX, USBRX); //SDFileSystem sd(PB_15, PB_14, PB_13, D4, "sd"); // MOSI, MISO, SCK, CS SDFileSystem sd(D11, D12, D13, D4, "sd"); // MOSI, MISO, SCK, CS Timer t; volatile int a=0; Mutex mtx; PinName analog[6] = { A0, A1,A2,A3,A4,A5 }; PinName digital[16] = {D0,D1,D2,NC,NC,NC,D6,D7,D8,D9,D10,NC,NC,NC,D14,D15 }; /** * Récuperation de data */ void getdata(void const *args) { laSonde * saSonde = (laSonde*) args; while(1) { //mtx.lock(); if(saSonde->leModeEco != -1) saSonde->laPinEco->write(1); laMesure *message = mail_box.alloc(); message->saSonde = saSonde; message->saMesure = saSonde->laPin->read(); message->sonTemps = t.read(); mail_box.put(message); if(saSonde->leModeEco != -1) saSonde->laPinEco->write(0); a++; //mtx.unlock(); Thread::wait(saSonde->laFrequence/100); } } void configuration() { t.start(); FILE *fp = fopen("/sd/config.csv", "r"); // Open "out.txt" on the local file system for writing if(fp == NULL) { pc1.printf("Le fichier de configuration n'existe pas"); } else { char buf [128]; // mtx.lock(); // init du mutex while(1) { if((fgets(buf, 64, fp)) == NULL) break; int a =0; char delim[] = ","; char* token; laSonde * saSonde = (laSonde * ) malloc(sizeof(laSonde)); for (token = strtok(buf, delim); token; token = strtok(NULL, delim)) { switch(a) { case 0 : { // Nom de la pin printf("%s \n",token); saSonde->leNom = new string(token); saSonde->Path = new string(token); saSonde->Path->insert(0,"/sd/"); mkdir(saSonde->Path->c_str(),0777); saSonde->Path->insert(saSonde->Path->size(),"/"); saSonde->Path->insert(saSonde->Path->size(),token); break; } case 1 : { // Numéro de Pin saSonde->laPin = new AnalogIn(analog[atoi((const char*)token)]); break; } case 2 : { // Type Analogique ou Numerique //saSonde->leTypeGPIO = laLigne.at(2); // Num ou Anal break; } case 3 : { // Entrée ou Sortie //saSonde->leTypeE = laLigne.at(3); // Entrée ou Sortie break; } case 4 : { // Frequence pour Sortie saSonde->laFrequence = atoi((const char*)token); break; } case 5 : { // Mode éco saSonde->leModeEco = atoi((const char*)token); // Si -1 pas de mode eco break; } default : { printf("error parsing\n)"); } } a++; } if(saSonde->leModeEco != -1) saSonde->laPinEco = new DigitalOut(digital[saSonde->leModeEco]); printf("created thread \n"); Thread* unThread = new Thread(getdata,saSonde); }//mtx.unlock(); // init du mutex } } int main(void) { #if 1 FILE *fp; char cc[200]; configuration(); while (true) { osEvent evt = mail_box.get(); if (evt.status == osEventMail) { // mtx.lock(); a--; laMesure *mail = (laMesure*)evt.value.p; fp = fopen(mail->saSonde->Path->c_str(), "a"); if (fp == 0) { printf("file write failed: %s\n", mail->saSonde->Path->c_str()); } else { sprintf(cc,"%d,%f\n",mail->sonTemps,mail->saMesure); printf("%d,%f\n",mail->sonTemps,mail->saMesure); fwrite (cc , sizeof(char), sizeof(cc), fp); } fclose(fp); mail_box.free(mail); // mtx.unlock(); } } #else wait(3); AnalogIn laPin(A0); AnalogOut aout(A2); while (1) { // change the voltage on the digital output pin by 0.1 * VCC // and print what the measured voltage should be (assuming VCC = 3.3v) for (float i = 0.0f; i < 1.0f; i += 0.1f) { aout = i; printf("aout = %1.2f volts", aout.read() * 3.3f); wait(0.4); pc1.printf("Test : %f volts \n",(laPin.read()*(3.33 )) ); wait(5); } } #endif }