Mustafa Kazaale / Mbed OS Riggen_internettoffentlig

Dependencies:   C12832

Fork of Riggen_internett by Mustafa Kazaale

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001                     //-----------Bibilioteker------------//
00002 #include "mbed.h"
00003 #include "EthernetInterface.h"
00004 #include "C12832.h"             // Biblioteket til skjermen på applikasjonsbrettet
00005 
00006 
00007 Serial pc(USBTX, USBRX);        // Serial kommunikasjon med PC
00008 SPI bus(p11, p12, p13);         // p11-mosi brukes ikke, p12-miso kobles til pinne 3 på sensoren, p13-sck kobles til pinne 4 på sensoren
00009 DigitalOut slave_1(p19);        // p20-SS, koble til pinne 5 på sensor 1
00010 DigitalOut slave_2(p18);        // p19-SS, koble til pinne 5 på sensor 2
00011 DigitalOut slave_3(p17);        // p18-SS, koble til pinne 5 på sensor 3
00012 EthernetInterface net;          //Ethernet interface
00013 TCPSocket socket;               //TCP socket
00014 Timer tid;                      // Timer 
00015 Ticker t, t1;                   // Tikker for å kjøre avlesningen to ganger i sekundet.
00016 C12832 lcd(p5, p7, p6, p8, p11);// Skjermen
00017 
00018                     //--------------Funksjoner-------------//
00019 void data(float s1, float av1,float s2, float av2,float s3, float av3); // Oppretting av et array for webaddressen
00020 void send(char *arr, int lengde);                                       // Sender data til mottat webaddresse
00021 void sensor();                                                          // Avlesning av Sensor verdiene
00022 void omregning(int a, float speed);                                     // Omregning av avlesningen
00023 
00024                     //----------Globale variable-----------//
00025 int i=0, ant=0;                 // Variabelen i er til for å forenkle valget av de tre sensorene, ant er der for antallet avlesninger
00026 int avlest[3];                  // Array for lagring av avlest verdi
00027 float trykk[3];                 // Array for lagring av omregnet trykkverdi
00028 float fart[3];                  // Array for lagring av omregnet fartverdi
00029 float sum_fart[3];              // Array for summering av farten
00030 float avvik[3];                 // Array for lagring av standardavviket på vannhastigheten
00031 float gjennomsnitt[3];          // Array for lagring av gjennomsnittelig vannhastighet
00032 
00033                     //--------Definisjoner----------------//
00034 #define ut_min 0x0666           // Minste avleste verdi defineres
00035 #define ut_max 0x399A           // Maksimum avlest verdi defineres
00036 #define trykk_min -6000         // Minimale trykkverdi i Pascal på sensoren defineres
00037 #define trykk_max 6000          // Maksimale trykkverdi i Pascal på sernsoren defineres
00038 
00039 int main()
00040 {
00041     pc.printf("\nSetter opp nettverksforbindelse");
00042     net.connect();                  // Setter opp nettforbindelse
00043     pc.printf("\nTilkoblet nettet");
00044     
00045     const char *ip = net.get_ip_address();// Innhenter IP addresse
00046     printf("\nIP address is: %s\n\n", ip ? ip : "No IP");
00047     
00048     bus.format(16,0);               // Oppsett av SPI dataformat, (16 bit data, mode 0)
00049                                     // mode 0 = (klokke verdi ved tomgang = 0, data avleses ved opp-flanke av klokkepuls)
00050     bus.frequency(800000);          // Velger frekvensen på kommuniaksjonsklokken til 800KHz
00051     slave_1 = slave_2 = slave_3 = 1;// Ingen slave valgt
00052     pc.printf("\n\tSensor 1\t\t\tSensor 2\t\t\tSensor 3\t\n");
00053     pc.printf("Inn\tP\t\t[m/s]\tInn\tP\t\t[m/s]\tInn\tP\t\t[m/s]\n");
00054     t.attach(&sensor,0.5);          // Setter igang Tikker med sensor() fuknsjonen som kalles 2 ganger i sekundet
00055     tid.start();                    // Starter timer
00056     lcd.cls();                      // Sletter alt som er på lokale skjermmen
00057     lcd.locate(0,3);                // Lokkaliserer hvor på skjermen skriften skal komme
00058     lcd.printf("   S1      S2      S3");
00059     
00060                     //-----------Evig løkke-------------//
00061     while(1)
00062     {
00063         static bool sist = false;       // Dette er en liten kode for å sende kun en gang.
00064         while (16 < tid.read())         // Tiden må ha passert 16 sekunder for dette blir sant
00065         {
00066             if(ant==144)                // Tester på om det er blitt utført 144 målinger
00067             {
00068                 ant=0;                  // Antallet målinger nullstilles for en ny runde
00069                 if(!sist)               // Tester om ikke sist 
00070                 {
00071                     sist = true;        // Setter sist til sann, slik at sendingenn kun utføres en gang etter 16 sekunder
00072                     t.detach();         // Detacher fuknsjonen sensor fra Tikker for å kunne sende uavbrutt.
00073                     data(gjennomsnitt[0], avvik[0], gjennomsnitt[1], avvik[1], gjennomsnitt[2], avvik[2]);// Sender data
00074                     for(int c=0; c<3; c++)// En For løkke for å nullstille de Globale variablene
00075                     {
00076                         avlest[c]=0;
00077                         gjennomsnitt[c]=0.0;
00078                         avvik[c]=0.0;
00079                         trykk[c]=0.0;
00080                         fart[c]=0.0;
00081                         sum_fart[c]=0.0;
00082                     }
00083                     t.attach(&sensor,0.5);// Tilegner funksjonen sensor til Tikker igjen for avlesning av sensor verdier
00084                     tid.stop();         // Stopper Timer og resetter for ny runde
00085                     tid.reset();
00086                 }
00087             }
00088             else                        // En del av sending en gang
00089             {
00090                 sist=false;
00091             }
00092         }
00093         
00094         tid.start();                    // Starter timer igjen for nye 16 sekunder
00095     }
00096 }
00097 
00098                     //----------Sensor funskjonen------------//
00099 void sensor()                   
00100 {
00101     for(i=0; i<3; i++)                  // En for løkke for å lese av alle tre sensorene
00102     {
00103         if(i==0)
00104         {
00105             slave_1 = 0;                // Velger sensor 1 som slave
00106             avlest[i] = bus.write(0x0001);// Sender dummy command for å få respons
00107             slave_1 = 1;                // Slipper slaven
00108         }
00109         
00110         if(i==1)
00111         {
00112             slave_2 = 0;                // Velger sensor 2 som slave     
00113             avlest[i] = bus.write(0x0001);// Be om trykk verdi avlesning
00114             slave_2 = 1;                // Slipper slaven
00115         }
00116         
00117         if(i==2)
00118         {
00119             slave_3 = 0;                 // Velger sensor 3 som slave     
00120             avlest[i] = bus.write(0x0001);// Be om trykk verdi avlesning
00121             slave_3 = 1;                // Slipper slaven
00122         }
00123         
00124         trykk[i]=1.0*(avlest[i]-ut_min)*(trykk_max-trykk_min)/(ut_max - ut_min)+trykk_min;  // Omregningsformel gitt fra produsenten
00125         if(trykk[i]<0)                                                                      // Dersom trykket er negativt fjernes fortegnet
00126         {                                                                                   // Absolutt verdien er for at kvadratroten ikke skal returnere komplekse tall
00127             fart[i] = sqrt(abs(2*trykk[i])/1000);                                           // Omregner trykket til hastighet
00128             fart[i] = -1*fart[i];
00129         }
00130         else
00131         {
00132             fart[i] = sqrt((2*trykk[i])/1000);                                              // Omregner trykket til hastighet
00133         }
00134                                                         
00135         pc.printf("%X\t%.2f\t\t%.2f\t", avlest[i], trykk[i], fart[i]);                      // Hviser innlest og omregnet verdier
00136         omregning(i, fart[i]);
00137     }
00138     
00139     pc.printf("\n");            // New line for at visningen på Teraterm blir forståelig
00140     lcd.locate(0,15);           // Lokaloserer hvor på skjermen verdiene skal skrives
00141     lcd.printf("   %.2f    %.2f    %.2f", fart[0], fart[1], fart[2]);// Viser verdiene på lokal skjerm
00142  
00143 }
00144 
00145                     //----------Omregningsfunskjonen------------//
00146  void omregning(int a, float speed)
00147  {
00148     ant++;                      // Inkrementerer den globale variabelen ant med en
00149     sum_fart[a] = sum_fart[a] + speed;// summerer alle hastigheter for gjennomsnitt utregning
00150     if(ant==144)
00151     {
00152         for(int b=0;b<3;b++)    // Regner ut gjennomsnittet for alle tre hastigheten
00153         {
00154             gjennomsnitt[b]=sum_fart[b]/48;
00155             avvik[b]=sqrt(((pow(sum_fart[b]-gjennomsnitt[b], 2)))/(48-1));
00156             pc.printf("\n Gjennonsnitt: %.2f\t Standardavvik: %.2f\n",gjennomsnitt[b],avvik[b]);
00157         }
00158         pc.printf("antallet: %d\n",ant);
00159     }
00160  }
00161 
00162                     //----------Sende funksjon------------//
00163 void send(char *arr, int lengde)
00164 {
00165     socket.open(&net);
00166     socket.connect("api.thingspeak.com", 80);
00167 
00168     // Sender array til ThingSpeak
00169     socket.send(arr, lengde);
00170     pc.printf("\nSendte:%s\n\n",arr);
00171 
00172     //Lukker socket
00173     socket.close();
00174 }
00175 
00176                     //----------Dataene som skal sendes------------//
00177 void data(float s1, float av1,float s2, float av2,float s3, float av3)
00178 {
00179     char a[200];            // Oppretter buffer ////Fyller buffer med update link med riktig felt og verdi
00180     sprintf (a, "GET https://api.thingspeak.com/update?api_key=TT0INEEL44E31AHP&field1=%.2f&field2=%.2f&field3=%.2f&field4=%.2f&field5=%.2f&field6=%.2f\r\n",s1,av1,s2,av2,s3,av3);  
00181     send(a,200);            //Kaller opp funksjonen send for å sende til thingspeak
00182     pc.printf("\n\tSensor 1\t\t\tSensor 2\t\t\tSensor 3\t\n");
00183     pc.printf("Inn\tP\t\t[m/s]\tInn\tP\t\t[m/s]\tInn\tP\t\t[m/s]\n");
00184 }