Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Скетч для Arduino для отправки данных о температуре на Народный мониторинг.
- // Версия 1.2 (6.10.2013)
- //
- // Автор: Гладышев Дмитрий (2012-2013)
- // http://student-proger.ru/2012/06/podklyuchenie-arduino-k-otechestvennomu-proektu-narodnogo-monitoringa/
- // добавлен вывод на LCD Hitachi HD44780 driver. (c) romych
- //LCD connection circuit:
- // * LCD RS pin to digital pin 8
- //* LCD Enable pin to digital pin 7
- // * LCD D4 pin to digital pin 5
- //* LCD D5 pin to digital pin 4
- // * LCD D6 pin to digital pin 3
- // * LCD D7 pin to digital pin 2
- // * LCD R/W pin to ground
- // * 10K potentiometer:
- // * ends to +5V and ground
- // * wiper to LCD VO pin (pin 3)
- // * 10K poterntiometer on pin A0
- #include <SPI.h>
- #include <Ethernet.h>
- #include <OneWire.h>
- #include <LiquidCrystal.h>
- //пин подключения термодатчика
- OneWire ds(9);
- // initialize the library with the numbers of the interface pins
- LiquidCrystal lcd(8, 7, 5, 4, 3, 2);
- bool Debug = false; //режим отладки
- //****************************************************************************************
- byte mac[] = { 0xFE, 0xFD, 0xAE, 0x01, 0x08, 0x01 }; //MAC-адрес Arduino
- const unsigned long postingInterval = 600000; // интервал между отправками данных в миллисекундах (10 минут)
- //****************************************************************************************
- IPAddress server(94,19,113,221); // IP сервера
- EthernetClient client;
- unsigned long lastConnectionTime = 0; // время последней передачи данных
- boolean lastConnected = false; // состояние подключения
- int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
- char replyBuffer[160];
- char CurTemp[6];
- int CountSensors;
- int SendCounter;
- //int LastTemp;
- void setup() {
- //***обнуляем счетчик отправок
- SendCounter=0;
- //***set up the LCD's number of columns and rows:
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Loading modules");
- lcd.setCursor(0, 1);
- lcd.print("www.narodmon.ru");
- if (Debug)
- {
- Serial.begin(9600);
- }
- delay(1000);
- // Ethernet connection:
- if (Ethernet.begin(mac) == 0)
- {
- if (Debug)
- {
- Serial.println("Failed to configure Ethernet using DHCP");
- }
- // ничего не делаем
- for(;;);
- }
- // секунда для инициализации Ethernet
- delay(1000);
- //Узнаём количество термодатчиков
- CountSensors = DsCount();
- if (Debug)
- {
- Serial.print("Found ");
- Serial.print(CountSensors);
- Serial.println(" sensors.");
- }
- lastConnectionTime = millis()-postingInterval+15000; //первое соединение через 15 секунд после запуска
- }
- void loop()
- {
- // set the cursor to column 0, line 1
- // (note: line 1 is the second row, since counting begins with 0):
- //Если вдруг нам случайно приходят откуда-то какие-то данные,
- //то просто читаем их и игнорируем, чтобы очистить буфер
- if (client.available())
- {
- client.read();
- }
- if (!client.connected() && lastConnected)
- {
- if (Debug)
- {
- Serial.println();
- Serial.println("disconnecting.");
- }
- client.stop();
- }
- //если не подключены и прошло определённое время, то делаем замер,
- //переподключаемся и отправляем данные
- if (!client.connected() && (millis() - lastConnectionTime > postingInterval))
- {
- lcd.clear();
- lcd.print("Sending...");
- //формирование HTTP-запроса
- memset(replyBuffer, 0, sizeof(replyBuffer));
- strcpy(replyBuffer,"ID=");
- //Конвертируем MAC-адрес
- for (int k=0; k<6; k++)
- {
- int b1=mac[k]/16;
- int b2=mac[k]%16;
- char c1[2],c2[2];
- if (b1>9) c1[0]=(char)(b1-10)+'A';
- else c1[0] = (char)(b1) + '0';
- if (b2>9) c2[0]=(char)(b2-10)+'A';
- else c2[0] = (char)(b2) + '0';
- c1[1]='\0';
- c2[1]='\0';
- strcat(replyBuffer,c1);
- strcat(replyBuffer,c2);
- }
- //Сбрасываем поиск датчиков (кол-во нам уже известно)
- ds.reset_search();
- //Теперь в цикле опрашиваем все датчики сразу
- for (int j=0; j<CountSensors; j++)
- {
- byte i;
- byte present = 0;
- byte data[12];
- byte addr[8];
- if ( !ds.search(addr))
- {
- ds.reset_search();
- return;
- }
- ds.reset();
- ds.select(addr);
- ds.write(0x44,1);
- delay(1000);
- present = ds.reset();
- ds.select(addr);
- ds.write(0xBE);
- for ( i = 0; i < 9; i++) // we need 9 bytes
- {
- data[i] = ds.read();
- }
- LowByte = data[0];
- HighByte = data[1];
- TReading = (HighByte << 8) + LowByte;
- SignBit = TReading & 0x8000; // test most sig bit
- if (SignBit) // negative
- {
- TReading = (TReading ^ 0xffff) + 1; // 2's comp
- }
- Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25
- Whole = Tc_100 / 100; // separate off the whole and fractional portions
- Fract = Tc_100 % 100;
- char temp[3];
- char temp2[3];
- itos(Whole,temp);
- //***вывод температуры на экранчик
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("Temperature ");
- if (SignBit) //если температура отрицательная, добавляем знак минуса
- {
- lcd.print("-");
- lcd.print (temp);
- //изменились ли показания
- // if (SendCounter>0)
- // {
- // if (LastTemp > temp)
- // {
- // lcd.write(730);
- // }
- // if (LastTemp < temp)
- // {
- // lcd.write(731);
- // }
- // }
- //730-up
- //731-down
- }
- else
- {
- lcd.print("+");
- lcd.print(temp);
- }
- memset(CurTemp, 0, sizeof(CurTemp));
- strcpy(CurTemp,temp);
- strcat(CurTemp,".");
- strcat(replyBuffer,"&");
- //конвертируем адрес термодатчика
- for (int k=7; k>=0; k--)
- {
- int b1=addr[k]/16;
- int b2=addr[k]%16;
- char c1[2],c2[2];
- if (b1>9) c1[0]=(char)(b1-10)+'A';
- else c1[0] = (char)(b1) + '0';
- if (b2>9) c2[0]=(char)(b2-10)+'A';
- else c2[0] = (char)(b2) + '0';
- c1[1]='\0';
- c2[1]='\0';
- strcat(replyBuffer,c1);
- strcat(replyBuffer,c2);
- }
- strcat(replyBuffer,"=");
- if (SignBit) //если температура отрицательная, добавляем знак минуса
- {
- strcat(replyBuffer,"-");
- }
- strcat(replyBuffer,temp);
- strcat(replyBuffer,".");
- itos(Fract,temp);
- strcat(replyBuffer,temp);
- strcat(CurTemp,temp);
- }
- strcat(replyBuffer,'\0');
- if (Debug)
- {
- Serial.println(replyBuffer);
- Serial.print("Content-Length: ");
- Serial.println(len(replyBuffer));
- }
- //отправляем запрос
- httpRequest();
- }
- //храним последнее состояние подключения
- lastConnected = client.connected();
- delay (1000);
- }
- void httpRequest() {
- if (client.connect(server, 80))
- {
- if (Debug)
- {
- Serial.println("connecting...");
- }
- // send the HTTP POST request:
- client.println("POST http://narodmon.ru/post.php HTTP/1.0");
- client.println("Host: narodmon.ru");
- //client.println("User-Agent: arduino-ethernet");
- //client.println("Connection: close");
- client.println("Content-Type: application/x-www-form-urlencoded");
- client.print("Content-Length: ");
- client.println(len(replyBuffer));
- client.println();
- client.println(replyBuffer);
- client.println();
- lastConnectionTime = millis();
- //***Сколько раз отправлено
- SendCounter++;
- lcd.setCursor(0, 1);
- lcd.print("Sent ");
- lcd.print(SendCounter);
- lcd.print(" times");
- }
- else
- {
- if (Debug)
- {
- Serial.println("connection failed");
- Serial.println("disconnecting.");
- }
- client.stop();
- }
- }
- //Количество термодатчиков на шине
- int DsCount()
- {
- int count=0;
- bool thatsall = false;
- byte addr[8];
- do
- {
- if ( !ds.search(addr))
- {
- ds.reset_search();
- thatsall = true;
- }
- count++;
- } while(!thatsall);
- return (count-1);
- }
- int len(char *buf)
- {
- int i=0;
- do
- {
- i++;
- } while (buf[i]!='\0');
- return i;
- }
- void itos(int n, char bufp[3]) //int to string
- {
- char buf[3]={'0','0','\0'};
- int i = 1;
- while (n > 0) {
- buf[i] = (n % 10)+48;
- i--;
- n /= 10;
- }
- for (i=0; i<3; i++)
- bufp[i]=buf[i];
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement