Не работает часть кода, после включения ардуины

Andrey_M_A
Offline
Зарегистрирован: 07.06.2014

Здравствуйте! Столкнулся вот с таким поведением оригинальной arduino uno - есть некий код, сразу после заливки все работает. Отключаю питание, включаю - часть кода не работает. Жму на кнопку ресет - все работает. Что это может быть?

Looka
Offline
Зарегистрирован: 24.04.2012

Может быть код так написан....

art100
Offline
Зарегистрирован: 09.03.2014

1.сначало обьявление переменных - читай нарубить память на кусочки

2.потом переферию проинициализировать - читай всем микрушкам по 1 аль 0 фигнюшкам

3.потом только логику придумать - читай тех задание почитать

4.потом разбить на одинаковые подрограмки - читай subroting routing void 

5.потома корректно выийти их всего этого  - читай exit(0); halt();

6.а различать по запрещенным для остального спец символам {} ; # //

7. И писать завещаю вам кодом не более 25 строк на одну страницу, потому как понять более длинные писания за раз немыслимо.

Это я так доктора Абеля основы програмирорвания на ASSEMLER процитироваль с русским сленгом.

 

А теперь вернемся к нашим баранам.

1.

// обьявленние переменных постоянных косвенных прямых пьяных----------------

int xrenotenNogaPin2 = 2;

2.

// а не встряхнуть ли мне всю хренотень так чтобы после встрАхА все стало как я хочу --------------------

void setup(){

digitalWrite( AneZasunutLiMneEdinicu, HIGH);

}

3.

// ну пошла сдуьбинушка по кочкам ================================

void loop(){

бла-бла-бла

}

4.

// я ЧЁ Дебил адну и ту же хрень постоянно переписывать

void MoyaMnogorazovayaXren(vasya, pуtya){

// и пошла многоразовая хрень

}

5.

// че я Дебил тут что-то писать Atmel RESET к каждому чипу припаивает

Все курс программирования логических устройств закончен.

7. пункт основное программерское стадо мало выполняет и потому косяки у стада наровном месте возникают

А Абель говорил!

Сдача курсовой в понедельник.

 

А у вас молодой человек перепутки между инициализациями и логикой.

Cмотрите в стиле Arduino то есть упрощенный Керниган и Ричи С С+ С++ С# еще какойнибудь обиблиотеченный С символы разделения {} ;

Существуют устройства которые при таких ошибках не то что сами умрут но и убьт человека!!! а это уже статья 105 УК РСФСР

Например электрокардиостимулятор.

 

 

 

 

art100
Offline
Зарегистрирован: 09.03.2014

Andrey_M_A пишет:

Здравствуйте! Столкнулся вот с таким поведением оригинальной arduino uno - есть некий код, сразу после заливки все работает. Отключаю питание, включаю - часть кода не работает. Жму на кнопку ресет - все работает. Что это может быть?

Adrunio здесь не причем, эти косяки редки, потому что опасты, поэтому не известны.

Так что вы батенька ходите под статьей предумышленное убийство.

Поясняю

Типовой случай:

батарейка кончилась и и после замены пациент умер,

а ведь жил с кардиостимуляторм 1.5 года( типовое время работы типовй батарейки).

Ведь в операционной хирург как вставил вы ожили и жили 1.5 года до перезагрузки.

 

 

 

Andrey_M_A
Offline
Зарегистрирован: 07.06.2014

Спасибо большое за развернутый ответ. Пойду искать ошибки в коде. С моими знаниями, меня к кардиостимуляторам подпускать нельзя :о) Я пока на пивоварнях тренируюсь :о)

art100
Offline
Зарегистрирован: 09.03.2014

Andrey_M_A пишет:

Спасибо большое за развернутый ответ. Пойду искать ошибки в коде. С моими знаниями, меня к кардиостимуляторам подпускать нельзя :о) Я пока на пивоварнях тренируюсь :о)

ну хоть только пыво сбежит :)

 

Andrey_M_A
Offline
Зарегистрирован: 07.06.2014

не, пиво не сбежит :о)

