Guest User

Syrovarka

a guest
Oct 9th, 2015
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.95 KB | None | 0 0
  1. #include <LiquidCrystal.h>   // Библиотека LCD дисплея
  2. #include <OneWire.h>         // библиотека OneWire для датчика температуры
  3.  
  4. #define over_temp   41000    // верхний предел температуры в градусах Цельсия*1000 (можно здесь изменять)
  5. #define hi_temp     38000    // приближение к верхнему пределу *1000
  6.  
  7. #define low_temp    33000    // приближение к нижнему пределу температуры *1000
  8. #define lowest_temp 32000    // нижний предел температуры *1000
  9.  
  10.  
  11. LiquidCrystal lcd(8,9,4,5,6,7);  // подключение индикатора
  12.  
  13.  
  14. OneWire  ds(2);  // сенсор температуры на вывод 2  
  15.  
  16. void setup(void) {
  17.   Serial.begin(9600);  // инициализация COM-порта на скорости 9600
  18.   lcd.begin(16,2);  // инициализация дисплея, как 16х2
  19.   lcd.clear();     // очистка дисплея
  20.   pinMode (15,OUTPUT); // ножка для звукового сигнала
  21. pinMode (17,OUTPUT);  // ножка для звукового сигнала
  22. }
  23.  
  24.  
  25.  
  26. //------------------получение температуры с сенсора--------------
  27. long temp_sensor() {
  28.   byte i;
  29.   byte present = 0;
  30.   byte type_s;
  31.   byte data[12];
  32.   byte addr[8];
  33.   long celsius;
  34.  
  35.   if ( !ds.search(addr)) {
  36.     Serial.println("No more addresses.");
  37.     Serial.println();
  38.     ds.reset_search();
  39.     delay(250);
  40.     return 85000;
  41.   }
  42.  
  43.   Serial.print("ROM =");
  44.   for( i = 0; i < 8; i++) {
  45.     Serial.write(' ');
  46.     Serial.print(addr[i], HEX);
  47.   }
  48.  
  49.   if (OneWire::crc8(addr, 7) != addr[7]) {
  50.       Serial.println("CRC is not valid!");
  51.       return 85000;
  52.   }
  53.   Serial.println();
  54.  
  55.   // the first ROM byte indicates which chip
  56.   switch (addr[0]) {
  57.     case 0x10:
  58.       Serial.println("  Chip = DS18S20");  // or old DS1820
  59.       type_s = 1;
  60.       break;
  61.     case 0x28:
  62.       Serial.println("  Chip = DS18B20");
  63.       type_s = 0;
  64.       break;
  65.     case 0x22:
  66.       Serial.println("  Chip = DS1822");
  67.       type_s = 0;
  68.       break;
  69.     default:
  70.       Serial.println("Device is not a DS18x20 family device.");
  71.       return 85000;
  72.   }
  73.  
  74.   ds.reset();
  75.   ds.select(addr);
  76.   ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  77.  
  78.   delay(2000);     // maybe 750ms is enough, maybe not
  79.   // we might do a ds.depower() here, but the reset will take care of it.
  80.  
  81.   present = ds.reset();
  82.   ds.select(addr);    
  83.   ds.write(0xBE);         // Read Scratchpad
  84.  
  85.   Serial.print("  Data = ");
  86.   Serial.print(present, HEX);
  87.   Serial.print(" ");
  88.   for ( i = 0; i < 9; i++) {           // we need 9 bytes
  89.     data[i] = ds.read();
  90.     Serial.print(data[i], HEX);
  91.     Serial.print(" ");
  92.   }
  93.   Serial.print(" CRC=");
  94.   Serial.print(OneWire::crc8(data, 8), HEX);
  95.   Serial.println();
  96.  
  97.   // Convert the data to actual temperature
  98.   // because the result is a 16 bit signed integer, it should
  99.   // be stored to an "int16_t" type, which is always 16 bits
  100.   // even when compiled on a 32 bit processor.
  101.   int16_t raw = (data[1] << 8) | data[0];
  102.   if (type_s) {
  103.     raw = raw << 3; // 9 bit resolution default
  104.     if (data[7] == 0x10) {
  105.       // "count remain" gives full 12 bit resolution
  106.       raw = (raw & 0xFFF0) + 12 - data[6];
  107.     }
  108.   } else {
  109.     byte cfg = (data[4] & 0x60);
  110.     // at lower res, the low bits are undefined, so let's zero them
  111.     if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
  112.     else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
  113.     else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
  114.     //// default is 12 bit resolution, 750 ms conversion time
  115.   }
  116.   celsius = ((float)raw / 16.0)*1000;
  117.  
  118.   Serial.print("  Temperature = ");
  119.   Serial.print(celsius);
  120.   Serial.print(" Celsius, ");
  121.  
  122.  
  123.   return celsius;
  124. }
  125. //----------------buzer--------------------------------
  126. void Buzer (boolean sound){
  127.  
  128. digitalWrite (15,LOW);
  129. for(int i=0; i<(300-250*sound); i++){
  130.   digitalWrite(17,HIGH);
  131.   delayMicroseconds (400+3000*sound);
  132.   digitalWrite(17,LOW);
  133.   delayMicroseconds (400+3000*sound);
  134. }
  135. return ;
  136. }
  137. //-----------------------------
  138.  
  139. void loop(){
  140.   long cels = 0;
  141.  cels = temp_sensor();
  142.    Serial.print("  Temperature = ");
  143.   Serial.print(cels);
  144.   Serial.print(" Celsius, ");
  145.   switch (cels){
  146.     case 85000:
  147.     return;
  148.     break;
  149.     default:
  150.    lcd.setCursor(0,0);
  151.   lcd.print(float(cels)/1000);
  152.   lcd.print(" Degree C");
  153.  // break;
  154.   }
  155.  
  156.   if (cels > over_temp){
  157.     for (byte i=0; i<5; i++){
  158.       Buzer(0);
  159.       delay(50);
  160.     }
  161.    }
  162.     if (cels > hi_temp){
  163.    
  164.       Buzer(0);
  165.    
  166.    }
  167.        if (cels < low_temp){
  168.    
  169.       Buzer(1);
  170.       delay (10);
  171.    
  172.    }
  173.     if (cels < lowest_temp){
  174.     for (byte i=0; i<4; i++){
  175.      Buzer(1);
  176.       delay (10);
  177.     }
  178.    }
  179.    
  180.  
  181.  
  182. }
Advertisement
Add Comment
Please, Sign In to add comment