Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //сеть
- #include <UIPEthernet.h>
- EthernetClient client;
- char macbuf[13];
- uint8_t mac[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; //изменить !!!
- char replyBuffer[160];
- signed long next;
- //барометр A4 A5 pin
- #include <Wire.h>
- #include <BMP085.h>
- BMP085 dps = BMP085();
- long Temperature = 0, Pressure = 0;
- //влажность 3 pin
- #include "DHT.h"
- #define DHTPIN 3
- #define DHTTYPE DHT11 //изменить тип датчика влажности !!!
- DHT dht(DHTPIN, DHTTYPE);
- //температура 4 pin
- #include "OneWire.h"
- OneWire ds(4);
- #define DS18S20_ID 0x10
- #define DS18B20_ID 0x28
- bool Debug = true; //режим отладки
- void setup()
- {
- Serial.begin(9600);
- Wire.begin();
- dps.init();
- dht.begin();
- delay(2000);
- // Ethernet connection:
- IPAddress myIP(192,168,1,5); //изменить локальный IP !!!
- Ethernet.begin(mac,myIP);
- next = 0;
- }
- void loop()
- {
- //формирование HTTP-запроса
- memset(replyBuffer, 0, sizeof(replyBuffer));
- strcpy(replyBuffer,"#");
- memset(macbuf, 0, sizeof(macbuf));
- //Конвертируем 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(macbuf,c1);
- strcat(macbuf,c2);
- }
- strcat(replyBuffer, macbuf);
- //температура
- byte i;
- byte present = 0;
- byte data[12];
- byte addr[8];
- if (!ds.search(addr))
- {
- ds.reset_search();
- return;
- }
- if (Debug)
- {
- if (OneWire::crc8( addr, 7) != addr[7])
- {
- Serial.print("CRC is not valid!\n");
- return;
- }
- if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID)
- {
- Serial.print("Device is not a DS18x20 family device.\n");
- return;
- }
- }
- ds.reset();
- ds.select(addr);
- // Запускаем конвертацию
- ds.write(0x44, 1);
- // Подождем...
- delay(1000);
- present = ds.reset();
- ds.select(addr);
- // Считываем ОЗУ датчика
- ds.write(0xBE);
- // Обрабатываем 9 байт
- for ( i = 0; i < 9; i++)
- {
- data[i] = ds.read();
- }
- // Высчитываем температуру :)
- int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
- LowByte = data[0];
- HighByte = data[1];
- TReading = (HighByte << 8) + LowByte;
- // Проверяем дубак там или нет
- SignBit = TReading & 0x8000;
- // Если на улице дубак :)
- if (SignBit)
- {
- TReading = (TReading ^ 0xffff) + 1;
- }
- // Умножаем на (100 * 0.0625) или 6.25
- Tc_100 = (6 * TReading) + TReading / 4;
- // Отделяем целые от дробных чисел
- Whole = Tc_100 / 100;
- Fract = Tc_100 % 100;
- if (Debug)
- {
- Serial.println("|||||||||||||TEMP|||||||||||||||");
- Serial.print("Temperature: ");
- // Если на улице дубак напишем минус перед цифрами :)
- if (SignBit)
- {
- Serial.print("-");
- }
- Serial.print(Whole);
- Serial.print(".");
- if (Fract < 10)
- {
- Serial.print("0");
- }
- Serial.print(Fract);
- Serial.print("\n");
- }
- char temp[3];
- itoa(Whole,temp);
- strcat(replyBuffer,"\n#");
- //конвертируем адрес термодатчика
- 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,".");
- if (Fract<10)
- {
- strcat(replyBuffer,"0");
- }
- itoa(Fract,temp);
- strcat(replyBuffer,temp);
- //барометр
- dps.getPressure(&Pressure);
- dps.getTemperature(&Temperature);
- if (Debug)
- {
- Serial.println("||||||||||||PRESSURE|||||||||||||||");
- Serial.print("Pressure(mm Hg):");
- Serial.print(Pressure/133.3); //Выводим давление в мм.рт ст
- Serial.print(" Temp:");
- Serial.println(Temperature*0.1); // Температуру в градусах Цельсия
- }
- char buf[8];
- long p_100, h_100;
- //получаем значение атмосферного давления
- strcat(replyBuffer, "\n#");
- strcat(replyBuffer, macbuf);
- strcat(replyBuffer, "01#");
- dps.getPressure(&Pressure);
- p_100 = Pressure/1.333;
- Whole = p_100 / 100;
- Fract = p_100 % 100;
- itoa(Whole, buf);
- strcat(replyBuffer, buf);
- strcat(replyBuffer, ".");
- if (Fract<10)
- {
- strcat(replyBuffer,"0");
- }
- itoa(Fract, buf);
- strcat(replyBuffer, buf);
- //влажность
- float h = dht.readHumidity();
- float t = dht.readTemperature();
- if (Debug)
- {
- Serial.println("|||||||||||||HUMIDITY||||||||||||");
- Serial.print("Humidity: ");
- Serial.print(h);
- Serial.print(" %\t");
- Serial.print("Temperature: ");
- Serial.print(t);
- Serial.println(" *C");
- }
- //получаем значение влажности
- strcat(replyBuffer, "\n#");
- strcat(replyBuffer, macbuf);
- strcat(replyBuffer, "02#");
- itoa(h, buf);
- strcat(replyBuffer, buf);
- strcat(replyBuffer,"\n##");
- //соединение
- if (((signed long)(millis() - next)) > 0)
- {
- next = millis() + 600000; //Соединение раз в 10 минут
- if (Debug)
- {
- Serial.println("Client connect"); //попытка соединения, если висит в консоли - нет сети
- }
- if (client.connect(IPAddress(94,19,113,221),8283))
- {
- if (Debug)
- {
- Serial.println("Client connected"); //удачное соединение
- }
- client.println(replyBuffer); //отправляем данные
- while(client.available()==0)
- {
- if (next - millis() < 0)
- goto close;
- }
- int size;
- while((size = client.available()) > 0)
- {
- uint8_t* msg = (uint8_t*)malloc(size);
- size = client.read(msg,size);
- Serial.write(msg,size); //выводим в консол сообщение от сервера. ОК - всехорошо. too often - слишком частая отправка
- free(msg);
- }
- close:
- //disconnect client
- if (Debug)
- {
- Serial.println("Client disconnect");
- client.stop();
- }
- else
- {
- Serial.println("Client connect failed");
- }
- }
- if (Debug)
- {
- Serial.println(replyBuffer);
- }
- }
- }//end
- //Функция определения длины строки
- int len(char *buf)
- {
- int i=0;
- do
- {
- i++;
- } while (buf[i]!='\0');
- return i;
- }
- //Функция переворота строки
- void reverse(char s[])
- {
- int i, j;
- char c;
- for (i = 0, j = strlen(s)-1; i<j; i++, j--)
- {
- c = s[i];
- s[i] = s[j];
- s[j] = c;
- }
- }
- //Функция конвертирования числа в символьный массив
- void itoa(int n, char s[])
- {
- int i, sign;
- if ((sign = n) < 0) /* записываем знак */
- n = -n; /* делаем n положительным числом */
- i = 0;
- do { /* генерируем цифры в обратном порядке */
- s[i++] = n % 10 + '0'; /* берем следующую цифру */
- } while ((n /= 10) > 0); /* удаляем */
- if (sign < 0)
- s[i++] = '-';
- s[i] = '\0';
- reverse(s);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement