Advertisement
Guest User

Untitled

a guest
Apr 21st, 2015
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.31 KB | None | 0 0
  1. #define F_CPU 1000000UL
  2. #include <avr/io.h>
  3. #include<string.h>
  4. #include "DHT.h"
  5. #include "protocolo.h"
  6.  
  7. #define DHTPIN 2
  8. #define DHTTYPE DHT22
  9. DHT dht(DHTPIN, DHTTYPE);
  10. #define PACKET_LENGTH 64
  11. #define PACKET_SEND 13
  12. pupload proto ={'1','1','0',{0},{'0'},0,'1','0',{'0'},0,0,1};
  13.  
  14. int i, pulse[PACKET_LENGTH];
  15. String info, datos ="11110000001010011110100101100100001000";
  16. byte textBuf[ 12 ], *text;
  17. float t;
  18. unsigned long duration;
  19. boolean voltage = true; //voltage=true --> 1  | voltage=false --> 0
  20. char buf[9]={"11110000"};
  21.  
  22. // the setup routine runs once when you press reset:
  23. void setup() {
  24.   // initialize serial communication at 9600 bits per second:
  25.   dht.begin();
  26.   Serial.begin(9600);
  27.   pinMode(7,OUTPUT);
  28.   // Generem interrupcions
  29.   attachInterrupt(0, change, CHANGE);
  30. }
  31.  
  32. // the loop routine runs over and over again forever:
  33. void loop() {
  34.   //char *buf = readInfo();
  35.   //sendPacket(buf);
  36.   readPacket(datos, &proto);
  37. }
  38.  
  39. // Interrupció que investiga el OOK
  40. void change(){
  41.    if(voltage){
  42.       //guardem la duració amb la funcio pulseIn
  43.       duration = pulseIn(2, HIGH);  
  44.       info = info + "1";
  45.       voltage=false;
  46.   } else {
  47.       duration = pulseIn(2, LOW);
  48.       info = info + "0";
  49.       voltage=true;
  50.   }
  51.   pulse[i] = duration;
  52.   i++;
  53. }
  54.  
  55. // Funció a revisar. Llegeix els valors obtinguts del pin A0 i defineix el paquet rebut
  56. void readVoltage(int pulse[], String info){
  57.   for(int j=0; j < PACKET_LENGTH; j++){
  58.     //la duració de bit es de 50ms aprox. Comprovem la duració per veure si hi ha un bit o dos
  59.     if((pulse[j] <= 120) && (pulse[j] >= 80)) datos = datos + info[j] + info[j];
  60.     else if((pulse[j] > 120) && (pulse[j] < 30)) return; //duració per sota del temps d'un bit o per sobre del temsp de 2 bits --> error
  61.     else datos = datos + info[j];
  62.   }
  63. }
  64.  
  65. //funcio que comprova la informacio rebuda
  66. void readPacket(String datos, pupload *proto){
  67.   char packet_received[PACKET_LENGTH - 4],crc_received[4], info_received[8], check;
  68.   //Comprovacio del PREAMBLE 111-->OK
  69.   if(datos.substring(0,3) == "111"){
  70.     //Extreu CRC i INFO
  71.     datos.substring(datos.length() - 3).toCharArray(crc_received, sizeof(crc_received));
  72.     datos.substring(11,datos.length() - sizeof(crc_received) + 1).toCharArray(packet_received, sizeof(packet_received));
  73.     //Comprovem el CRC
  74.     Serial.println(packet_received);
  75.     check = crearCRC(packet_received);
  76.     for(int j=0; j < 3; j++) {
  77.       if(check != crc_received[j]){
  78.         Serial.println("ERROR->CRC");
  79.         return; }
  80.     }
  81.     datos.substring(5, datos.length() - sizeof(crc_received) - sizeof(packet_received) + 2).toCharArray(info_received, sizeof(info_received));
  82.     //EL DUENDE ME DIJO QUE QUEMARA COSAS
  83.     //proto->ack_recibido == datos[3];
  84.     //if ((proto->fin_recibido = datos[4]) == '1');
  85.     //Si el CRC es correcte, transformem binari --> ASCII
  86.     BinarytoASCII(packet_received);
  87.   } else  proto->ack_envio = '0', Serial.println("ERROR->Preamble");  //Error PREAMBLE
  88. }
  89.  
  90. // Transformació de la informació de codi binari a codi ASCII
  91. void BinarytoASCII(char binaryText[]){
  92.   char *bT = binaryText;
  93.   int counter = 0;
  94.   text = textBuf;
  95.   *text = 0;
  96.   while (*bT){ // Mentre bT no sigui nul
  97.     if (counter < 8){ // Contador per treure bytes. Com que no podem espais (*bT != " ") doncs toca aguantar-se.
  98.       (*text) *= 2;
  99.       if (*bT == '1')  (*text)++;
  100.       counter++;
  101.     } else { // Quan ja hem recorregut el byte toca reiniciar el buffer. Tirem un valor cap enrere de bT per que salta aquí amb count = 9. Si no ho fem ens mengem 1 bit cada cicle.
  102.       text++;
  103.       *text = 0;
  104.       counter=0;
  105.       bT--;
  106.     }
  107.     bT++;
  108.   }
  109.   Serial.print((char *) textBuf );
  110.   Serial.println("");
  111. }
  112.  
  113. // Llegeix informació del sensor de temperatura i humitat
  114. char * readInfo(){
  115.   String str;
  116.   int a,x;
  117.   t = dht.readTemperature();
  118.   a = (int)t;  
  119.   str  = String(a, BIN);
  120.   x = str.length();
  121.   char buf[x];
  122.   for(i = 0; i <= x; i++){
  123.     buf[i] = str[i];
  124.   }
  125.   return buf;
  126. }
  127.  
  128. // Prepara i envia paquet
  129. void sendPacket(char *buf){
  130.   char paquet_to_send[PACKET_SEND];
  131.   save_to_send(buf, &proto);
  132.   p_envio(&proto, paquet_to_send);
  133.   for(i=0;i<PACKET_SEND;i++){
  134.     if((paquet_to_send[i-3] == '1') || (i<3)) digitalWrite(7, HIGH);
  135.     else digitalWrite(7, LOW);
  136.   }
  137.   eliminar_trama(&proto);
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement