101 (2023-03-23 19:44:56 отредактировано Mungo)

Re: Терморегулятор MAX6675 (Arduino)

Уважаемый liman324. Собрал ваше устройство на TM1637 и кнопках, работает отлично, но для меня есть небольшое неудобство. Очень медленно изменяется уставка температуры при нажатой кнопке плюс или минус. Что нужно изменить или добавить в скетч, чтобы скорость установки температуры при зажатой кнопке стала быстрее.
http://forum.rcl-radio.ru/uploads/images/2023/03/fc4ec0599fdbd01266993a1c91741394.jpg

102

Re: Терморегулятор MAX6675 (Arduino)

Опубликуйте скетч который используете.

103

Re: Терморегулятор MAX6675 (Arduino)

Так тот что ТМ1637 и кнопки без изменений.
#include <Wire.h>
#include <EEPROM.h>
#include <STM32_TM1637.h> // http://rcl-radio.ru/wp-content/uploads/ … TM1637.zip
#include <max6675.h> // http://rcl-radio.ru/wp-content/uploads/ … ax6675.zip
STM32_TM1637 tm(2,3);// CLK, DIO

int thermoDO = 6; // SO
int thermoCS = 5; // CS
int thermoCLK = 4;// SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

unsigned long time;
double t_c,t_sum,t_iz;
int menu,w,reg,gis,reg_h,reg_l,i;

void setup() {
   Wire.begin();Serial.begin(9600);
   tm.brig(2); // ЯРКОСТЬ 0...7
   pinMode(13,OUTPUT); // реле
   pinMode(12,OUTPUT); // индикатор нагрева
   pinMode(7,INPUT_PULLUP); // menu (нажатие кнопки - замыкание на gnd)
   pinMode(8,INPUT_PULLUP); // up (нажатие кнопки - замыкание на gnd)
   pinMode(9,INPUT_PULLUP); // down (нажатие кнопки - замыкание на gnd)
   reg_h = EEPROM.read(0);reg_l = EEPROM.read(1);gis = EEPROM.read(2);
   reg = reg_h*100+reg_l;

}

void loop() {
//// измерение температуры
  i++;
  t_c=thermocouple.readCelsius();t_sum=t_sum+t_c;
  if(i>4){i=0;t_iz=t_sum/5;t_sum=0;}
 
/////////////////////////////////////////////
  if(digitalRead(7)==LOW){menu++;if(menu>2){menu=0;}delay(1);}

///////// регулирование
  if(menu==1){
  if(digitalRead(8)==LOW){reg++;time=millis();w=1;if(reg>999){reg=999;}delay(1);}
  if(digitalRead(9)==LOW){reg--;time=millis();w=1;if(reg<0){reg=0;}delay(1);}
  tm.print_float(reg,0, 0b01010000,0,0,0);
     Serial.println(reg);
     }
///////// гистерезис
   if(menu==2){
   if(digitalRead(8)==LOW){gis++;time=millis();w=1;if(gis>10){gis=10;}delay(1);}
   if(digitalRead(9)==LOW){gis--;time=millis();w=1;if(gis<0){gis=0;}delay(1);}
   tm.print_float(gis,0, 0b00111101,0,0,0);
     Serial.println(gis);
     }
////////////////////////////////////////////////////////       
  if(menu==0){ 
  tm.print_float(t_iz,1, 0,0,0,0b01100011);
  }
////////////////////////////////////////////////////////     
   if(millis()-time>5000 && w==1){
     reg_h = reg/100;reg_l = reg-reg_h*100;
     EEPROM.update(0,reg_h);EEPROM.update(1,reg_l);EEPROM.update(2,gis);
     menu=0;w=0;}

  if(reg >= t_iz + gis){digitalWrite(13,HIGH);digitalWrite(12,HIGH);}
  if(reg <= t_iz - gis){digitalWrite(13,LOW);digitalWrite(12,LOW);}
 
  delay(200);
  Serial.println(menu);
}// loop

