Advertisement
Guest User

Untitled

a guest
May 27th, 2014
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.47 KB | None | 0 0
  1. // Скетч для Arduino для отправки данных о температуре на Народный мониторинг.
  2. // Версия 1.2 (6.10.2013)
  3. //
  4. // Автор: Гладышев Дмитрий (2012-2013)
  5. // http://student-proger.ru/2012/06/podklyuchenie-arduino-k-otechestvennomu-proektu-narodnogo-monitoringa/
  6. // добавлен вывод на LCD Hitachi HD44780 driver. (c) romych
  7.  
  8.  
  9. //LCD connection circuit:
  10. // * LCD RS pin to digital pin 8
  11. //* LCD Enable pin to digital pin 7
  12. // * LCD D4 pin to digital pin 5
  13. //* LCD D5 pin to digital pin 4
  14. // * LCD D6 pin to digital pin 3
  15. // * LCD D7 pin to digital pin 2
  16. // * LCD R/W pin to ground
  17. // * 10K potentiometer:
  18. // * ends to +5V and ground
  19. // * wiper to LCD VO pin (pin 3)
  20. // * 10K poterntiometer on pin A0
  21.  
  22.  
  23. #include <SPI.h>
  24. #include <Ethernet.h>
  25. #include <OneWire.h>
  26. #include <LiquidCrystal.h>
  27.  
  28.  
  29.  
  30. //пин подключения термодатчика
  31. OneWire ds(9);
  32.  
  33. // initialize the library with the numbers of the interface pins
  34. LiquidCrystal lcd(8, 7, 5, 4, 3, 2);
  35.  
  36.  
  37.  
  38. bool Debug = false; //режим отладки
  39.  
  40. //****************************************************************************************
  41. byte mac[] = { 0xFE, 0xFD, 0xAE, 0x01, 0x08, 0x01 }; //MAC-адрес Arduino
  42. const unsigned long postingInterval = 600000; // интервал между отправками данных в миллисекундах (10 минут)
  43. //****************************************************************************************
  44.  
  45. IPAddress server(94,19,113,221); // IP сервера
  46.  
  47. EthernetClient client;
  48.  
  49. unsigned long lastConnectionTime = 0; // время последней передачи данных
  50. boolean lastConnected = false; // состояние подключения
  51.  
  52. int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  53.  
  54. char replyBuffer[160];
  55. char CurTemp[6];
  56.  
  57. int CountSensors;
  58. int SendCounter;
  59. //int LastTemp;
  60. void setup() {
  61.  
  62. //***обнуляем счетчик отправок
  63. SendCounter=0;
  64.  
  65. //***set up the LCD's number of columns and rows:
  66. lcd.begin(16, 2);
  67. lcd.setCursor(0, 0);
  68. lcd.print("Loading modules");
  69. lcd.setCursor(0, 1);
  70. lcd.print("www.narodmon.ru");
  71.  
  72. if (Debug)
  73. {
  74. Serial.begin(9600);
  75. }
  76.  
  77. delay(1000);
  78. // Ethernet connection:
  79. if (Ethernet.begin(mac) == 0)
  80. {
  81. if (Debug)
  82. {
  83. Serial.println("Failed to configure Ethernet using DHCP");
  84.  
  85. }
  86. // ничего не делаем
  87. for(;;);
  88. }
  89. // секунда для инициализации Ethernet
  90. delay(1000);
  91.  
  92. //Узнаём количество термодатчиков
  93. CountSensors = DsCount();
  94. if (Debug)
  95. {
  96. Serial.print("Found ");
  97. Serial.print(CountSensors);
  98. Serial.println(" sensors.");
  99. }
  100. lastConnectionTime = millis()-postingInterval+15000; //первое соединение через 15 секунд после запуска
  101. }
  102.  
  103. void loop()
  104. {
  105.  
  106.  
  107. // set the cursor to column 0, line 1
  108. // (note: line 1 is the second row, since counting begins with 0):
  109.  
  110. //Если вдруг нам случайно приходят откуда-то какие-то данные,
  111. //то просто читаем их и игнорируем, чтобы очистить буфер
  112.  
  113. if (client.available())
  114. {
  115. client.read();
  116.  
  117. }
  118.  
  119. if (!client.connected() && lastConnected)
  120. {
  121. if (Debug)
  122. {
  123. Serial.println();
  124. Serial.println("disconnecting.");
  125. }
  126. client.stop();
  127. }
  128.  
  129. //если не подключены и прошло определённое время, то делаем замер,
  130. //переподключаемся и отправляем данные
  131. if (!client.connected() && (millis() - lastConnectionTime > postingInterval))
  132. {
  133. lcd.clear();
  134. lcd.print("Sending...");
  135.  
  136. //формирование HTTP-запроса
  137. memset(replyBuffer, 0, sizeof(replyBuffer));
  138. strcpy(replyBuffer,"ID=");
  139.  
  140. //Конвертируем MAC-адрес
  141. for (int k=0; k<6; k++)
  142. {
  143. int b1=mac[k]/16;
  144. int b2=mac[k]%16;
  145. char c1[2],c2[2];
  146.  
  147. if (b1>9) c1[0]=(char)(b1-10)+'A';
  148. else c1[0] = (char)(b1) + '0';
  149. if (b2>9) c2[0]=(char)(b2-10)+'A';
  150. else c2[0] = (char)(b2) + '0';
  151.  
  152. c1[1]='\0';
  153. c2[1]='\0';
  154.  
  155. strcat(replyBuffer,c1);
  156. strcat(replyBuffer,c2);
  157. }
  158.  
  159. //Сбрасываем поиск датчиков (кол-во нам уже известно)
  160. ds.reset_search();
  161. //Теперь в цикле опрашиваем все датчики сразу
  162.  
  163. for (int j=0; j<CountSensors; j++)
  164. {
  165.  
  166. byte i;
  167. byte present = 0;
  168. byte data[12];
  169. byte addr[8];
  170.  
  171. if ( !ds.search(addr))
  172. {
  173. ds.reset_search();
  174. return;
  175. }
  176.  
  177. ds.reset();
  178. ds.select(addr);
  179. ds.write(0x44,1);
  180.  
  181. delay(1000);
  182.  
  183. present = ds.reset();
  184. ds.select(addr);
  185. ds.write(0xBE);
  186.  
  187. for ( i = 0; i < 9; i++) // we need 9 bytes
  188. {
  189. data[i] = ds.read();
  190. }
  191.  
  192. LowByte = data[0];
  193. HighByte = data[1];
  194. TReading = (HighByte << 8) + LowByte;
  195. SignBit = TReading & 0x8000; // test most sig bit
  196. if (SignBit) // negative
  197. {
  198. TReading = (TReading ^ 0xffff) + 1; // 2's comp
  199. }
  200. Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25
  201.  
  202. Whole = Tc_100 / 100; // separate off the whole and fractional portions
  203. Fract = Tc_100 % 100;
  204.  
  205. char temp[3];
  206. char temp2[3];
  207.  
  208. itos(Whole,temp);
  209.  
  210.  
  211. //***вывод температуры на экранчик
  212. lcd.clear();
  213. lcd.setCursor(0, 0);
  214. lcd.print("Temperature ");
  215. if (SignBit) //если температура отрицательная, добавляем знак минуса
  216. {
  217. lcd.print("-");
  218. lcd.print (temp);
  219. //изменились ли показания
  220. // if (SendCounter>0)
  221. // {
  222.  
  223. // if (LastTemp > temp)
  224. // {
  225. // lcd.write(730);
  226. // }
  227. // if (LastTemp < temp)
  228. // {
  229. // lcd.write(731);
  230. // }
  231. // }
  232. //730-up
  233. //731-down
  234. }
  235. else
  236. {
  237. lcd.print("+");
  238. lcd.print(temp);
  239. }
  240.  
  241.  
  242. memset(CurTemp, 0, sizeof(CurTemp));
  243. strcpy(CurTemp,temp);
  244. strcat(CurTemp,".");
  245.  
  246. strcat(replyBuffer,"&");
  247.  
  248.  
  249. //конвертируем адрес термодатчика
  250. for (int k=7; k>=0; k--)
  251. {
  252. int b1=addr[k]/16;
  253. int b2=addr[k]%16;
  254. char c1[2],c2[2];
  255.  
  256. if (b1>9) c1[0]=(char)(b1-10)+'A';
  257. else c1[0] = (char)(b1) + '0';
  258. if (b2>9) c2[0]=(char)(b2-10)+'A';
  259. else c2[0] = (char)(b2) + '0';
  260.  
  261. c1[1]='\0';
  262. c2[1]='\0';
  263.  
  264. strcat(replyBuffer,c1);
  265. strcat(replyBuffer,c2);
  266. }
  267. strcat(replyBuffer,"=");
  268. if (SignBit) //если температура отрицательная, добавляем знак минуса
  269. {
  270. strcat(replyBuffer,"-");
  271. }
  272. strcat(replyBuffer,temp);
  273. strcat(replyBuffer,".");
  274. itos(Fract,temp);
  275. strcat(replyBuffer,temp);
  276. strcat(CurTemp,temp);
  277.  
  278. }
  279.  
  280.  
  281. strcat(replyBuffer,'\0');
  282.  
  283.  
  284. if (Debug)
  285. {
  286. Serial.println(replyBuffer);
  287. Serial.print("Content-Length: ");
  288. Serial.println(len(replyBuffer));
  289. }
  290.  
  291. //отправляем запрос
  292. httpRequest();
  293.  
  294. }
  295. //храним последнее состояние подключения
  296. lastConnected = client.connected();
  297. delay (1000);
  298. }
  299.  
  300. void httpRequest() {
  301. if (client.connect(server, 80))
  302. {
  303.  
  304.  
  305. if (Debug)
  306. {
  307. Serial.println("connecting...");
  308.  
  309. }
  310. // send the HTTP POST request:
  311.  
  312. client.println("POST http://narodmon.ru/post.php HTTP/1.0");
  313. client.println("Host: narodmon.ru");
  314. //client.println("User-Agent: arduino-ethernet");
  315. //client.println("Connection: close");
  316. client.println("Content-Type: application/x-www-form-urlencoded");
  317. client.print("Content-Length: ");
  318. client.println(len(replyBuffer));
  319. client.println();
  320. client.println(replyBuffer);
  321. client.println();
  322. lastConnectionTime = millis();
  323. //***Сколько раз отправлено
  324. SendCounter++;
  325. lcd.setCursor(0, 1);
  326. lcd.print("Sent ");
  327. lcd.print(SendCounter);
  328. lcd.print(" times");
  329.  
  330.  
  331. }
  332. else
  333. {
  334. if (Debug)
  335. {
  336. Serial.println("connection failed");
  337. Serial.println("disconnecting.");
  338. }
  339. client.stop();
  340. }
  341. }
  342.  
  343. //Количество термодатчиков на шине
  344. int DsCount()
  345. {
  346. int count=0;
  347. bool thatsall = false;
  348. byte addr[8];
  349. do
  350. {
  351. if ( !ds.search(addr))
  352. {
  353. ds.reset_search();
  354. thatsall = true;
  355. }
  356. count++;
  357. } while(!thatsall);
  358. return (count-1);
  359. }
  360.  
  361. int len(char *buf)
  362. {
  363. int i=0;
  364. do
  365. {
  366. i++;
  367. } while (buf[i]!='\0');
  368. return i;
  369. }
  370.  
  371. void itos(int n, char bufp[3]) //int to string
  372. {
  373. char buf[3]={'0','0','\0'};
  374. int i = 1;
  375.  
  376. while (n > 0) {
  377. buf[i] = (n % 10)+48;
  378. i--;
  379. n /= 10;
  380. }
  381.  
  382. for (i=0; i<3; i++)
  383. bufp[i]=buf[i];
  384. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement