Advertisement
Guest User

meteo_for_ENC28J60

a guest
Dec 27th, 2014
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.72 KB | None | 0 0
  1. //сеть
  2. #include <UIPEthernet.h>
  3. EthernetClient client;
  4.  
  5. char macbuf[13];
  6. uint8_t mac[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; //изменить !!!
  7.  
  8. char replyBuffer[160];
  9. signed long next;
  10.  
  11.  
  12. //барометр A4 A5 pin
  13. #include <Wire.h>
  14. #include <BMP085.h>
  15. BMP085 dps = BMP085();
  16. long Temperature = 0, Pressure = 0;
  17.  
  18. //влажность 3 pin
  19. #include "DHT.h"
  20. #define DHTPIN 3    
  21. #define DHTTYPE DHT11  //изменить тип датчика влажности  !!!
  22. DHT dht(DHTPIN, DHTTYPE);
  23.  
  24. //температура 4 pin
  25. #include "OneWire.h"
  26. OneWire  ds(4);
  27. #define DS18S20_ID 0x10
  28. #define DS18B20_ID 0x28
  29.  
  30. bool Debug = true; //режим отладки
  31.  
  32. void setup()
  33. {
  34.   Serial.begin(9600);
  35.   Wire.begin();
  36.   dps.init();  
  37.   dht.begin();
  38.   delay(2000);
  39.   // Ethernet connection:
  40.   IPAddress myIP(192,168,1,5); //изменить локальный IP !!!
  41.   Ethernet.begin(mac,myIP);
  42.   next = 0;
  43. }
  44.  
  45. void loop()
  46. {
  47.  
  48. //формирование HTTP-запроса
  49. memset(replyBuffer, 0, sizeof(replyBuffer));
  50. strcpy(replyBuffer,"#");
  51.  
  52. memset(macbuf, 0, sizeof(macbuf));
  53. //Конвертируем MAC-адрес
  54. for (int k=0; k<6; k++)
  55. {
  56.   int b1=mac[k]/16;
  57.   int b2=mac[k]%16;
  58.   char c1[2],c2[2];
  59.  
  60.   if (b1>9) c1[0]=(char)(b1-10)+'A';
  61.   else c1[0] = (char)(b1) + '0';
  62.   if (b2>9) c2[0]=(char)(b2-10)+'A';
  63.   else c2[0] = (char)(b2) + '0';
  64.  
  65.   c1[1]='\0';
  66.   c2[1]='\0';
  67.  
  68.   strcat(macbuf,c1);
  69.   strcat(macbuf,c2);
  70. }
  71.  
  72. strcat(replyBuffer, macbuf);
  73.  
  74. //температура
  75. byte i;
  76. byte present = 0;
  77. byte data[12];
  78. byte addr[8];
  79.  
  80. if (!ds.search(addr))
  81. {
  82.   ds.reset_search();
  83.   return;
  84. }
  85.  
  86. if (Debug)
  87. {
  88.  if (OneWire::crc8( addr, 7) != addr[7])
  89.  {
  90.    Serial.print("CRC is not valid!\n");
  91.    return;
  92.  }
  93.  
  94.  if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID)
  95.  {
  96.    Serial.print("Device is not a DS18x20 family device.\n");
  97.    return;
  98.  }
  99. }
  100.  
  101. ds.reset();
  102. ds.select(addr);
  103.  
  104. // Запускаем конвертацию
  105. ds.write(0x44, 1);
  106.  
  107. // Подождем...
  108. delay(1000);
  109.  
  110. present = ds.reset();
  111. ds.select(addr);
  112.  
  113. // Считываем ОЗУ датчика  
  114. ds.write(0xBE);
  115.  
  116. // Обрабатываем 9 байт
  117. for ( i = 0; i < 9; i++)
  118. {
  119.   data[i] = ds.read();
  120. }
  121.  
  122. // Высчитываем температуру :)
  123. int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
  124. LowByte = data[0];
  125. HighByte = data[1];
  126.  
  127. TReading = (HighByte << 8) + LowByte;
  128.    
  129. // Проверяем дубак там или нет
  130. SignBit = TReading & 0x8000;
  131.    
  132. // Если на улице дубак :)
  133. if (SignBit)
  134. {
  135.   TReading = (TReading ^ 0xffff) + 1;
  136. }
  137.    
  138. // Умножаем на (100 * 0.0625) или 6.25
  139. Tc_100 = (6 * TReading) + TReading / 4;
  140. // Отделяем целые от дробных чисел
  141. Whole = Tc_100 / 100;
  142. Fract = Tc_100 % 100;
  143. if (Debug)
  144. {
  145.   Serial.println("|||||||||||||TEMP|||||||||||||||");
  146.   Serial.print("Temperature: ");
  147.   // Если на улице дубак напишем минус перед цифрами :)
  148.   if (SignBit)
  149.   {
  150.     Serial.print("-");
  151.   }
  152.   Serial.print(Whole);
  153.   Serial.print(".");
  154.    
  155.   if (Fract < 10)
  156.   {
  157.     Serial.print("0");
  158.   }
  159.    
  160.   Serial.print(Fract);
  161.   Serial.print("\n");
  162. }  
  163.    
  164. char temp[3];
  165. itoa(Whole,temp);
  166. strcat(replyBuffer,"\n#");
  167.  
  168. //конвертируем адрес термодатчика
  169. for (int k=7; k>=0; k--)
  170. {
  171.   int b1=addr[k]/16;
  172.   int b2=addr[k]%16;
  173.   char c1[2],c2[2];
  174.  
  175.   if (b1>9) c1[0]=(char)(b1-10)+'A';
  176.   else c1[0] = (char)(b1) + '0';
  177.   if (b2>9) c2[0]=(char)(b2-10)+'A';
  178.   else c2[0] = (char)(b2) + '0';
  179.   c1[1]='\0';
  180.   c2[1]='\0';
  181.  
  182.   strcat(replyBuffer, c1);
  183.   strcat(replyBuffer, c2);
  184. }
  185.  
  186. strcat(replyBuffer,"#");
  187.      
  188. if (SignBit) //если температура отрицательная, добавляем знак минуса
  189. {
  190.   strcat(replyBuffer,"-");
  191. }
  192. strcat(replyBuffer,temp);
  193. strcat(replyBuffer,".");
  194. if (Fract<10)
  195. {
  196.   strcat(replyBuffer,"0");
  197. }
  198. itoa(Fract,temp);
  199. strcat(replyBuffer,temp);
  200.  
  201.  
  202. //барометр
  203. dps.getPressure(&Pressure);
  204. dps.getTemperature(&Temperature);
  205. if (Debug)
  206. {
  207.   Serial.println("||||||||||||PRESSURE|||||||||||||||");
  208.   Serial.print("Pressure(mm Hg):");
  209.   Serial.print(Pressure/133.3);      //Выводим давление в мм.рт ст
  210.   Serial.print(" Temp:");
  211.   Serial.println(Temperature*0.1);   // Температуру в градусах Цельсия
  212. }
  213.  
  214. char buf[8];
  215. long p_100, h_100;
  216.  
  217. //получаем значение атмосферного давления
  218. strcat(replyBuffer, "\n#");
  219. strcat(replyBuffer, macbuf);
  220. strcat(replyBuffer, "01#");
  221. dps.getPressure(&Pressure);
  222. p_100 = Pressure/1.333;
  223. Whole = p_100 / 100;
  224. Fract = p_100 % 100;
  225. itoa(Whole, buf);
  226. strcat(replyBuffer, buf);
  227. strcat(replyBuffer, ".");
  228. if (Fract<10)
  229. {
  230.   strcat(replyBuffer,"0");
  231. }
  232. itoa(Fract, buf);
  233. strcat(replyBuffer, buf);
  234.  
  235. //влажность
  236. float h = dht.readHumidity();
  237. float t = dht.readTemperature();
  238. if (Debug)
  239. {
  240. Serial.println("|||||||||||||HUMIDITY||||||||||||");
  241. Serial.print("Humidity: ");
  242. Serial.print(h);
  243. Serial.print(" %\t");
  244. Serial.print("Temperature: ");
  245. Serial.print(t);
  246. Serial.println(" *C");
  247. }
  248. //получаем значение влажности
  249. strcat(replyBuffer, "\n#");
  250. strcat(replyBuffer, macbuf);
  251. strcat(replyBuffer, "02#");
  252. itoa(h, buf);
  253. strcat(replyBuffer, buf);
  254.  
  255. strcat(replyBuffer,"\n##");
  256.      
  257.    
  258. //соединение
  259. if (((signed long)(millis() - next)) > 0)
  260. {
  261.   next = millis() + 600000;  //Соединение раз в 10 минут
  262.   if (Debug)
  263.   {
  264.     Serial.println("Client connect"); //попытка соединения, если висит в консоли - нет сети
  265.   }
  266.   if (client.connect(IPAddress(94,19,113,221),8283))
  267.   {
  268.     if (Debug)
  269.     {
  270.       Serial.println("Client connected"); //удачное соединение
  271.     }
  272.    
  273.     client.println(replyBuffer); //отправляем данные
  274.    
  275.     while(client.available()==0)
  276.     {
  277.       if (next - millis() < 0)
  278.       goto close;
  279.     }
  280.     int size;
  281.     while((size = client.available()) > 0)
  282.     {
  283.       uint8_t* msg = (uint8_t*)malloc(size);
  284.       size = client.read(msg,size);
  285.       Serial.write(msg,size); //выводим в консол сообщение от сервера. ОК - всехорошо. too often - слишком частая отправка
  286.       free(msg);
  287.     }
  288.    close:
  289.    //disconnect client
  290.    if (Debug)
  291.    {
  292.      Serial.println("Client disconnect");
  293.      client.stop();
  294.    }
  295.    else
  296.      {
  297.      Serial.println("Client connect failed");
  298.       }
  299.   }
  300.    
  301.  
  302.   if (Debug)
  303.   {
  304.     Serial.println(replyBuffer);
  305.   }
  306.      
  307.    
  308. }
  309.  
  310.  
  311. }//end
  312.  
  313.  
  314. //Функция определения длины строки
  315. int len(char *buf)
  316. {
  317.   int i=0;
  318.   do
  319.   {
  320.     i++;
  321.   } while (buf[i]!='\0');
  322.   return i;
  323. }
  324.  
  325. //Функция переворота строки
  326. void reverse(char s[])
  327. {
  328.   int i, j;
  329.   char c;
  330.  
  331.   for (i = 0, j = strlen(s)-1; i<j; i++, j--)
  332.   {
  333.     c = s[i];
  334.     s[i] = s[j];
  335.     s[j] = c;
  336.   }
  337. }
  338.  
  339. //Функция конвертирования числа в символьный массив
  340. void itoa(int n, char s[])
  341. {
  342.   int i, sign;
  343.  
  344.   if ((sign = n) < 0)       /* записываем знак */
  345.     n = -n;                 /* делаем n положительным числом */
  346.   i = 0;
  347.   do {                      /* генерируем цифры в обратном порядке */
  348.     s[i++] = n % 10 + '0';  /* берем следующую цифру */
  349.   } while ((n /= 10) > 0);  /* удаляем */
  350.   if (sign < 0)
  351.     s[i++] = '-';
  352.   s[i] = '\0';
  353.   reverse(s);
  354. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement