Термометр на arduino + семисегментный индикатор на 3 цыфры - ФОРУМ ДВ Робот dvrobot.ru
Пятница, 16.11.2018, 05:21
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: Serg, GRACH  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Arduino - вопросы и ответы. » Термометр на arduino + семисегментный индикатор на 3 цыфры
    Термометр на arduino + семисегментный индикатор на 3 цыфры
    sanikДата: Воскресенье, 27.04.2014, 05:47 | Сообщение # 1
    5 Вольт
    Группа: Пользователи
    Сообщений: 55
    Репутация: 0
    Статус: Offline
    Помогите пожалуйста! Почему то температура в сериал выводиться правильно а на индикаторах с каждым чтением меняется.
    Буду очень благодарен если у кого найдется готовый нормально работающий код.
    
    Код
    #include <OneWire.h>

    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.
         
       byte 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);   
       }
       }
    }

    


    Ну не знаю я
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Arduino - вопросы и ответы. » Термометр на arduino + семисегментный индикатор на 3 цыфры
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат