Термометр

Тема в разделе "Arduino & Shields", создана пользователем sanik, 25 апр 2014.

  1. sanik

    sanik Гик

    Помогите пожалуйста! Почему то температура в сериал выводиться правильно а на индикаторах с каждым чтением меняется. И можно ли улучшить этот код сделать чтоб не мигал?
    Код (Text):

    #include <OneWire.h>
    //http://arduino.net.ua/Arduino_articles/Arduino_proekty/Podkljuchaem%20datchik%20temperatury%20DS18S20%20ili%20DS18B20%20k%20Arduino/

    OneWire ds (12); // on pin 12 - приём данны с датчика
      static byte celsy, desyata;

    void setup (void) {
      Serial.begin (9600);
      pinMode(2, OUTPUT); //0 разряд
      pinMode(3, OUTPUT); // 1 разряд
      pinMode(4, OUTPUT); // 2 разряд
      pinMode(5, OUTPUT);// сегмент F
      pinMode(6, OUTPUT);// сегмент A
      pinMode(7, OUTPUT);// сегмент E
      pinMode(8, OUTPUT);// сегмент B
      pinMode(9, OUTPUT);// сегмент D
      pinMode(10, OUTPUT);// сегмент C
      pinMode(11, OUTPUT);// сегмент G
      pinMode(13, OUTPUT);// сегмент dp
    }

    void digit (byte cifra) {
      // сначала всё обесточиваем
      for (byte j=5; j<12; j++)
      {
      digitalWrite(j, HIGH);
      }
      digitalWrite(13, HIGH);
      switch (cifra)
      {
      case 0:
      {
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      break;
      }
      case 1:
      {
      digitalWrite(8, LOW);
      digitalWrite(10, LOW);
      break;
      }
      case 2:
      {
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 3:
      {
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 4:
      {
      digitalWrite(5, LOW);
      digitalWrite(8, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 5:
      {
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 6:
      {
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 7:
      {
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      digitalWrite(10, LOW);
      break;
      }
      case 8:
      {
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 9:
      {
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      default: ;
      }
    }

    void loop (void) {
      byte i;
      byte present = 0;
      byte type_s;
      byte data[12];
      byte addr[8];
      float celsius, fahrenheit;
     
      if (! ds.search (addr)) {
      ds.reset_search ();
      for (byte i=0;i<20;i++)
      {
      digit(celsy/10);
      digitalWrite(4, HIGH);
      delay (5);
      digitalWrite(4, LOW);
      digit(celsy%10);
      digitalWrite(13, LOW);
      digitalWrite(3, HIGH);
      delay (5);
      digitalWrite(3, LOW);
      digit(desyata%10);
      digitalWrite(2, HIGH);
      delay (5);
      digitalWrite(2, LOW);
      }
      //delay (250);
      return;
      }
     
      ds.reset ();
      ds.select (addr);
      ds.write (0x44,1); // start conversion, with parasite power on at the end

    // delay (1000); // maybe 750ms is enough, maybe not
      // we might do a ds.depower () here, but the reset will take care of it.
     
      present = ds.reset ();
      ds.select (addr);
      ds.write (0xBE); // Read Scratchpad
     
      for (i = 0; i < 9; i++) { // we need 9 bytes
      data[i] = ds.read ();
      }

      // convert the data to actual temperature
      unsigned int raw = (data[1] << 8) | data[0];
      if (type_s) {
      raw = raw << 3; // 9 bit resolution default
      if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
      }
      } else {
      byte cfg = (data[4] & 0x60);
      if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
      else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
      else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
      // default is 12 bit resolution, 750 ms conversion time
      }
      celsius = (float)raw / 16.0;
      fahrenheit = celsius * 1.8 + 32.0;
      Serial.print ("Temperature =");
      Serial.print (celsius);
      Serial.print (" C,");
      Serial.print (fahrenheit);
      Serial.println (" F");

      if (celsius<70)
      {
      celsy=celsius;
      desyata=celsius*10;
      for (byte i=0;i<50;i++)
      {
      digit(celsy/10);
      digitalWrite(4, HIGH);
      delay (5);
      digitalWrite(4, LOW);
      digit(celsy%10);
      digitalWrite(13, LOW);
      digitalWrite(3, HIGH);
      delay (5);
      digitalWrite(3, LOW);
      digit(desyata%10);
      digitalWrite(2, HIGH);
      delay (5);
      digitalWrite(2, LOW);
      }
      }
    }
     
  2. sanik

    sanik Гик

    Или может у кого есть готовый вариант? Нужен на трех сегментниках один датчик и диапазон от -40 до 130 градусов.
     
  3. atompost

    atompost Гик

    Для начала:

    Код (Text):
    pinMode(5, OUTPUT);// сегмент F
      pinMode(6, OUTPUT);// сегмент A
      pinMode(7, OUTPUT);// сегмент E
      pinMode(8, OUTPUT);// сегмент B
      pinMode(9, OUTPUT);// сегмент D
      pinMode(10, OUTPUT);// сегмент C
      pinMode(11, OUTPUT);// сегмент G
      pinMode(13, OUTPUT);// сегмент dp
    чтобы избежать использования аж 8 :eek: выходов ардуино введите в вашу схему вот этот счетчик, как его подключить описано вот здесь .
    Тем самым вы избежите вот этого нагромождения:)
    Код (Text):
    void digit (byte cifra) {
      // сначала всё обесточиваем
      for (byte j=5; j<12; j++)
      {
      digitalWrite(j, HIGH);
      }
      digitalWrite(13, HIGH);
      switch (cifra)
      {
      case 0:
      {
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      break;
      }
      case 1:
      {
      digitalWrite(8, LOW);
      digitalWrite(10, LOW);
      break;
      }
      case 2:
      {
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 3:
      {
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 4:
      {
      digitalWrite(5, LOW);
      digitalWrite(8, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 5:
      {
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 6:
      {
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 7:
      {
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      digitalWrite(10, LOW);
      break;
      }
      case 8:
      {
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      case 9:
      {
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      break;
      }
      default: ;
      }
    }
     
    Последнее редактирование: 25 апр 2014
  4. atompost

    atompost Гик

    вот смотрите, собрал за 10 минут:

    а вот скетч
    Код (Text):
    #include <LiquidCrystal.h>

    #include <OneWire.h>

    int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);

    //Temperature chip i/o
    OneWire ds(DS18S20_Pin);  // on digital pin 2

    void setup(void) {
      Serial.begin(9600);
      lcd.begin(16, 2);
      lcd.clear();
    }

    void loop(void) {
      float temperature = getTemp();
      Serial.println(temperature);
      lcd.setCursor(0, 0);
      //lcd.print("                ");
      lcd.print ("\x54\x65\xBC\xBE\x65\x70\x61\xBF\x79\x70\x61 ");// Пишем слово "Температура"
      lcd.print(int (temperature));
      lcd.print ("\x99""C");
      delay(1000);
     
    }


    float getTemp(){
      //returns the temperature from one DS18S20 in DEG Celsius

      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]) {
          Serial.println("CRC is not valid!");
          return -1000;
      }

      if ( addr[0] != 0x10 && addr[0] != 0x28) {
          Serial.print("Device is not recognized");
          return -1000;
      }

      ds.reset();
      ds.select(addr);
      ds.write(0x44,1); // start conversion, with parasite power on at the end

      byte present = ds.reset();
      ds.select(addr);  
      ds.write(0xBE); // Read Scratchpad

     
      for (int i = 0; i < 9; i++) { // we need 9 bytes
        data[i] = ds.read();
      }
     
      ds.reset_search();
     
      byte MSB = data[1];
      byte LSB = data[0];

      float tempRead = ((MSB << 8) | LSB); //using two's compliment
      float TemperatureSum = tempRead / 16;
     
      return TemperatureSum;
     
    }
     

    Вложения:

  5. sanik

    sanik Гик

    Спасибо за совет! но это не то, дело в том что у меня нет возможности купить счетчик я живу можно сказать в деревне, ну и нет такой критичности в выводах их вполне хватает... Ну и пример у вас для LSD так как я новичек я не смогу его правильно применить на свою схему.