max6675 и tm1637 зависают

Ева.
Offline
Зарегистрирован: 14.10.2018

Добрый день, подскажите пожалуйста какая ошибка в программе, выводит 5 показаний и зависает. 

#include "max6675.h"
#include <TM1637.h>
int thermoDO = 4;  // SO
int thermoCS = 5;//CS
int thermoCLK = 6;  // SCK

#define CLK 3 
#define DIO 2 
TM1637 tm1637(CLK,DIO);
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
int temper;
int k = 1;
int a = 0;
void setup() {
Serial.begin(9600);
tm1637.init();
tm1637.set(3);
}
void loop() {
a = thermocouple.readCelsius() ;
Serial.print(thermocouple.readCelsius());
if ( a < 100){
   
  tm1637.point(POINT_ON);//включаем точку, что бы разделить десятичные
  temper = thermocouple.readCelsius()*100 ;
  tm1637.display(temper);
  k = 0;
  delay (1000);
  
}
if ( a > 100){

  temper = thermocouple.readCelsius();
  tm1637.display(temper);
   k = 0;  delay (1000);
  
}
if (k == 0) {a = thermocouple.readCelsius() ;
}
}

 

mixail844
Offline
Зарегистрирован: 30.04.2012

куда выводит ? в SerialMonitor или на tm1637 ? 

как вы определили что зависло ? если показания не обнолвляются - это одно ,если же микроконтроллер завис - это другое.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Видите-ли, Ева, программа всегда работает в точности  так, как она написана, но к сожалению, не всегда так, как ее хотел написать программист.

Если программа работает так, как написано, а не так, как ее хотели написать, - это ошибка?

Если "да", то ошибку нельзя найти, не зная, чего именно программист хотел от программы.

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Единожды став нулём, k уже никогда не станет ничем иным и Вы будете выполнять thermocouple.readCelsius() постоянно с огромной частотой. Это нормально?

Ева.
Offline
Зарегистрирован: 14.10.2018

Показания не обнолвляются.  в SerialMonitor выводится 5 показаний, на tm1637 5-ое показание выводится постоянно и праграмма дальше не идет. 

Нужно измерять температуру в закалочной печи, достаточно вывода показаний на tm1637. Программистам не являюсь, не могу понять в чем проблема, в delay или в порядке выполения циклов.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Единожды став нулём, k уже никогда не станет ничем иным 

Простите, не мог сдержаться

Ева.
Offline
Зарегистрирован: 14.10.2018

После  if (k == 0) {a = thermocouple.readCelsius() ;} он не передет в начало цикла к a = thermocouple.readCelsius() ; ?

И if (k == 0) {a = thermocouple.readCelsius() ;} будет выполняться постоянно? 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот так-то не зависает?

void loop() {
  temper = thermocouple.readCelsius();
  Serial.print("(1) Temper: "); Serial.println(temper);
  if (a < 100){
     temper *= 100;  
  } else {
     temper *= 1;  
 }
  Serial.print("(2) Temper: "); Serial.print(temper); Serial.println("--------------");
  delay (1000);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ева. пишет:

После  if (k == 0) {a = thermocouple.readCelsius() ;} он не передет в начало цикла к a = thermocouple.readCelsius() ; ?

Я не уверен. что я правильно понимаю, что именно Вы называете циклом, но внутри фигурных скобок неплохо бы изменить k.

Ева. пишет:

И if (k == 0) {a = thermocouple.readCelsius() ;} будет выполняться постоянно? 

При каждом проходе loop.

 

Ева.
Offline
Зарегистрирован: 14.10.2018

Спасибо, так не зависает. Нужно чтоб отображалось на tm1637. 

При таком коде выводит 5 значений в сериал порт и дальше программа не идет. 

void loop() {
  temper = thermocouple.readCelsius();
  a = thermocouple.readCelsius();
  Serial.print("(1) Temper: "); Serial.println(temper);
  if (a < 100){
     temper *= 100;  
       tm1637.point(POINT_ON);//включаем точку, что бы разделить десятичные
       tm1637.display(temper);//выводим показания дачика на индикатор
  } else {
     temper *= 1; 
     tm1637.clearDisplay(); 
    tm1637.display(temper); 
 }
  Serial.print("(2) Temper: "); Serial.print(temper); Serial.println("--------------");
  delay (1000);
  
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Откуда на индикатор библиотеку брали?

Ева.
Offline
Зарегистрирован: 14.10.2018
sadman41
Offline
Зарегистрирован: 19.10.2016

Вот так у меня всё работает, ничего не зависает. Правда, я не стал подключать MAX, поэтому вывожу случайное число.

void loop() {
  //temper = thermocouple.readCelsius();
  temper = random(200);
  Serial.print("(1) Temper: "); Serial.println(temper);
  if (temper < 100) {
    temper *= 100;
    tm1637.point(POINT_ON);
  } else {
    tm1637.point(POINT_OFF);
  }
  Serial.print("(2) Temper: "); Serial.println(temper); Serial.println("--------------");
  tm1637.display(temper);
  delay (1000);
}

 

Ева.
Offline
Зарегистрирован: 14.10.2018

Спасибо, все заработало.  

sadman41
Offline
Зарегистрирован: 19.10.2016

У меня и вариант из #9 не зависал...