Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "DHT.h" //načtení knihovny pro vlhkoměr
- #define DHTPIN A1
- #define DHTTYPE DHT21 // DHT 21
- DHT dht(DHTPIN, DHTTYPE);
- #include "etherShield.h" //knihovny pro ethernet a webserver
- #include "ETHER_28J60.h"
- static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; //mac adresa
- static uint8_t ip[4] = {10, 107, 90, 96}; //ip adresa
- static uint16_t port = 80; //port
- ETHER_28J60 ethernet;
- //----------nastavení pinů------
- #define ANEMOMETER_PIN 3
- #define ROSA_PIN A2
- #define ANEMOMETER_INT 1
- #define VANE_PIN A0
- #define RAIN_GAUGE_PIN 2
- #define RAIN_GAUGE_INT 0
- #define MSECS_CALC_WIND_DIR 5000
- #define ulong unsigned long
- //------ knihovny pro tlakoměr
- #include <SFE_BMP180.h>
- #include <Wire.h>
- SFE_BMP180 pressure;
- ulong nextCalcDir;
- ulong time;
- #define NUMDIRS 8
- ulong adc[NUMDIRS] = {26, 45, 77, 118, 161, 196, 220, 256};
- char *strVals[NUMDIRS] = {"W","NW","N","SW","NE","S","SE","E"};
- byte dirOffset=0;
- // knihovna pro teploměr
- #include <OneWire.h>
- int DS18S20_Pin = 8; //DS18S20 Signal pin on digital 2
- OneWire ds(DS18S20_Pin); // on digital pin 2
- int rosa = 0;
- void setup() {
- // Serial.begin(9600);
- dht.begin();
- ethernet.setup(mac, ip, port);
- nextCalcDir = millis() + MSECS_CALC_WIND_DIR;
- pinMode(ANEMOMETER_PIN,INPUT);
- digitalWrite(ANEMOMETER_PIN,HIGH);
- pinMode(RAIN_GAUGE_PIN,INPUT);
- digitalWrite(RAIN_GAUGE_PIN,HIGH);
- attachInterrupt(ANEMOMETER_INT,anemometerClick,FALLING);
- attachInterrupt(RAIN_GAUGE_INT,rainGageClick,FALLING);
- pinMode(ROSA_PIN,INPUT);
- digitalWrite(ROSA_PIN,HIGH);
- interrupts();
- if (!pressure.begin())
- {
- while(1); // zastavit vykonavani
- }
- }
- #define WIND_FACTOR 2.4
- #define TEST_PAUSE 60000
- volatile unsigned long anem_count=0;
- volatile unsigned long anem_last=0;
- volatile unsigned long anem_min=0xffffffff;
- double getUnitWind()
- {
- unsigned long reading=anem_count;
- anem_count=0;
- return (WIND_FACTOR*reading)/(TEST_PAUSE/1000);
- }
- double getGust()
- {
- unsigned long reading=anem_min;
- anem_min=0xffffffff;
- double time=reading/1000000.0;
- return (1/(reading/1000000.0))*WIND_FACTOR;
- }
- void anemometerClick()
- {
- long thisTime=micros()-anem_last;
- anem_last=micros();
- if(thisTime>500)
- {
- anem_count++;
- if(thisTime<anem_min)
- {
- anem_min=thisTime;
- }
- }
- }
- #define RAIN_FACTOR 0.2794
- volatile unsigned long rain_count=0;
- volatile unsigned long rain_last=0;
- double getUnitRain()
- {
- unsigned long reading=rain_count;
- rain_count=0;
- double unit_rain=reading*RAIN_FACTOR;
- return unit_rain;
- }
- void rainGageClick()
- {
- long thisTime=micros()-rain_last;
- rain_last=micros();
- if(thisTime>500)
- {
- rain_count++;
- }
- }
- static const int vaneValues[] PROGMEM={66,84,92,127,184,244,287,406,461,600,631,702,786,827,889,946};
- static const int vaneDirections[] PROGMEM={1125,675,900,1575,1350,2025,1800,225,450,2475,2250,3375,0,2925,3150,2700};
- double getWindVane()
- {
- analogReference(DEFAULT);
- //digitalWrite(VANE_PWR,HIGH);
- delay(100);
- for(int n=0;n<10;n++)
- {
- analogRead(VANE_PIN);
- }
- unsigned int reading=analogRead(VANE_PIN);
- // digitalWrite(VANE_PWR,LOW);
- unsigned int lastDiff=2048;
- for (int n=0;n<16;n++)
- {
- int diff=reading-pgm_read_word(&vaneValues[n]);
- diff=abs(diff);
- if(diff==0)
- return pgm_read_word(&vaneDirections[n])/10.0;
- if(diff>lastDiff)
- {
- return pgm_read_word(&vaneDirections[n-1])/10.0;
- }
- lastDiff=diff;
- }
- return pgm_read_word(&vaneDirections[15])/10.0;
- }
- void loop() {
- float h = dht.readHumidity();
- float t = dht.readTemperature();
- float f = dht.readTemperature(true);
- if (isnan(h) || isnan(t) || isnan(f)) {
- return;
- }
- float hi = dht.computeHeatIndex(f, h);
- int val;
- byte x, reading;
- val = analogRead(A1);
- val >>=2;
- reading = val;
- for (x=0; x<NUMDIRS; x++)
- {
- if (adc[x] >= reading)
- break;
- }
- x = (x + dirOffset) % 8;
- float temperature = getTemp();
- rosa = analogRead(ROSA_PIN);
- if (ethernet.serviceRequest())
- {
- ethernet.print("Content-Type:text/plain\n\n"); // jenom header pro preview
- ethernet.print("WindUnit %f\n" % getUnitWind()); // sila vetru
- ethernet.print("WindGust %f\n" % getGust()); // rychlost vetru
- ethernet.print("WindVane %f\n" % getWindVane()); // smer vetru
- ethernet.print("RainUnit %f\n" % getUnitRain()); // srazky asi v MM
- ethernet.print("TempOut %f\n" % temperature); // venkonvni teplota
- ethernet.print("TempHumidity %f\n" % t); // pomocna teplota vlhkosti
- ethernet.print("DewPoint %f\n" % rosa); // rosny bod
- /* // ZAPIS PRO STAT Site (StatsD)
- ethernet.print("WindUnit:%f|g\n" % getUnitWind()); // sila vetru
- ethernet.print("WindGust:%f|g\n" % getGust()); // rychlost vetru
- ethernet.print("WindVane:%f|g\n" % getWindVane()); // smer vetru
- ethernet.print("RainUnit:%f|c\n" % getUnitRain()); // srazky asi v MM
- ethernet.print("TempOut:%f|g\n" % temperature); // venkonvni teplota
- ethernet.print("TempHumidity:%f|g\n" % t); // pomocna teplota vlhkosti
- ethernet.print("DewPoint:%f|g\n" % rosa); // rosny bod
- */
- delay(pressure.startTemperature());
- double T;
- pressure.getTemperature(T);
- delay(pressure.startPressure(3));
- double P;
- pressure.getPressure(P,T);
- ethernet.print("Pressure %f\n" % P); // tlak
- ethernet.print("TempPressure %f\n" % T); // pomocna teplota tlaku?
- /* // ZAPIS PRO STAT Site (StatsD)
- ethernet.print("Pressure:%f|g\n" % P); // tlak
- ethernet.print("TempPressure:%f|g\n" % T); // pomocna teplota tlaku?
- */
- ethernet.respond();
- }
- delay(100);
- }
- float getTemp(){
- byte data[12];
- byte addr[8];
- if ( !ds.search(addr)) {
- //no more sensors on chain, reset search
- ds.reset_search();
- return -1000;
- }
- if ( OneWire::crc8( addr, 7) != addr[7]) {
- return -1000;
- }
- if ( addr[0] != 0x10 && addr[0] != 0x28) {
- return -1000;
- }
- ds.reset();
- ds.select(addr);
- ds.write(0x44,1);
- byte present = ds.reset();
- ds.select(addr);
- ds.write(0xBE);
- for (int i = 0; i < 9; i++) {
- data[i] = ds.read();
- }
- ds.reset_search();
- byte MSB = data[1];
- byte LSB = data[0];
- float tempRead = ((MSB << 8) | LSB);
- float TemperatureSum = tempRead / 16;
- return TemperatureSum;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement