meter reader

Dependencies:   mbed-http

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "EthernetInterface.h"
00003 #include "http_request.h"
00004 #include "http_response.h"
00005 DigitalOut myled(PF_12);
00006 DigitalOut red(PF_14);
00007 DigitalOut dir(PG_15);
00008 RawSerial rs485(PE_1,PE_0,9600);
00009 #define GET_ADDRESS 0x13
00010 #define GET_DATA   0x11
00011 #define SERVER_PORT   8000
00012 #define SERVER_ADDR "192.168.1.10"
00013 static const char*          mbedIp       = "192.168.1.120";  //IP
00014 static const char*          mbedMask     = "255.255.255.0";  // Mask
00015 static const char*          mbedGateway  = "192.168.1.10";    //Gateway
00016 Thread recv;
00017 EthernetInterface eth;   
00018       
00019 void polling(char *address,uint8_t code,char *sbuf,int slen)
00020 {
00021  char buf[32];
00022  int len,i,k;
00023  uint8_t checksum;
00024  checksum=0;
00025  i=0;
00026  buf[i++]=0xfe;
00027  buf[i++]=0xfe;
00028  buf[i++]=0xfe;
00029  buf[i++]=0xfe;
00030  buf[i++]=0x68;checksum=0x68;
00031  for (k=0;k<6;k++)
00032 { buf[i++]=address[k];
00033 checksum=checksum+address[k];
00034 };
00035 buf[i++]=0x68;checksum=checksum+0x68;
00036  buf[i++]=code;checksum=checksum+code;
00037   buf[i++]=slen;checksum=checksum+slen;
00038   for (k=0;k<slen;k++)
00039     {
00040   buf[i++]=sbuf[k];checksum=checksum+sbuf[k];
00041   }
00042   buf[i++]=checksum;
00043   buf[i++]=0x16;
00044     buf[i++]=0xfe;
00045       buf[i++]=0xfe;
00046    len=i;
00047   dir=1;
00048   for (i=0;i<len;i++)
00049    rs485.putc(buf[i]);
00050   //  wait(0.03);
00051    dir=0;
00052  }
00053 void CmdParser(uint8_t code,char *rbuf,int len)
00054 { int i;
00055 char value[32];
00056 double v;
00057  switch(code)
00058  {
00059      case 0x93:{
00060          printf("meter Address=");
00061            for(i=0;i<6;i++)
00062                 printf("%02x",rbuf[5-i]-0x33);
00063                 printf("\n");
00064          break;
00065      }
00066      case 0x91:{
00067       //   printf("meter readout");
00068          for(i=0;i<4;i++)
00069                { //printf("%02x",rbuf[7-i]-0x33);
00070                  value[i]=rbuf[7-i]-0x33;
00071                  }
00072          //printf("\n");
00073          v=((value[0]&0xf0)>>4)*100000;
00074          v=v+(value[0]&0x0f)*10000; 
00075          v=v+((value[1]&0xf0)>>4)*1000;
00076          v=v+(value[1]&0x0f)*100; 
00077          v=v+((value[2]&0xf0)>>4)*10;
00078          v=v+(value[2]&0x0f); 
00079          v=v+((double)((value[3]&0xf0)>>4)/10);
00080          v=v+((double)(value[3]&0x0f)/100); 
00081          sprintf(value,"%.2f",v);
00082       //   printf(value,"%.2f\n",v);
00083          // uplaod to web server
00084         char body[32] ;//= "{\"value\":\"world\"}";
00085         strcpy(body,"{\"value\":\"");
00086         strcat(body,value);
00087         strcat(body,"\"}");
00088          HttpRequest* request = new HttpRequest(&eth, HTTP_POST, "http://192.168.1.10:8000/readOut");
00089           request->set_header("Content-Type", "application/json"); 
00090           HttpResponse* response= request->send(body, strlen(body));          
00091           delete request ;       
00092                 break;
00093          }
00094      }
00095  }
00096  void receive()
00097  { uint8_t state,ch;
00098    int i;
00099    char rbuf[32];
00100    char address[6];
00101    uint8_t code,len;
00102    state=0;
00103    while(true)
00104    {
00105    switch(state)
00106    {
00107      case 0:{
00108              ch=rs485.getc();
00109              if (ch==0xfe) state=1; 
00110              break;
00111              };
00112      case 1:{
00113                ch=rs485.getc();
00114              if (ch==0x68) {state=2;i=0;}
00115              else if (ch!=0xfe) state=0;
00116             
00117             break;
00118             }
00119      case 2:{ // read address
00120               ch=rs485.getc() ;
00121               address[i++]=ch;
00122               if (i==6) state=3;
00123               break;
00124             } 
00125      case 3:{
00126             ch=rs485.getc() ;
00127             if (ch==0x68) state=4;else state=0;
00128             break;
00129             }       
00130      case 4:{ //code
00131              ch=rs485.getc() ;
00132              code =ch;
00133              state=5;
00134              break;
00135              } 
00136     case 5:{
00137            ch=rs485.getc() ;
00138            i=0;len=ch;
00139            state=6; 
00140            break;
00141            }
00142     case 6:{
00143            ch=rs485.getc() ;
00144            rbuf[i++]=ch;
00145            if (i==len) state=7;
00146            break;
00147            } 
00148            case 7:{
00149                  ch=rs485.getc() ;
00150                  state=8;
00151                  break;
00152                }                                   
00153      case 8:{ 
00154               ch=rs485.getc() ;
00155               if (ch==0x16) {
00156                 CmdParser(code,rbuf,len);
00157                 
00158                   
00159                   }
00160               else
00161                 printf("err\n");
00162                 state=0;
00163               break;  
00164               }    
00165      }
00166      }
00167 } 
00168 int main() {
00169 
00170 char address[6];
00171 char sbuf[16];
00172 bool flg;
00173 /*address[0]=0xaa;
00174 address[1]=0xaa;
00175 address[2]=0xaa;
00176 address[3]=0xaa;
00177 address[4]=0xaa;
00178 address[5]=0xaa;*/
00179  eth.set_network(mbedIp,mbedMask,mbedGateway);
00180 eth.connect();
00181 printf("\nMy device IP Address is %s\n", eth.get_ip_address()); 
00182 printf("\nServer MAC Address is %s\n", eth.get_mac_address());
00183 flg=true;
00184 dir=0;
00185 //rs485.set_format(8,UARTSerial::None,1);
00186 printf("read electricity meter demo\n");
00187 recv.start(&receive); 
00188 address[0]=0x00;
00189 address[1]=0x40;
00190 address[2]=0x08;
00191 address[3]=0x13;
00192 address[4]=0x00;
00193 address[5]=0x65;
00194 sbuf[0]=0x33;
00195 sbuf[1]=0x33;
00196 sbuf[2]=0x34;
00197 sbuf[3]=0x33;
00198     while(1) {
00199         wait(2);
00200         polling(address,GET_DATA,sbuf,4);
00201      //  receive();
00202       if (flg){flg=false;myled=1;}
00203        else {flg=true;myled=0;}
00204     }
00205 }