А вот в коде я ошибок не нашел. Это не значит что их нет, просто я их не вижу :о(

До основного цикла все выглядит так:

 

/* Подключаем библиотеку для работы с датчиком температуры */
#include <OneWire.h>
/* Подключаем библиотеку для работы с LCD */
#include <LiquidCrystal.h>

int sensePin = 5; // аналоговый вход для кнопок управления
int pump = 6; // цифровой выход включения насоса

int firstHeater = 3; //выход управления первым ТЭНом



/* Создаём объект LCD-дисплея, используя конструктор класса LiquidCrystal
* с 6ю аргументами. Библиотека по количеству аргументов сама определит,
* что нужно использовать 4-битный интерфейс.
* Указываем, к каким пинам Arduino подключены выводы дисплея:
*   RS, E, DB4, DB5, DB6, DB7
*/
LiquidCrystal lcd(12, 11, 5, 4, 7, 2);

// Поддерживаемые датчики
#define DS18S20_ID 0x10
#define DS18B20_ID 0x28


// Линия 1-Wire будет на pin 10
OneWire  ds(10);

int Whole, Fract;
float Tc_100;
float currentTemp;

/* Установка значений по умолчанию */
 int step = 0;
 int def_temp = 60; /* температура */
 int def_time = 50; /* время */
 int num_step = 2; /* количество пауз */
 int num_step_cur = 1; /* текущая пауза */
 float num_step_2 = 1; /* начальный номер паузы для ШАГА 2 */
 float select_vol_step;
 int but_delay = 450; /* задержка при опросе кнопок */
 int next_step = 0; /* счетчик ШАГА начальных установок */
// int step_vol[] = {0, 32, 30, 36, 30, 40, 5, 97, 90}; /* массив со значениями температуры и времени пауз по умолчанию */
 int step_vol[] = {0, 72, 20, 72, 20, 78, 5, 97, 90}; /* массив со значениями температуры и времени пауз по умолчанию */
 //int step_vol[] = {0, 68, 3, 72, 3, 78, 3, 100, 10}; /* массив со значениями температуры и времени пауз по умолчанию */
 int step_vol_cur[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; /* массив со значениями температуры и времени пауз по умолчанию */
 /* первое значение в массиве - для того, чтобы первое значение при выборке, было 1, а не не 0 */
 
 boolean cursor_pos = false; /* начальная позиция курсора в ШАГE 1 */
 unsigned long startTime;
 unsigned long startTimeDelay;
 unsigned long startTimeBoost;
 unsigned long startTimeBoostPause;
 unsigned long currentTime;
 unsigned long startTimePump;
 unsigned long startTimePumpPause;

 int i = 0;
 float delta_temp = 1.9; /* инерционность нагрева в градусах */
 float deltaBoost_temp = 0.2; /* инерционность подогрева в градусах */
 boolean time_on = false;
 boolean flag = false;
 boolean iod_test = false;
 boolean boiling_start = false;
 //boolean proba_ok = false;
 int flagBooster;
 int flagPump = 0;
 int flagBoil = 0;
 long millis_In_Minute = 60000; // количество миллисекунд в минуте - 60000
 

 /* Установка карты изображения значка температуры*/
 enum { SYMBOL_HEIGHT = 8 };
 
 byte gradus[SYMBOL_HEIGHT] =
{
  B01100,
  B10010,
  B10010,
  B01100,
  B00000,
  B00000,
  B00000,
  B00000,
};

/* кнопка Пуск.Стоп - 160-180 */
/* кнопка Проба ОК - 136-156 */
/* Кнопка +  - 330-350 */
/* Кнопка -  - 250-260 */
/* Кнопка >  - 190-210 */


void setup() {
 /* Инициализируем дисплей: 2 строки по 16 символов */
 lcd.begin(16, 2);
 
 lcd.createChar(1, gradus);
 
 pinMode(firstHeater, OUTPUT);
 
 pinMode(pump, OUTPUT);
 
// Serial.begin(9600); 

}

вродо все так, как завещают старшие товарищи. Или нет?

art100
Offline
Зарегистрирован: 09.03.2014

если не вникать в суть а глянуть на стил

у тебя попрограмма в инициализации

это как?

память еще не нарубили а уже давай ей маслать

компилятор проверять может только синтаксис

странно много в инициализации

неужели так лсд надо готовить

#define это только вынос имен для удобства настройки

он вообще может не нужен быть

а он в середине инициализации 

это как

начали с чем-то маслать а потом имя подменили и все потеряли

 

это я не вникал еще в логику

только стиль

а где инициализация в стиле ардуин

void setup(){
}

пустой хотя бы

компилятор все равно что-то вставит в живую прошивку

а если там фигня окажется с ногами

 

 

Andrey_M_A
Offline
Зарегистрирован: 07.06.2014

а ткните носом в подпрограмму в инициализации, пожалуйста.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Что такое "не работает часть кода"? Какая часть? Как именно не работает?

Почему вдруг переменная знаковая: long millis_In_Minute = 60000; ?

Номера пинов либо через #define определяются, либо через const byte (или const uint8_t) вполне достаточно, посмотрите хотя бы параметры вызова для pinMode "void pinMode(uint8_t pin, uint8_t mode)", здесь int не нужен.

Думаете по части скетча что то можно сказать? Если скетч большой, можно его под кат поместить.

 

art100
Offline
Зарегистрирован: 09.03.2014

kisoft пишет:

...

о вот тебе логику высмотрит

Andrey_M_A
Offline
Зарегистрирован: 07.06.2014

Ох, боюсь что за такой код, меня не только помидорами закидают, но и руки оторвут. Заранее обещаю что исправлюсь :о)

остальная часть кода выглядит так:

void loop()
{
    //----------------------------------------------------------------------------------------------------------------------
    /* ШАГ 0 - переход на нужную паузу */
    if (next_step == 0) { /* если равно 1, то переходим к работе по паузам */
        
        lcd.setCursor(0, 0);
        lcd.print("Go to step: ");
        lcd.print(step);
        
        delay(but_delay);
        
        if (analogRead (sensePin) > 330 && analogRead (sensePin) < 350) { /* Кнопка + */
            step++;
        }
     
        if (analogRead (sensePin) > 250 && analogRead (sensePin) < 260) { /* Кнопка - */
            step--;
        }
        
        step = constrain(step, 0, 5);
        
        if (analogRead (sensePin) > 160 && analogRead (sensePin) < 180) { /* Кнопка Пуск-Стоп */
           step_vol_cur [1] = step_vol [1];
           step_vol_cur [2] = step_vol [2];
           step_vol_cur [3] = step_vol [3];
           step_vol_cur [4] = step_vol [4];
           step_vol_cur [5] = step_vol [5];
           step_vol_cur [6] = step_vol [6];
           step_vol_cur [7] = step_vol [7];
           step_vol_cur [8] = step_vol [8];
       
            switch (step) {
                case 0:
                  next_step = 1;
                  lcd.clear();
                  break;
                case 1:
                  next_step = 2;
                  lcd.clear();
                  break;
                case 2:
                  next_step = 2;
                  num_step_cur = 2;
                  lcd.clear();
                  break;
                case 3:
                  next_step = 3;
                  lcd.clear();
                  break;
                case 4:
                  next_step = 4;
                  lcd.clear();
                  break;
                case 5:
                  next_step = 5;
                  lcd.clear();
                  break;
            }
        }
    }
    
    
    //----------------------------------------------------------------------------------------------------------------------
    /* ШАГ 1 - Установка времени и температуры на паузах */
    if (next_step == 1) { /* если равно 2, то переходим к работе по паузам */
 
     lcd.setCursor(0, 0);
     lcd.print("Step ");
     lcd.print(int (num_step_2));
     lcd.setCursor(10, 0);
     lcd.print(step_vol[((int (num_step_2))*2)-1]);
     lcd.write(1);
     lcd.print("C  ");
     lcd.setCursor(10, 1);
     lcd.print(step_vol[(int (num_step_2))*2]);
     lcd.print("min ");
     lcd.setCursor(7, cursor_pos);
     lcd.print("->");
     lcd.setCursor(7, !cursor_pos);
     lcd.print("  ");
     delay(but_delay);
     
     
     /* Обработка событий по кнопкам */
     
     
     if (analogRead (sensePin) > 500 && analogRead (sensePin) < 515) { /* Кнопка < */
       cursor_pos = !cursor_pos; /* Смена позиции стрелочки */
       num_step_2 = num_step_2 - 0.5;
       if (int (num_step_2) < 1) num_step_2 = num_step + 0.5;
     }
     
     if (analogRead (sensePin) > 330 && analogRead (sensePin) < 350) { /* Кнопка + */
       select_vol_step = num_step_2 - int(num_step_2);
       if (select_vol_step == 0.5) {
         step_vol[(int (num_step_2))*2] = step_vol[(int (num_step_2))*2] + 1;
       } else {
         step_vol[((int (num_step_2))*2)-1] = step_vol[((int (num_step_2))*2)-1] + 1;
       }
     }
     
     if (analogRead (sensePin) > 250 && analogRead (sensePin) < 260) { /* Кнопка - */
       select_vol_step = num_step_2 - int(num_step_2);
       if (select_vol_step == 0.5) {
         step_vol[(int (num_step_2))*2] = step_vol[(int (num_step_2))*2] - 1;
       } else {
         step_vol[((int (num_step_2))*2)-1] = step_vol[((int (num_step_2))*2)-1] - 1;
       }
     }
     
     if (analogRead (sensePin) > 190 && analogRead (sensePin) < 210) { /* Кнопка > */
       cursor_pos = !cursor_pos; /* Смена позиции стрелочки */
       num_step_2 = num_step_2 + 0.5;
       if (int (num_step_2) > num_step) num_step_2 = 1;
     }
     
     if (analogRead (sensePin) > 160 && analogRead (sensePin) < 180) { /* Кнопка Пуск-Стоп */
       next_step = 2;
       
       step_vol_cur [1] = step_vol [1];
       step_vol_cur [2] = step_vol [2];
       step_vol_cur [3] = step_vol [3];
       step_vol_cur [4] = step_vol [4];
       step_vol_cur [5] = step_vol [5];
       step_vol_cur [6] = step_vol [6];
       step_vol_cur [7] = step_vol [7];
       step_vol_cur [8] = step_vol [8];
       
       lcd.clear();
       startTimePump = millis();// таймер для работы насоса
       //flag = false;
       startTimePumpPause = millis(); // таймер паузы насоса
       
       
     }
 }
 //----------------------------------------------------------------------------------------------------------------------
 // ШАГ 2 - Работа по паузам
 
 if (next_step == 2 && num_step_cur < 3) { /* если равно 2, то переходим к работе по паузам */
 
      lcd.setCursor(0, 0);
      
      if (iod_test) {
          lcd.print("Iodine");
      } else {
          lcd.print("Step:");
      }
      
      lcd.setCursor(0, 1);
      
      if (iod_test) {
          lcd.print("test");
      } else {
          lcd.print(num_step_cur);
          lcd.print("->2");
      }
      //lcd.print(num_step);
      lcd.setCursor(7, 0);
      lcd.print(step_vol[2+i]);
      lcd.setCursor(10, 0);
      lcd.print(step_vol[1+i]);
      lcd.print(".0");
      lcd.write(1);
      lcd.print("C");
      
      Tc_100 = readTemp (); //получение данных с датчика температуры
      currentTemp = Tc_100 / 100; //температура для обработки
             
    if (flag == false){
        if (currentTemp < (float) step_vol[1+i] - delta_temp) {
          digitalWrite(firstHeater, HIGH);
        } else {
          digitalWrite(firstHeater, LOW);
          flag = true;
          flagBooster = 0;
          time_on = true;
          startTime = millis();// таймер минут
          startTimeDelay = millis();// таймер компенсации инерционности нагрева
          startTimeBoostPause = millis();// таймер компенсации инерционности нагрева при поддержании температуры
          
        }  
    }
      
    if (flag == true) {
        if ((millis() - startTimeDelay) >= 120000 && (millis() - startTimeBoostPause) >= 60000 && currentTemp < ((float) step_vol[1+i] - deltaBoost_temp)) {
          digitalWrite(firstHeater, HIGH);
          if (flagBooster == 0) {
            startTimeBoost = millis();// таймер включения поддержания температуры
            flagBooster = 1;
          }
          
          if ((millis() - startTimeBoost) >= 20000){
            digitalWrite(firstHeater, LOW);
            startTimeBoostPause = millis();
            flagBooster = 0;
          }
          
        }
        
    }
            
      int Whole = readTemp () / 100; //температура для экрана целая часть
      int Fract = (readTemp () % 100) / 10; //температура для экрана дробная часть
            
      lcd.setCursor(6, 1);
      if (step_vol_cur[2+i] < 100) lcd.print(" ");
      if (step_vol_cur[2+i] < 10) lcd.print(" ");
      lcd.print(step_vol_cur[2+i]);
      if (Whole < 10) {
        lcd.setCursor(11, 1);
      } else {
        lcd.setCursor(10, 1);
      }
      lcd.print(Whole);
      lcd.print(".");
      lcd.print(Fract);
      lcd.write(1);
      lcd.print("C");
      
      // управление насосом
    if ((millis() - startTimePumpPause) >= 30000) { // время паузы насоса
    
      digitalWrite(pump, HIGH);
      if (flagPump == 0) {
        startTimePump = millis();// таймер включения насоса
        flagPump = 1;
      }
      
      if ((millis() - startTimePump) >= 60000){ // время работы насоса
        digitalWrite(pump, LOW);
        startTimePumpPause = millis();
        flagPump = 0;
      }
      
    }
     
    if ((millis() - startTime) >= millis_In_Minute && time_on == true) {
        if (step_vol_cur[2+i] > 0) {
            step_vol_cur[2+i] = step_vol_cur[2+i] - 1;
            startTime = millis();
        } else {
            if (num_step_cur == 2){
                //if (lcd_clear) {
                //    lcd.clear();
                //    lcd_clear = false;
                //}
                iod_test = true;
                if (analogRead (sensePin) > 136 && analogRead (sensePin) < 156) { /* Кнопка Проба OK */
                    next_step = 3;
                    time_on = false;
                    flag = false;
                    lcd.clear();
                }
            } else {
                flag = false;
                time_on = false;
                num_step_cur = num_step_cur + 1;
                i = i+2;
            }
        }
    }
    }
        
 
 
 //----------------------------------------------------------------------------------------------------------------------
 // мэшаут
 if (next_step == 3) { /* если равно 3, то mashout */
      lcd.setCursor(0, 0);
      lcd.print("Mash");
      lcd.setCursor(0, 1);
      lcd.print("out");
      lcd.setCursor(8, 0);
      lcd.print(step_vol[6]); // время мэшаута
      lcd.setCursor(10, 0);
      lcd.print(step_vol[5]); // температура мэшаута
      lcd.print(".0");
      lcd.write(1);
      lcd.print("C");
      
      Tc_100 = readTemp (); //получение данных с датчика температуры
      currentTemp = Tc_100 / 100; //температура для обработки
      
      if (flag == false){
        if (currentTemp < (float) step_vol[5] - delta_temp) {
          digitalWrite(firstHeater, HIGH);
        } else {
          digitalWrite(firstHeater, LOW);
          flag = true;
          time_on = true;
          flagBooster = 0;
          startTime = millis();// таймер минут
          startTimeDelay = millis();// таймер компенсации инерционности нагрева
          startTimeBoostPause = millis();// таймер компенсации инерционности нагрева при поддержании температуры
          
        }  
      }
      
      if (flag == true) {
        if ((millis() - startTimeDelay) >= 120000 && (millis() - startTimeBoostPause) >= 60000 && currentTemp < ((float) step_vol[5] - deltaBoost_temp)) {
          digitalWrite(firstHeater, HIGH);
          if (flagBooster == 0) {
            startTimeBoost = millis();// таймер включения поддержания температуры
            flagBooster = 1;
          }
          
          if ((millis() - startTimeBoost) >= 20000){
            digitalWrite(firstHeater, LOW);
            startTimeBoostPause = millis();
            flagBooster = 0;
          }
          
        }
        
      }
            
      int Whole = readTemp () / 100; //температура для экрана целая часть
      int Fract = (readTemp () % 100) / 10; //температура для экрана дробная часть
        
      lcd.setCursor(8, 1);
      lcd.print(step_vol_cur[6]);
      if (Whole < 10) {
        lcd.setCursor(11, 1);
      } else {
        lcd.setCursor(10, 1);
      }
      lcd.print(Whole);
      lcd.print(".");
      lcd.print(Fract);
      lcd.write(1);
      lcd.print("C");
     
     // управление насосом
    if ((millis() - startTimePumpPause) >= 30000) { // время паузы насоса
    
      digitalWrite(pump, HIGH);
        if (flagPump == 0) {
            startTimePump = millis();// таймер включения насоса
            flagPump = 1;
        }
      
        if ((millis() - startTimePump) >= 60000){ // время работы насоса
            digitalWrite(pump, LOW);
            startTimePumpPause = millis();
            flagPump = 0;
        }
      
    }
    
    if ((millis() - startTime) >= millis_In_Minute && time_on == true) {
        if (step_vol_cur[6] > 0) {
            step_vol_cur[6] = step_vol_cur[6] - 1;
            startTime = millis();
        } else {
              next_step = 4;
            flag = false;
            time_on = false;
            lcd.clear();
            digitalWrite(pump, LOW);
        }
    }
 
 }
 
 //----------------------------------------------------------------------------------------------------------------------
 // стадия промывки и кипячения
    if (next_step == 4) {
        if (boiling_start == false) {
            if (analogRead (sensePin) > 136 && analogRead (sensePin) < 156) { /* Кнопка Проба OK */
                lcd.clear();
                boiling_start = true;
            } else {
                digitalWrite(firstHeater, LOW);
                lcd.setCursor(0, 0);
                lcd.print("Press OK");
                lcd.setCursor(0, 1);
                lcd.print("to start heating");
            }
        }
        
        if (boiling_start == true) {
            lcd.setCursor(0, 0);
            lcd.print("Start");
            lcd.setCursor(0, 1);
            lcd.print("boiling");
            lcd.setCursor(8, 0);
            lcd.print(step_vol[8]); // время кипения
            lcd.setCursor(11, 0);
            lcd.print(step_vol[7]); // температура кипения
            lcd.print(".0");
              
            Tc_100 = readTemp (); //получение данных с датчика температуры
            currentTemp = Tc_100 / 100; //температура для обработки
            
            int Whole = readTemp () / 100; //температура для экрана целая часть
            int Fract = (readTemp () % 100) / 10; //температура для экрана дробная часть
                    
            lcd.setCursor(7, 1);
            if (step_vol_cur[8] < 100) lcd.print(" ");
            if (step_vol_cur[8] < 10) lcd.print(" ");
            lcd.print(step_vol_cur[8]);
            if (Whole < 100) {
                lcd.setCursor(11, 1);
            } else {
                lcd.setCursor(10, 1);
            }
            lcd.print(Whole);
            lcd.print(".");
            lcd.print(Fract);
            
            if (flag == false){
                if (currentTemp < step_vol[7]) {
                  digitalWrite(firstHeater, HIGH);
            } else {
                  time_on = true;
                  if (flagBoil == 0) {
                        startTime = millis();// таймер минут
                        flagBoil = 1;
                    }
                  
                }  
            }
            
            // управление насосом
            //if (step_vol_cur[8] < 5) {
            
            //    if ((millis() - startTimePumpPause) >= 30000) { // время паузы насоса
                
            //      digitalWrite(pump, HIGH);
            //      if (flagPump == 0) {
            //        startTimePump = millis();// таймер включения насоса
            //        flagPump = 1;
            //      }
                  
            //      if ((millis() - startTimePump) >= 60000){ // время работы насоса
            //        digitalWrite(pump, LOW);
            //        startTimePumpPause = millis();
            //        flagPump = 0;
            //      }
                  
            //    }
            //}
            
            if ((millis() - startTime) >= millis_In_Minute && time_on == true) {
                if (step_vol_cur[8] > 0) {
                    step_vol_cur[8] = step_vol_cur[8] - 1;
                    startTime = millis();
                } else {
                    next_step = 5;// окончание кипения
                    lcd.clear();
                    time_on = false;
                }
            }
        
        }
    }
    
    
//----------------------------------------------------------------------------------------------------------------------
// охлаждение и вирпул  
    if (next_step == 5) {
        
        digitalWrite(firstHeater, LOW);
        digitalWrite(pump, LOW);
        lcd.setCursor(0, 0);
        lcd.print("Cooling");
    }
    // proba_ok
 // boiling_start
    
 
}

/*
прочие функции
-------------------------------------------------------------------------------------------------------------
*/

//функция получения данных с датчика температуры
int readTemp () {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
 
  if (!ds.search(addr)) {
      ds.reset_search();
      //return;
  }
 
  if (OneWire::crc8( addr, 7) != addr[7]) {
      lcd.print("CRC is not valid!");
      //return;
  }
 
  if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
      lcd.print("Device is not a DS18x20 family device.");
      //return;
  }
 
  ds.reset();
  ds.select(addr);
 
  // Запускаем конвертацию
  ds.write(0x44, 1);
 
  // Подождем...
  delay(1000);
 
  present = ds.reset();
  ds.select(addr);

  // Считываем ОЗУ датчика  
  ds.write(0xBE);

   // Обрабатываем 9 байт
  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
 
  // Высчитываем температуру :)
  int HighByte, LowByte, TReading, SignBit, Whole, Fract;
  LowByte = data[0];
  HighByte = data[1];

   TReading = (HighByte << 8) + LowByte;
   
   // Проверяем дубак там или нет
   SignBit = TReading & 0x8000;
   
   // Если на улице дубак :)
   if (SignBit) {
       TReading = (TReading ^ 0xffff) + 1;
   }
   
   // Умножаем на (100 * 0.0625) или 6.25
   Tc_100 = (6 * TReading) + TReading / 4;

   // Отделяем целые от дробных чисел
   //Whole = Tc_100 / 100;
   //Fract = Tc_100 % 100;
   
   // Если на улице дубак напишем минус перед цифрами :)
   if (SignBit) {
      //lcd.print("-");
   }
   
   //lcd.print(Whole);
   //lcd.print(".");
   
   
   
   //lcd.print(Fract);
 
  //int dataTemp = Whole + Fract;
  return Tc_100;
}

