Это не термопара, а термосопротивление. Есть такой вариант http://bascomavr.3bb.ru/viewtopic.php?id=1147 Но народ больше сходится на использовании микросхемы MAX31865. Есть готовые модули. Одноканальный стоит около $30, двухканальный $50
вообщем такая тема, я только начал заниматься программированием ардуино но пошарился по инету и нашел примерно то что мне нужно, только нужно убрать некоторые части програмы и добавить кое что свое вот этот скетч #include <EEPROM2.h> #include <LiquidCrystal.h> // RS, E, D4, D5, D6, D7 LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //8, 9, 4, 5, 6, 7 #include <TimerOne.h> //переменная для текущего значения температуры // переменная для заданного значения температуры float temp1=0; int setTmp1=0; float temp2=0; int setTmp2=0; float temp3=0; int setTmp3=0; float temp4=0; int setTmp4=0; #define RELAY1_PIN 10 //Реле подключено к пину D53 boolean relayStatus1=LOW; //Объявим переменную для хранения состояния реле #define RELAY2_PIN 11 //Реле подключено к пину D52 boolean relayStatus2=LOW; //Объявим переменную для хранения состояния реле #define RELAY3_PIN 12 //Реле подключено к пину D51 boolean relayStatus3=LOW; //Объявим переменную для хранения состояния реле #define RELAY4_PIN 13 //Реле подключено к пину D50 boolean relayStatus4=LOW; //Объявим переменную для хранения состояния реле //Аналоговая клавиатура подключена к пину A8 #define KEYPAD_PIN A1 //Определим значения на аналоговом входе для клавиатуры #define ButtonT1Up_LOW 670 #define ButtonT1Up_HIGH 698 #define ButtonT1Down_LOW 730 #define ButtonT1Down_HIGH 770 #define ButtonT2Up_LOW 780 #define ButtonT2Up_HIGH 825 #define ButtonT2Down_LOW 830 #define ButtonT2Down_HIGH 895 #define ButtonSelect_LOW 896 #define ButtonSelect_HIGH 919 #define ButtonT3Up_LOW 921 #define ButtonT3Up_HIGH 950 #define ButtonT3Down_LOW 951 #define ButtonT3Down_HIGH 960 #define ButtonT4Up_LOW 961 #define ButtonT4Up_HIGH 977 #define ButtonT4Down_LOW 978 #define ButtonT4Down_HIGH 1000 // направление вращения #define FORWARD HIGH #define BACKWARD LOW // PINs for Pololu Ш.Драйвер #define PIN_STEP 9 #define PIN_DIR 8 // lookup table speed - ticks (interrupts) const int speed_ticks[] = {-1, 600, 300, 200, 150, 120, 100, 86, 75, 67, 60, 55, 50, 46, 43}; int actual_speed; int actual_direction; int ticks; int tick_count; // custom LCD square symbol for progress bar byte square_symbol[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, }; // string constants char forward_arrow[] = "->->->"; char backward_arrow[] = "<-<-<-"; void setup() { //Настроим пин для управления реле pinMode(RELAY1_PIN,OUTPUT); digitalWrite(RELAY1_PIN,LOW); pinMode(RELAY2_PIN,OUTPUT); digitalWrite(RELAY2_PIN,LOW); pinMode(RELAY3_PIN,OUTPUT); digitalWrite(RELAY3_PIN,LOW); pinMode(RELAY4_PIN,OUTPUT); digitalWrite(RELAY4_PIN,LOW); setTmp1=EEPROM_read_byte(0); setTmp2=EEPROM_read_byte(1); setTmp3=EEPROM_read_byte(2); setTmp4=EEPROM_read_byte(3); actual_speed=EEPROM_read_byte(4); //Выведем на дисплей стартовое сообщение на 2 секунды lcd.begin(20, 4 ); lcd.setCursor(0, 0); lcd.print(" Kantroller"); lcd.setCursor(0, 1); lcd.print(" v 2.8"); delay(3000); lcd.clear(); ////////////////////////////// // init the timer1, interrupt every 0.1ms Timer1.initialize(100); Timer1.attachInterrupt(timerIsr); // init LCD and custom symbol lcd.begin(20, 4); lcd.setCursor(0,3); lcd.createChar(0, square_symbol); // pins direction pinMode(PIN_STEP, OUTPUT); pinMode(PIN_DIR, OUTPUT); // initial values actual_speed = 0; actual_direction = FORWARD; tick_count = 0; ticks = -1; digitalWrite(PIN_DIR, actual_direction); updateLCD(); } double Thermister(int RawADC) { double Temp; double Temp1; // See http://en.wikipedia.org/wiki/Thermistor for explanation of formula Temp = log(((10240000/RawADC) - 10000)); Temp = 1 / (0.00041594 + (0.000237835 * Temp) + (0.00000000485948 * Temp * Temp * Temp)); Temp = Temp - 273.15; // Convert Kelvin to Celcius return Temp; } //Определим функцию для опроса аналоговой клавиатуры //Функция опроса клавиатуры, принимает адрес пина, к которому подключена клавиатура, и возвращает код клавиши: // 1 - T1up // 2 - T1Down // 3 - LEFT // 4 - RIGHT // 5 - SELECT // 6 - Ok // 7 - T3up // 8 _ T3down // 9 - T4up int ReadKey(int keyPin) { int KeyNum=0; int KeyValue1=0; int KeyValue2=0; //Читаем в цикле аналоговый вход, для подавления дребезга и нестабильности читаем по два раза подряд, пока значения не будут равны. //Если значения равны 1023 – значит не была нажата ни одна клавиша. do { KeyValue1=analogRead(keyPin); KeyValue2=analogRead(keyPin); } while (KeyValue1==KeyValue2&&KeyValue2!=1023); //Интерпретируем полученное значение и определяем код нажатой клавиши if (KeyValue2<ButtonT1Up_HIGH&&KeyValue2>ButtonT1Up_LOW) {KeyNum=1;}//T1Up if (KeyValue2<ButtonT1Down_HIGH&&KeyValue2>ButtonT1Down_LOW) {KeyNum=2;}//T1Down if (KeyValue2<ButtonT2Up_HIGH&&KeyValue2>ButtonT2Up_LOW) {KeyNum=3;}//T2Up if (KeyValue2<ButtonT2Down_HIGH&&KeyValue2>ButtonT2Down_LOW) {KeyNum=4;}//T2Down if (KeyValue2<ButtonSelect_HIGH&&KeyValue2>ButtonSelect_LOW) {KeyNum=5;}//Select if (KeyValue2<ButtonT3Up_HIGH&&KeyValue2>ButtonT3Up_LOW) {KeyNum=6;}//T3up if (KeyValue2<ButtonT3Down_HIGH&&KeyValue2>ButtonT3Down_LOW) {KeyNum=7;}//T3Down if (KeyValue2<ButtonT4Up_HIGH&&KeyValue2>ButtonT4Up_LOW) {KeyNum=8;}//T3up if (KeyValue2<ButtonT4Down_HIGH&&KeyValue2>ButtonT4Down_LOW) {KeyNum=9;}//T3Down //Возвращаем код нажатой клавиши return KeyNum; }
/////////////////////////////////////////////////////////////////////////////////////////////////////////// //Определим процедуру редактирования заданной температуры //Вызывается по нажатию клавиши Select, отображает на дисплее заданную температуру и позволяет изменять ее клавишами Up и Down void setTemperature() { int keyCode=0; //выводим на дисплей заданное значение температуры lcd.begin(16,4); lcd.setCursor(0, 0); lcd.print("Set temp t1 "); lcd.print(setTmp1); lcd.setCursor(0, 1); lcd.print("Set temp t2 "); lcd.setCursor(13, 1); lcd.print(setTmp2); lcd.setCursor(0, 2); lcd.print("Set temp t3 "); lcd.setCursor(13, 2); lcd.print(setTmp3); lcd.setCursor(0, 3); lcd.print("Set temp t4 "); lcd.setCursor(13, 3); lcd.print(setTmp4); //Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем значение на 1, если Down – уменьшаем на 1 //Если нажаты клавиши Select или Right – цикл опроса прерывается //Задержки введены для борьбы с дребезгом, если клавиши срабатывают четко – можно уменьшить время задержек или вообще их убрать do { keyCode=ReadKey(KEYPAD_PIN); if (keyCode==1){setTmp1++;delay(50);lcd.setCursor(13, 0);lcd.print(setTmp1);lcd.print("* ");} if (keyCode==9){setTmp1--;delay(50);lcd.setCursor(13, 0);lcd.print(setTmp1);lcd.print("* ");} if (keyCode==2){setTmp2++;delay(50);lcd.setCursor(13, 1);lcd.print(setTmp2);lcd.print("* ");} if (keyCode==8){setTmp2--;delay(50);lcd.setCursor(13, 1);lcd.print(setTmp2);lcd.print("* ");} if (keyCode==3){setTmp3++;delay(50);lcd.setCursor(13, 2);lcd.print(setTmp3);lcd.print("* ");} if (keyCode==7){setTmp3--;delay(50);lcd.setCursor(13, 2);lcd.print(setTmp3);lcd.print("* ");} if (keyCode==4){setTmp4++;delay(50);lcd.setCursor(13, 3);lcd.print(setTmp4);lcd.print("* ");} if (keyCode==6){setTmp4--;delay(50);lcd.setCursor(13, 3);lcd.print(setTmp4);lcd.print("* ");} } while (keyCode!=5); delay(50); //По клавише Select – созраняем в EEPROM измененное значение if (keyCode==5){ EEPROM_write_byte(0, setTmp1); EEPROM_write_byte(1, setTmp2); EEPROM_write_byte(2, setTmp3); EEPROM_write_byte(3, setTmp4); } lcd.clear(); } void loop() { double temp1 = Thermister(analogRead(4)); // Read sensor delay(100); lcd.setCursor(0, 0); lcd.print("1 "); lcd.print(temp1); lcd.print("/"); lcd.print(setTmp1); lcd.print("* "); double temp2 = Thermister(analogRead(5)); delay(100); lcd.setCursor(0, 1); lcd.print("2 "); lcd.print(temp2); lcd.print("/"); lcd.print(setTmp2); lcd.print("* "); double temp3 = Thermister(analogRead(6)); delay(100); lcd.setCursor(0, 2); lcd.print("3 "); lcd.print(temp3); lcd.print("/"); lcd.print(setTmp3); lcd.print("* "); double temp4 = Thermister(analogRead(7)); delay(100); lcd.setCursor(0, 3); lcd.print("4 "); lcd.print(temp4); lcd.print("/"); lcd.print(setTmp4); lcd.print("* "); //Проверка условия включения/выключения нагревателя if (temp1<setTmp1&&relayStatus1==LOW){relayStatus1=HIGH; digitalWrite(RELAY1_PIN,HIGH);} if (temp1>setTmp1&&relayStatus1==HIGH){relayStatus1=LOW; digitalWrite(RELAY1_PIN,LOW);} if (temp2<setTmp2&&relayStatus2==LOW){relayStatus2=HIGH; digitalWrite(RELAY2_PIN,HIGH);} if (temp2>setTmp2&&relayStatus2==HIGH){relayStatus2=LOW; digitalWrite(RELAY2_PIN,LOW);} if (temp3<setTmp3&&relayStatus3==LOW){relayStatus3=HIGH; digitalWrite(RELAY3_PIN,HIGH);} if (temp3>setTmp3&&relayStatus3==HIGH){relayStatus3=LOW; digitalWrite(RELAY3_PIN,LOW);} if (temp4<setTmp4&&relayStatus4==LOW){relayStatus4=HIGH; digitalWrite(RELAY4_PIN,HIGH);} if (temp4>setTmp4&&relayStatus4==HIGH){relayStatus4=LOW; digitalWrite(RELAY4_PIN,LOW);} // Опрос клавиатуры int Feature = ReadKey(KEYPAD_PIN); if (Feature==5 ) {delay(100);setTemperature();} //Переход к редактированию заданной температуры if (Feature==1 ) {increase_speed();} if (Feature==9 ) {decrease_speed();} if (Feature==2 ) {change_direction(BACKWARD);} if (Feature==8 ) {change_direction(FORWARD);} if (Feature==3 ) {emergency_stop();} // finally update the LCD updateLCD(); } // increase speed if it's below the max (70) void increase_speed() { if(actual_speed < 70) { actual_speed += 5; tick_count = 0; ticks = speed_ticks[actual_speed / 5]; } } // decrease speed if it's above the min (0) void decrease_speed() { if(actual_speed > 0) { actual_speed -= 5; tick_count = 0; ticks = speed_ticks[actual_speed / 5]; } } // change direction if needed void change_direction(int new_direction) { if(actual_direction != new_direction) { actual_direction = new_direction; digitalWrite(PIN_DIR, actual_direction); } } // emergency stop: speed 0 void emergency_stop() { actual_speed = 0; tick_count = 0; ticks = speed_ticks[actual_speed / 5]; } // update LCD void updateLCD() { // print first line: // Speed: xxxRPM --> (or <--) lcd.setCursor(14,0); lcd.print("R:"); lcd.print(actual_speed); lcd.print("' "); lcd.setCursor(14,2); lcd.print("Speed:"); lcd.setCursor(14,1); if(actual_direction == FORWARD) lcd.print(forward_arrow); else lcd.print(backward_arrow); // print second line: // progress bar [##### ] // 15 speed steps: 0 - 5 - 10 - ... - 70 lcd.setCursor(14,3); lcd.print("["); for(int i = 1; i <= 4; i++) { if(actual_speed > (14 * i) - 1) lcd.write(byte(0)); else lcd.print(" "); } lcd.print("]"); } // timer1 interrupt function void timerIsr() { if(actual_speed == 0) return; tick_count++; if(tick_count == ticks) { // make a step digitalWrite(PIN_STEP, HIGH); digitalWrite(PIN_STEP, LOW); tick_count = 0; } }
мне нужно сделать 5 зон нагрева вместо 4х и при перегреве 1й и 2й зоны должен включатся вентилятор а ещё если сигнал на реле подаётся а нагрева не происходит то должна сработать сигнализация(реле)