OpenWeatherMap arduino-based weather station

=Ethernet термометр\гигрометр\барометр на основе Arduino= http://openweathermap.org/station/39276

Arduino
Arduino UNODealextreme, 15$

Ethernet shield
ENC28J60 Ethernet Shield Dealextreme, 20$

Библиотека для ENC28J60 -

Лучше использовать вот такой Ethernet Shield W5100, стоит в 2 раза дешевле - 10$. Можно использовать стандартную библиотеку Arduino, т.к. сделан на w5100.

Можно сэкономить и купить за 5$ ENC28J60 Ethernet LAN Network Module и Arduino Nano 11$

Экран
Arduino Compatible 8X Seven Segments Display + 8X Key + 8X Double Color LED Module Dealextreme, 7$

Библиотека -

Датчик температуры и влажности
DHT22/AM2302 Digital Temperature And Humidity Sensor BuyInCoins 6.30$, 2 штуки

Библиотека -

Датчик давления
BMP085 Barometric Digital Pressure Sensor Module Board BuyInCoins 8$

Библиотека -

Корпус уличного датчика (radiation shield)
Корпус уличного датчика изготовлен на основе вот этой инструкции -
 * Блюдца под цветочные горшки белого цвета, диаметр 18 см., 10 шт. по 11р., Ашан садовый центр
 * Шпилька м6 1 метр, ~ 24 р., Леруа Мерлен
 * ПВХ трубка 2 метра, ~ 14 р., Леруа Мерлен
 * Гайки м6, 4 шт., Леруа Мерлен
 * П-образный алюминиевый профиль, 60 см, Леруа Мерлен
 * Саморезы по дереву, 2 шт., Леруа Мерлен
 * Телефонный провод 8 метров, ~ 15 р., ЧипДип

Корпус
G1098G, Корпус для РЭА 135х75х50мм, пластик, серый 160 р., ЧипДип

Исходный текст скетча

 * 1) include 
 * 2) include 
 * 3) include 
 * 4) include 
 * 5) include 


 * 1) define KEY  "Вставить ключ"
 * 2) define LATITUDE " "
 * 3) define LONGTITUDE " "

DHT22 DHT22_indoor(9); DHT22 DHT22_outdoor(8); //DHT22_ERROR_t errorCode;

BMP085 dps; // Digital Pressure Sensor

TM1638 module(6, 7, 5); char TM1638_buffer[9]; byte buttons; byte mode; char http_code[4];

int TemperatureInt_indoor = 0; int HumidityInt_indoor = 0; long PressureLong = 0; int TemperatureInt_outdoor = 0; int HumidityInt_outdoor = 0; char website[] PROGMEM = "openweathermap.org"; char ETH_ERR[] PROGMEM = "Ethernet controller error"; char DHCP_ERR[] PROGMEM = "DHCP error"; char DNS_ERR[] PROGMEM = "DNS error";

byte Ethernet::buffer[700];

byte session;

uint32_t timer; uint32_t timer_2;

void setup { byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};

Serial.begin(57600); Wire.begin; dps.init(MODE_ULTRA_HIGHRES, 15000, true);

if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) Serial.println(ETH_ERR); if (!ether.dhcpSetup) Serial.println(DHCP_ERR);

ether.printIp("IP: ", ether.myip); ether.printIp("GW: ", ether.gwip); ether.printIp("DNS: ", ether.dnsip);

if (!ether.dnsLookup(website)) Serial.println(DNS_ERR); ether.printIp("SRV: ", ether.hisip); Serial.println; delay(2000); } void loop { ether.packetLoop(ether.packetReceive);

buttons = module.getButtons; if (buttons != 0) { mode = buttons; }

switch (mode) { case 0: sprintf(TM1638_buffer, "%+04d%+04d", TemperatureInt_outdoor, TemperatureInt_indoor); module.setDisplayToString(TM1638_buffer,0b00100010); break; case 1: sprintf(TM1638_buffer, "%+04d%+04d", TemperatureInt_outdoor, TemperatureInt_indoor); module.setDisplayToString(TM1638_buffer,0b00100010); break; case 2: sprintf(TM1638_buffer, "%+04d%+04d", HumidityInt_outdoor, HumidityInt_indoor); module.setDisplayToString(TM1638_buffer,0b00100010); break; case 4: module.setDisplayToDecNumber(PressureLong, 4, false); break; case 8: module.setDisplayToDecNumber(atoi(http_code), 0, false); break; }

if (millis > timer) { timer = millis + 10000; dps.getPressure(&PressureLong); Serial.print("P:"); Serial.println(PressureLong*0.01);

DHT22_indoor.readData; TemperatureInt_indoor = DHT22_indoor.getTemperatureCInt; HumidityInt_indoor = DHT22_indoor.getHumidityInt; Serial.print("Ti:"); Serial.println(TemperatureInt_indoor*0.1); Serial.print("Hi:"); Serial.println(HumidityInt_indoor*0.1); DHT22_outdoor.readData; TemperatureInt_outdoor = DHT22_outdoor.getTemperatureCInt; HumidityInt_outdoor = DHT22_outdoor.getHumidityInt; Serial.print("To:"); Serial.println(TemperatureInt_outdoor*0.1); Serial.print("Ho:"); Serial.println(HumidityInt_outdoor*0.1); Serial.println; }

if (millis > timer_2) { timer_2 = millis + 60000; SendToOpenweather ; } const char* reply = ether.tcpReply(session); if (reply != 0) { Serial.println; Serial.println(reply); Serial.println;

strncpy(http_code, reply+9, 3); http_code[4]='\0'; Serial.println; Serial.println(http_code); Serial.println; if (atoi(http_code) == 200) { module.setLED(TM1638_COLOR_GREEN, 0); } else { module.setLED(TM1638_COLOR_RED, 0); } }

}

void SendToOpenweather { Stash stash; byte sd = stash.create; stash.print("temp="); stash.print(TemperatureInt_outdoor*0.1); stash.print("&"); stash.print("humidity="); stash.print(HumidityInt_outdoor*0.1); stash.print("&"); stash.print("pressure="); stash.print(PressureLong*0.01); stash.print("&"); stash.print("lat="); stash.print(LATITUDE); stash.print("&"); stash.print("long="); stash.print(LONGTITUDE); stash.save; Stash::prepare(PSTR( "POST /data/post HTTP/1.1" "\r\n" "Host: $F" "\r\n" "Authorization: Basic $F" "\r\n" "User-Agent: Arduino arduino1 weather station test" "\r\n" "Content-Length: $D" "\r\n" "Content-Type: application/x-www-form-urlencoded" "\r\n" "\r\n" "$H"),		website, PSTR(KEY), stash.size, sd); session = ether.tcpSend; }