"не работает часть кода" - это не включается ТЭН. В строке 173 он включается только после перезагрузки.

а тут "long millis_In_Minute = 60000;" вы имеете ввиду забытую буковку "L"?

Andrey_M_A
Offline
Зарегистрирован: 07.06.2014

art100 пишет:

а где инициализация в стиле ардуин

 

в коде выше она есть

void setup() {
 /* Инициализируем дисплей: 2 строки по 16 символов */
 lcd.begin(16, 2);
 
 lcd.createChar(1, gradus);
 
 pinMode(firstHeater, OUTPUT);
 
 pinMode(pump, OUTPUT);
 
// Serial.begin(9600); 

}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Скетч нужно выкладывать полностью, а не кусочками, потому что.

Что я могу сказать:
1. Переменные объявляются как попало. С одним и тем же именем переменная объявляется несколько раз. Это может привести к проблемам и путанице. Хорошо, если Вы используете несколько локальных переменных с именем Whole, то уберите такую глобальную переменную, например.
2. Глобальная переменная Tc_100 используется как в основном цикле, так и в readTemp, это называется получить в лоб из-за угла. Если это ожидаемо, то так делать нельзя.
3. Есть куча переменных, которые не инициализированы. Нужно проверить все, не используются ли они неинициализированными, поскольку это первый звоночек к разности работы программы при включении и при ресете.
4. Про типы я уже писал, не нужно беспорядочно использовать типы переменных. А те, что не меняются, делать константами или определять через #define.
5. Чтобы найти причину неработы, необходимо сделать вставки отладочного вывода переменных и места, где сейчас программа выполняется, например в Serial, тогда будет понятно, почему работает при сбросе, но не работает при включении питания. И это главное, что я могу сказать.
6. Логика наворочена дай Боже, потому копаться не хочется, да и датчиков таких у меня нет, чтобы проверить.
7. По какой причине millis_In_Minute знаковая переменная? Почему Вы сравниваете беззнаковые величины со знаковыми? Странно что не работет? Это одна из возможных причин. Не обязательно, но в дальнейшем можно получить море проблем. Тем более про "проблему" переполнения millis() уже на форуме разжОвано неоднократно.

Andrey_M_A
Offline
Зарегистрирован: 07.06.2014

спасибо большое, буду исправлять.

 

art100
Offline
Зарегистрирован: 09.03.2014

пункт 7-ой доктора Абеля

и писать завещаю вам не более страницы за раз

подпрограммы не вижу

осилисть столько кода не могу

вы когда с начала до конца выверять дойдете забудете что в начале было

спорим на 100$

потому как я не могу осилить столько букАв

но с ходу вижу у вас 4 логических подобных узла

внутри тоже думаю однообразия хватает которое замечательно в подпрограммы

щас попробую тут пример кода поискать

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

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