104

Re: Терморегулятор MAX6675 (Arduino)

delay(200);

замените на

  delay(100);

или на

  delay(50);

105

Re: Терморегулятор MAX6675 (Arduino)

Сообщение 50

Я вспомнил, что датчику надо время для считывания не менее 200 мс, было 50

  delay(200);

внизу скетча

106

Re: Терморегулятор MAX6675 (Arduino)

Попробуйте этот код:

#include <Wire.h>
#include <EEPROM.h>
#include <STM32_TM1637.h> // http://rcl-radio.ru/wp-content/uploads/ … TM1637.zip
#include <max6675.h> // http://rcl-radio.ru/wp-content/uploads/ … ax6675.zip
STM32_TM1637 tm(2,3);// CLK, DIO

int thermoDO = 6; // SO
int thermoCS = 5; // CS
int thermoCLK = 4;// SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

unsigned long time;
double t_c,t_sum,t_iz;
int menu,w,w1,reg,gis,reg_h,reg_l,i;

void setup() {
   Wire.begin();Serial.begin(9600);
   tm.brig(2); // ЯРКОСТЬ 0...7
   pinMode(13,OUTPUT); // реле
   pinMode(12,OUTPUT); // индикатор нагрева
   pinMode(7,INPUT_PULLUP); // menu (нажатие кнопки - замыкание на gnd)
   pinMode(8,INPUT_PULLUP); // up (нажатие кнопки - замыкание на gnd)
   pinMode(9,INPUT_PULLUP); // down (нажатие кнопки - замыкание на gnd)
   reg_h = EEPROM.read(0);reg_l = EEPROM.read(1);gis = EEPROM.read(2);
   reg = reg_h*100+reg_l;

}

void loop() {
//// измерение температуры
  i++;
  t_c=thermocouple.readCelsius();t_sum=t_sum+t_c;
  if(i>4){i=0;t_iz=t_sum/5;t_sum=0;}
 
/////////////////////////////////////////////
  if(digitalRead(7)==LOW){menu++;if(menu>2){menu=0;}delay(1);}

///////// регулирование
  if(menu==1){
  if(digitalRead(8)==LOW){reg++;time=millis();w=1;w1=1;if(reg>999){reg=999;}delay(1);}
  if(digitalRead(9)==LOW){reg--;time=millis();w=1;w1=1;if(reg<0){reg=0;}delay(1);}
  tm.print_float(reg,0, 0b01010000,0,0,0);
     Serial.println(reg);
     }
///////// гистерезис
   if(menu==2){
   if(digitalRead(8)==LOW){gis++;time=millis();w=1;if(gis>10){gis=10;}delay(1);}
   if(digitalRead(9)==LOW){gis--;time=millis();w=1;if(gis<0){gis=0;}delay(1);}
   tm.print_float(gis,0, 0b00111101,0,0,0);
     Serial.println(gis);
     }
////////////////////////////////////////////////////////       
  if(menu==0){ 
  tm.print_float(t_iz,1, 0,0,0,0b01100011);
  }
////////////////////////////////////////////////////////     
   if(millis()-time>5000 && w==1){
     reg_h = reg/100;reg_l = reg-reg_h*100;
     EEPROM.update(0,reg_h);EEPROM.update(1,reg_l);EEPROM.update(2,gis);
     menu=0;w=0;}

  if(reg >= t_iz + gis){digitalWrite(13,HIGH);digitalWrite(12,HIGH);}
  if(reg <= t_iz - gis){digitalWrite(13,LOW);digitalWrite(12,LOW);}
 
  if(w1==0){delay(200);}
  w1=0;
  Serial.println(menu);
}// loop

107

Re: Терморегулятор MAX6675 (Arduino)

Я хочу использовать это устройство в пенале для просушки-прокалки электродов. А там часто нужно менять температуру со 100 градусов до 400 и обратно. Хотелось бы делать это быстро.

108

Re: Терморегулятор MAX6675 (Arduino)

Прошил. Скорость изменения то, что надо! Но теперь попасть на нужное значениe единичным нажатием кнопки невозможно. Сразу изменение на 3 - 6 градусов.

109

Re: Терморегулятор MAX6675 (Arduino)

Чуть уменьшите скорость

  if(digitalRead(8)==LOW){reg++;time=millis();w=1;w1=1;if(reg>999){reg=999;}delay(50);}
  if(digitalRead(9)==LOW){reg--;time=millis();w=1;w1=1;if(reg<0){reg=0;}delay(50);}

110

Re: Терморегулятор MAX6675 (Arduino)

Прошил.Особой разницы не увидел. Скорость настройки температуры уменьшилась, а точность все равно не очень . 3-4 знака на одно нажатие кнопки.  Кстати гистерезис одно нажатие - одна цифра.

111

Re: Терморегулятор MAX6675 (Arduino)

Кстати, а можно сделать несколько пресетов?

112

Re: Терморегулятор MAX6675 (Arduino)

Попробуйте этот код,  в железе не проверял.

#include <Wire.h>
#include <EEPROM.h>
#include <STM32_TM1637.h> // http://rcl-radio.ru/wp-content/uploads/ … TM1637.zip
#include <max6675.h> // http://rcl-radio.ru/wp-content/uploads/ … ax6675.zip
STM32_TM1637 tm(2,3);// CLK, DIO

int thermoDO = 6; // SO
int thermoCS = 5; // CS
int thermoCLK = 4;// SCK
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

unsigned long time;
double t_c,t_sum,t_iz;
int menu,w,w1,reg,gis,reg_h,reg_l,i;
int tic,tic1;

void setup() {
   Wire.begin();Serial.begin(9600);
   tm.brig(2); // ЯРКОСТЬ 0...7
   pinMode(13,OUTPUT); // реле
   pinMode(12,OUTPUT); // индикатор нагрева
   pinMode(7,INPUT_PULLUP); // menu (нажатие кнопки - замыкание на gnd)
   pinMode(8,INPUT_PULLUP); // up (нажатие кнопки - замыкание на gnd)
   pinMode(9,INPUT_PULLUP); // down (нажатие кнопки - замыкание на gnd)
   reg_h = EEPROM.read(0);reg_l = EEPROM.read(1);gis = EEPROM.read(2);
   reg = reg_h*100+reg_l;

}

void loop() {
//// измерение температуры
  i++;
  t_c=thermocouple.readCelsius();t_sum=t_sum+t_c;
  if(i>4){i=0;t_iz=t_sum/5;t_sum=0;}
 
/////////////////////////////////////////////
  if(digitalRead(7)==LOW){menu++;if(menu>2){menu=0;}delay(1);}

///////// регулирование
  if(menu==1){
  if(digitalRead(8)==LOW){reg++;time=millis();w=1;w1=1;tic++;if(reg>999){reg=999;}if(tic<10){delay(200);}else{delay(50);} }
  if(digitalRead(9)==LOW){reg--;time=millis();w=1;w1=1;tic1++;if(reg<0){reg=0;}if(tic1<10){delay(200);}else{delay(50);}}
  tm.print_float(reg,0, 0b01010000,0,0,0);
     Serial.println(reg);
     if(digitalRead(8)==HIGH){tic=0;}
     if(digitalRead(9)==HIGH){tic1=0;}
     }
///////// гистерезис
   if(menu==2){
   if(digitalRead(8)==LOW){gis++;time=millis();w=1;if(gis>10){gis=10;}delay(1);}
   if(digitalRead(9)==LOW){gis--;time=millis();w=1;if(gis<0){gis=0;}delay(1);}
   tm.print_float(gis,0, 0b00111101,0,0,0);
     Serial.println(gis);
     }
////////////////////////////////////////////////////////       
  if(menu==0){ 
  tm.print_float(t_iz,1, 0,0,0,0b01100011);
  }
////////////////////////////////////////////////////////     
   if(millis()-time>5000 && w==1){
     reg_h = reg/100;reg_l = reg-reg_h*100;
     EEPROM.update(0,reg_h);EEPROM.update(1,reg_l);EEPROM.update(2,gis);
     menu=0;w=0;}

  if(reg >= t_iz + gis){digitalWrite(13,HIGH);digitalWrite(12,HIGH);}
  if(reg <= t_iz - gis){digitalWrite(13,LOW);digitalWrite(12,LOW);}
 
  if(w1==0){delay(200);}
  w1=0;
  Serial.println(menu);
}// loop

113

Re: Терморегулятор MAX6675 (Arduino)

Вот! Оно! То, что надо. Спасибо огромное!

114

Re: Терморегулятор MAX6675 (Arduino)

Привет Всем!
Изменил немного код автора. Применил дисплей LCD1602 с шиной I2C и вместо модуля термопары
на ИМС MAX6675 применил MAX31855. Она понравилась лучшей стабильностью.

Возможно кому-то пригодится.

/*
Терморегулятор http://rcl-radio.ru/?p=45845

*/

//#include <SPI.h>
#include <Wire.h>
#include <EEPROM.h> //#include <EEPROM.h>

// Initialize the LCD1602
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);


// Initialize the Thermocouple
#include "Adafruit_MAX31855.h"
#define MAXDO   12
#define MAXCS   10
#define MAXCLK  13
Adafruit_MAX31855 thermocouple(MAXCLK, MAXCS, MAXDO);

// Connecting to Arduino Nano

#define D3   3  // OUT Выход на исполнительное устройство
#define D4   4  // IN  Вход кнопки КН1
#define D7   7  // IN  Вход кнопки КН2
#define A0   0  // IN  Вход кнопки КН2


//Variables
double t_c,t_sum,t_iz;
byte erom2,erom3,erom4;
int kn1,kn2,t_reg,sh,sh1,gis;
long w;

void setup(){
  Serial.begin(9600);
  lcd.init();lcd.backlight();delay(500);  //lcd.begin(16, 2);
  pinMode(A0,INPUT);  // KH3
  pinMode(4,INPUT);pinMode(7,INPUT); // кнопки KH1, KH2
  pinMode(3,OUTPUT);
  erom2=EEPROM.read(4);if(erom2>99){EEPROM.update(2,0);}
  erom3=EEPROM.read(7);if(erom3>10){EEPROM.update(3,0);}
  erom4=EEPROM.read(13);if(erom4>10){EEPROM.update(4,0);}
  t_reg=erom2*100+erom3;gis=erom4;
}

void loop(){
  if(analogRead(A0)>600){kn1++;delay(300);}if(kn1>2){kn1=0;}// кнопка
  if(kn1==1){// регулирование
  if(digitalRead(7) == HIGH){sh++;if(sh<=10){t_reg++;}if(sh>10&&sh<=100){t_reg=t_reg+10;}}else{sh=0;}
  if(digitalRead(4) == HIGH){sh1++;if(sh1<=10){t_reg--;}if(sh1>10&&sh1<=100){t_reg=t_reg-10;}}else{sh1=0;}
  lcd.setCursor(0,0);lcd.print("reg = ");lcd.print(t_reg);lcd.print((char)223);lcd.print("C");delay(200);
  if(t_reg<=0){t_reg=0;}if(t_reg>=1000){t_reg=1000;}
  erom2=t_reg/100;
  erom3=t_reg-((t_reg)/100)*100;w=0;
}

if(kn1==2){// гистерезис
  if(digitalRead(7) == HIGH){gis=gis+1;}
  if(digitalRead(4) == HIGH){gis=gis-1;}
  if(gis>=10 || gis<0){gis=0;}
  lcd.setCursor(0,0);lcd.print("gis = ");lcd.print(gis);lcd.print((char)223);lcd.print("C");delay(300);
  erom4=gis;w=0;
}

if(kn1==0){w++;if(w==1){EEPROM.update(2,erom2);EEPROM.update(3,erom3);EEPROM.update(4,erom4);} 
  lcd.setCursor(0,0);lcd.print("T = ");lcd.print(t_iz,1);lcd.print((char)223);lcd.print("C ");
  lcd.setCursor(0,1);lcd.print("reg=");lcd.print(t_reg);lcd.print(" gis=");lcd.print(gis);
  //Serial.print("C = ");
  //Serial.println(t_iz);

  for(int i=0;i<5;i++){
    t_c=thermocouple.readCelsius();
    t_sum=t_sum+t_c;
    delay(200);
  }
  t_iz=t_sum/5;t_sum=0;
}

  if(t_reg >= t_iz + gis){digitalWrite(3,HIGH);}
  if(t_reg <= t_iz - gis){digitalWrite(3,LOW);}

  lcd.clear();
}

115

Re: Терморегулятор MAX6675 (Arduino)

Тема интересная, вот и я решил присоединиться.
Решил таки сделать себе паяльную станцию. До этого как-то обходился.
Но здесь нашёл только аналоговую http://rcl-radio.ru/?p=2666
Может я не смог найти? Подскажите, есть тут тема по паяльным станциям на ATMega328 или LGT8F328P?

116

Re: Терморегулятор MAX6675 (Arduino)

Вот есть пример - https://www.youtube.com/watch?v=Rubw6RNYvhU

117

Re: Терморегулятор MAX6675 (Arduino)

Большое спасибо.
Займусь изучением и буду пробовать.

118

Re: Терморегулятор MAX6675 (Arduino)

Привет Всем!
Получилось испытать на макете код написанный Анатолием Невзоровым "Паяльник на Arduino своими руками".
Хорошо смотрятся показания температуры большими цифрами. Хороший проект в целом.
Но как всегда, мы не ищем лёгких путей, решил попробовать отказаться от усилителя термопары и соответственно канала регулирования через аналоговый вход. Применил, бывший в наличии, модуль на МАХ31855 (3,6 В макс). Соответственно пришлось менять код и библиотеки . По началу работало, но в процессе шим регулирования происходил какой то сбой и импульсы с выхода МК пропадали.
И запустить можно было только после перезагрузки МК. Все проверял неоднократно, термопару менял, библиотеки менял . Результата не было. В момент сбоя, с модуля термопары поступал сигнал (данные ) nan. Не знал как исправить этот сбой, аппаратном или программно.
Получилось программно добавить условие в коде, после чего импульсы не пропадают. Так как я начинающий кодописатель, вероятно условие надо писать более правильно. Тут мне нужена помощь.
Сейчас жду когда у меня будет энкодер для полноценного тестирования всего кода и паяльника в целом.
Есть ещё некоторые идеи и хотелки для дальнейшего использования этого проекта .
Код не причесанный, но могу выложить как есть. Если интересно .

119

Re: Терморегулятор MAX6675 (Arduino)

http://forum.rcl-radio.ru/uploads/images/2024/04/2d02a70c329fc8de25709e80998717f9.jpg


Здравствуйте. Можете написать скетч для этой схемы??? Сам плохо разбираюсь с написанием.

120

Re: Терморегулятор MAX6675 (Arduino)

Alex Kurgan пишет:

Можете написать скетч для этой схемы??? Сам плохо разбираюсь с написанием.

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

121

Re: Терморегулятор MAX6675 (Arduino)

Karl2233 пишет:
Alex Kurgan пишет:

Можете написать скетч для этой схемы??? Сам плохо разбираюсь с написанием.

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

Здраствуйте.  2х зонный pid регулятор в первой строке показания 1 канала и выставленная температура, во второй 2 канал аналогично. Остальные настроики через меню также 1 и 2 строка.

122

Re: Терморегулятор MAX6675 (Arduino)

сложная задача???