Send RF22 + INA219

Dependencies:   EthernetInterface INA219 NTPClient RF22 SDFileSystem mbed-rtos mbed

main.cpp

Committer:
MLev
Date:
2016-03-30
Revision:
0:07ea9fcff966

File content as of revision 0:07ea9fcff966:

#include "mbed.h"
#include "rtos.h"
#include <time.h>
#include <stdlib.h>
#include <RF22.h>
#include <RF22ReliableDatagram.h>
#include "SDFileSystem.h"
#include "INA219.hpp"
#include "EthernetInterface.h"
#include "NTPClient.h"
#include <string>

// Sample programm for ReliableDatagramm Sending
// Uses address 1 and sends to RF22 with address 2
// See notebook http://mbed.org/users/charly/notebook/rfm22/ for connecting RFM22 to mbed
SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
FILE *fp1;
FILE *fp2;
FILE *fp3;

Serial pc(USBTX, USBRX);

// Get this to work with the INA219 Breakout from Adafruit
INA219 ina219(D14, D15, 0x40, 400000, RES_10BITS);

//RF22ReliableDatagram (uint8_t thisAddress, PinName slaveSelectPin, PinName mosi, PinName miso, PinName sclk, PinName interrupt)
RF22ReliableDatagram rf22(0,D10,D11,D12,D13,D2);

float frequency = 869.85;           // frequency

const uint8_t sender_adress = 1;        // address of sender
const uint8_t receiver_adress = 2;       // address of receiver

int counter = 0;                      // message counter


DigitalOut led_red(LED_RED);
DigitalOut led_green(LED_GREEN);
DigitalIn sw3(SW3);
EthernetInterface   eth;
TCPSocketConnection server;
NTPClient           ntp;
time_t              rtcTime;
char                tStr[32];

int check_sw3(void)
{
    if (sw3 == 0) {
        printf("SW3 button pressed. \n");
        return 1;
    } else return 0;
}


// send messages forever
void send_loop()
{
    led_green = 0;
    led_red = 1;
    counter = 0;
    uint8_t data[32] = "";

    while (counter != 1000) {
        counter++;
        fp1 = fopen("/sd/envoie.txt","a");
        sprintf((char*)data,"%d",counter);
        // Display time before sending
        pc.printf("\n\rStart sending ... 1");
        if (rf22.sendtoWait(data, sizeof(data), receiver_adress)) {
            // Display time after sending
            /*rtcTime = time(NULL); //read the time
            strftime(tStr, 32, "%X\n", localtime(&rtcTime));
            printf("\n\rTime as a custom formatted string AFTER sending= %s", tStr);*/
            //wait(1);
            pc.printf("\n\rSend to %i ACK: >>%s<<", receiver_adress,(char*)data);
            fprintf(fp1,"%d\n",counter);

        } else {
            pc.printf("\n\rSend to %i NOT ACK: >>%s<<", receiver_adress,(char*)data);
            // Display time after sending
            /*rtcTime = time(NULL); //read the time
            strftime(tStr, 32, "%X\n", localtime(&rtcTime));
            printf("\n\rTime as a custom formatted string AFTER sending= %s", tStr);*/
            fprintf(fp1,"%d\n",counter);
            //wait(1);
        }
        fclose(fp1);
    }

    led_red = 0; // on
    led_green = 1; // off

}


void Measure(void const *args)
{
    //printf("hello this is the current and voltage of our circuit\r\n\n");
    float volt;
    float current_ma;
    fp2 = fopen("/sd/voltage.txt","a");
    fp3 = fopen("/sd/courant.txt","a");

    fprintf(fp2,"\n");
    fprintf(fp3,"\n");

    fclose(fp2);
    fclose(fp3);

    if((fp1 != NULL) && (fp2 != NULL)) {

        while(1) {
            volt= ina219.read_bus_voltage();
            current_ma = ina219.read_current_mA();

            fp2 = fopen("/sd/voltage.txt","a");
            fp3 = fopen("/sd/courant.txt","a");

            fprintf(fp2,"%f\n", volt);
            //printf("\r volt :%f\n", volt);
            fprintf(fp3,"%f\n", current_ma);
            //printf("\r courant : %f\n\n", current_ma);

            fclose(fp2);
            fclose(fp3);

            wait(5);
        }
    }
}

int Init_Comm ()
{
    // Setting comm
    pc.baud(9600);
    pc.printf("\n\rConnected to mbed\n\r");

    pc.printf ("RF22-Test-Reliable-Send V1.0\n\r");

    // initialize the device
    if (!rf22.init()) {
        pc.printf("RF22 init failed\n\r");
        return 1;
    }

    // set to 19.2
    if (!rf22.setModemConfig(RF22::OOK_Rb9_6Bw335)) { // 9.6 kbs
        pc.printf("setModemConfig failed\n\r");
        return 1;
    }

    if (!rf22.setFrequency(frequency)) {
        pc.printf("setFrequency failed\n\r");
        return 1;
    }

    rf22.setTxPower(RF22_TXPOW_8DBM);
    rf22.setModeTx();
    return 0;

}

int Init_Eth ()
{
    printf("Setting up ethernet interface...\r\n");
    if (eth.init() == 0 ) { //Use DHCP
        printf("Ethernet setup OK\r\n");
    } else {
        printf("Error: cannot set ethernet interface\r\n");
        return 1;
    }

    printf("Trying to connect...\r\n");
    wait(0.5);
    if ( eth.connect(30000) == 0 ) {
        printf("IP Address is %s\r\n", eth.getIPAddress());
    } else {
        printf("Error: cannot set ethernet interface\r\n");
        return 1;
    }

    printf("Trying to update time...\r\n");
    if (ntp.setTime("0.fr.pool.ntp.org") == 0) { //set RTC time
        printf("Set time successfully\r\n");
        wait(1);
        rtcTime = time(NULL); //read the time
        printf("Current time is: %s\r\n", ctime(&rtcTime));
    } else {
        printf("Error: Cannot set time\r\n");
    }

    printf("Disconnecting...\r\n");
    eth.disconnect();
    wait(1);
    printf("Ethernet disconnected\r\n");

    return 0;
}


int main()
{
    int b,c = 0;

    if(Init_Comm()== 0) b = 1;
    //if(Init_Eth()== 0) c = 1;

    if (b == 1) {
        led_green = 1;
        led_red = 0;
        pc.printf("I am sending with address %i to adress %i ...\n\r",sender_adress,receiver_adress  );
        rf22.setThisAddress(sender_adress);     // sender-adress
        //Thread t1(Measure);
        //Thread t2(send_loop);
        while(1) {
            if(check_sw3() == 1) {
                send_loop();
            }
            wait(1);
        }

    } else {
        pc.printf("Probleme lors de l'initialisation");
    }

    return 0;

}