Advertisement
Guest User

Untitled

a guest
Mar 2nd, 2015
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.71 KB | None | 0 0
  1. #include "DHT.h" //načtení knihovny pro vlhkoměr
  2. #define DHTPIN A1    
  3. #define DHTTYPE DHT21   // DHT 21
  4.  
  5. DHT dht(DHTPIN, DHTTYPE);
  6.  
  7. #include "etherShield.h"   //knihovny pro ethernet a webserver
  8. #include "ETHER_28J60.h"
  9.  
  10. static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};  //mac adresa                                                            
  11. static uint8_t ip[4] = {10, 107, 90, 96};     //ip adresa
  12. static uint16_t port = 80;      //port
  13. ETHER_28J60 ethernet;
  14.  
  15.  
  16.  
  17. //----------nastavení pinů------
  18. #define ANEMOMETER_PIN 3
  19. #define ROSA_PIN A2
  20. #define ANEMOMETER_INT 1
  21. #define VANE_PIN A0
  22. #define RAIN_GAUGE_PIN 2
  23. #define RAIN_GAUGE_INT 0
  24. #define MSECS_CALC_WIND_DIR   5000
  25. #define ulong unsigned long
  26.  
  27. //------ knihovny pro tlakoměr
  28. #include <SFE_BMP180.h>
  29. #include <Wire.h>
  30.  
  31. SFE_BMP180 pressure;
  32.  
  33. ulong nextCalcDir;                  
  34. ulong time;  
  35.  
  36. #define NUMDIRS 8
  37.  
  38. ulong   adc[NUMDIRS] = {26, 45, 77, 118, 161, 196, 220, 256};
  39. char *strVals[NUMDIRS] = {"W","NW","N","SW","NE","S","SE","E"};
  40. byte dirOffset=0;
  41.  
  42.  
  43. // knihovna pro teploměr
  44. #include <OneWire.h>
  45.  
  46. int DS18S20_Pin = 8; //DS18S20 Signal pin on digital 2
  47. OneWire ds(DS18S20_Pin);  // on digital pin 2
  48.  
  49.  
  50. int rosa = 0;
  51.  
  52. void setup() {
  53.   //  Serial.begin(9600);
  54.  
  55.   dht.begin();
  56.   ethernet.setup(mac, ip, port);
  57.  
  58.   nextCalcDir   = millis() + MSECS_CALC_WIND_DIR;
  59.  
  60.   pinMode(ANEMOMETER_PIN,INPUT);
  61.   digitalWrite(ANEMOMETER_PIN,HIGH);  
  62.   pinMode(RAIN_GAUGE_PIN,INPUT);
  63.   digitalWrite(RAIN_GAUGE_PIN,HIGH);  
  64.   attachInterrupt(ANEMOMETER_INT,anemometerClick,FALLING);
  65.   attachInterrupt(RAIN_GAUGE_INT,rainGageClick,FALLING);
  66.   pinMode(ROSA_PIN,INPUT);
  67.   digitalWrite(ROSA_PIN,HIGH);
  68.   interrupts();
  69.  
  70.   if (!pressure.begin())
  71.   {
  72.     while(1); // zastavit vykonavani
  73.   }
  74.  
  75. }
  76.  
  77.  
  78. #define WIND_FACTOR 2.4
  79. #define TEST_PAUSE 60000
  80.  
  81. volatile unsigned long anem_count=0;
  82. volatile unsigned long anem_last=0;
  83. volatile unsigned long anem_min=0xffffffff;
  84.  
  85. double getUnitWind()
  86. {
  87.   unsigned long reading=anem_count;
  88.   anem_count=0;
  89.   return (WIND_FACTOR*reading)/(TEST_PAUSE/1000);
  90. }
  91.  
  92. double getGust()
  93. {
  94.  
  95.   unsigned long reading=anem_min;
  96.   anem_min=0xffffffff;
  97.   double time=reading/1000000.0;
  98.  
  99.   return (1/(reading/1000000.0))*WIND_FACTOR;
  100. }
  101.  
  102. void anemometerClick()
  103. {
  104.   long thisTime=micros()-anem_last;
  105.   anem_last=micros();
  106.   if(thisTime>500)
  107.   {
  108.     anem_count++;
  109.     if(thisTime<anem_min)
  110.     {
  111.       anem_min=thisTime;
  112.     }
  113.  
  114.   }
  115. }
  116.  
  117.  
  118. #define RAIN_FACTOR 0.2794
  119.  
  120. volatile unsigned long rain_count=0;
  121. volatile unsigned long rain_last=0;
  122.  
  123. double getUnitRain()
  124. {
  125.  
  126.   unsigned long reading=rain_count;
  127.   rain_count=0;
  128.   double unit_rain=reading*RAIN_FACTOR;
  129.  
  130.   return unit_rain;
  131. }
  132.  
  133. void rainGageClick()
  134. {
  135.     long thisTime=micros()-rain_last;
  136.     rain_last=micros();
  137.     if(thisTime>500)
  138.     {
  139.       rain_count++;
  140.     }
  141. }
  142.  
  143. static const int vaneValues[] PROGMEM={66,84,92,127,184,244,287,406,461,600,631,702,786,827,889,946};
  144. static const int vaneDirections[] PROGMEM={1125,675,900,1575,1350,2025,1800,225,450,2475,2250,3375,0,2925,3150,2700};
  145.  
  146. double getWindVane()
  147. {
  148.   analogReference(DEFAULT);
  149.   //digitalWrite(VANE_PWR,HIGH);
  150.   delay(100);
  151.   for(int n=0;n<10;n++)
  152.   {
  153.     analogRead(VANE_PIN);
  154.   }
  155.  
  156.   unsigned int reading=analogRead(VANE_PIN);
  157.  // digitalWrite(VANE_PWR,LOW);
  158.   unsigned int lastDiff=2048;
  159.  
  160.   for (int n=0;n<16;n++)
  161.   {
  162.     int diff=reading-pgm_read_word(&vaneValues[n]);
  163.     diff=abs(diff);
  164.     if(diff==0)
  165.        return pgm_read_word(&vaneDirections[n])/10.0;
  166.  
  167.     if(diff>lastDiff)
  168.     {
  169.       return pgm_read_word(&vaneDirections[n-1])/10.0;
  170.     }
  171.  
  172.     lastDiff=diff;
  173. }
  174.  
  175.   return pgm_read_word(&vaneDirections[15])/10.0;
  176.  
  177. }
  178.  
  179. void loop() {
  180.   float h = dht.readHumidity();
  181.   float t = dht.readTemperature();
  182.   float f = dht.readTemperature(true);
  183.  
  184.   if (isnan(h) || isnan(t) || isnan(f)) {
  185.       return;
  186.   }
  187.   float hi = dht.computeHeatIndex(f, h);
  188.   int val;
  189.   byte x, reading;
  190.   val = analogRead(A1);
  191.   val >>=2;                        
  192.   reading = val;
  193.   for (x=0; x<NUMDIRS; x++)
  194.   {
  195.     if (adc[x] >= reading)
  196.        break;
  197.   }
  198.   x = (x + dirOffset) % 8;  
  199.  
  200.  
  201.   float temperature = getTemp();
  202.   rosa = analogRead(ROSA_PIN);
  203.  
  204.   if (ethernet.serviceRequest())
  205.   {
  206.     ethernet.print("Content-Type:text/plain\n\n");    // jenom header pro preview
  207.    
  208.     ethernet.print("WindUnit %f\n" % getUnitWind());  // sila vetru
  209.     ethernet.print("WindGust %f\n" % getGust());      // rychlost vetru
  210.     ethernet.print("WindVane %f\n" % getWindVane());  // smer vetru
  211.     ethernet.print("RainUnit %f\n" % getUnitRain());  // srazky asi v MM
  212.     ethernet.print("TempOut %f\n" % temperature);     // venkonvni teplota
  213.     ethernet.print("TempHumidity %f\n" % t);          // pomocna teplota vlhkosti
  214.     ethernet.print("DewPoint %f\n" % rosa);           // rosny bod
  215. /*   // ZAPIS PRO STAT Site (StatsD)
  216.     ethernet.print("WindUnit:%f|g\n" % getUnitWind());  // sila vetru
  217.     ethernet.print("WindGust:%f|g\n" % getGust());      // rychlost vetru
  218.     ethernet.print("WindVane:%f|g\n" % getWindVane());  // smer vetru
  219.     ethernet.print("RainUnit:%f|c\n" % getUnitRain());  // srazky asi v MM
  220.     ethernet.print("TempOut:%f|g\n" % temperature);     // venkonvni teplota
  221.     ethernet.print("TempHumidity:%f|g\n" % t);          // pomocna teplota vlhkosti
  222.     ethernet.print("DewPoint:%f|g\n" % rosa);           // rosny bod
  223.    
  224.  */    
  225.     delay(pressure.startTemperature());
  226.     double T;
  227.     pressure.getTemperature(T);  
  228.  
  229.     delay(pressure.startPressure(3));
  230.     double P;
  231.     pressure.getPressure(P,T);
  232.  
  233.     ethernet.print("Pressure %f\n" % P);              // tlak
  234.     ethernet.print("TempPressure %f\n" % T);          // pomocna teplota tlaku?
  235.    
  236. /*   // ZAPIS PRO STAT Site (StatsD)
  237.     ethernet.print("Pressure:%f|g\n" % P);              // tlak
  238.     ethernet.print("TempPressure:%f|g\n" % T);          // pomocna teplota tlaku?
  239. */
  240.     ethernet.respond();
  241.   }
  242.  
  243.   delay(100);
  244.  
  245. }
  246.  
  247.  
  248. float getTemp(){
  249.   byte data[12];
  250.   byte addr[8];
  251.  
  252.   if ( !ds.search(addr)) {
  253.       //no more sensors on chain, reset search
  254.       ds.reset_search();
  255.       return -1000;
  256.   }
  257.  
  258.   if ( OneWire::crc8( addr, 7) != addr[7]) {
  259.             return -1000;
  260.   }
  261.  
  262.   if ( addr[0] != 0x10 && addr[0] != 0x28) {
  263.             return -1000;
  264.   }
  265.  
  266.   ds.reset();
  267.   ds.select(addr);
  268.   ds.write(0x44,1);
  269.  
  270.   byte present = ds.reset();
  271.   ds.select(addr);  
  272.   ds.write(0xBE);
  273.  
  274.  
  275.   for (int i = 0; i < 9; i++) {
  276.     data[i] = ds.read();
  277.   }
  278.  
  279.   ds.reset_search();
  280.  
  281.   byte MSB = data[1];
  282.   byte LSB = data[0];
  283.  
  284.   float tempRead = ((MSB << 8) | LSB);
  285.   float TemperatureSum = tempRead / 16;
  286.  
  287.   return TemperatureSum;
  288.    
  289. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement