Здравствуйте ! Я совсем недавно начал заниматься ардуно и поэтому не могу пока сам полностью написать программу для своих нужд, а программа очень нужна, поэтому не пинайте меня сильно , вот нашел почти то что нужно! для начало мне нужно чтобы вместо Dallas DS18B20 (цифрового датчика температуры) работал аналоговый термопара или thermistor мне главное диапазон температур побольше 0 -300 градусов \\ С заранее благодарю !! Код (Text): // Подключаем библиотеку для работы с шиной OneWire // Термометр будет подключен на Pin2 #include <OneWire.h> OneWire oneWire(2); //Подключаем библиотеку для работы с термометром #include <DallasTemperature.h> //Создаем объект sensors, подключенный по OneWire DallasTemperature sensors(&oneWire); //Создаем переменные для работы с термометром DeviceAddress tempDeviceAddress; //переменная для хранения адреса датчика float temp1=0; //переменная для текущего значения температуры int setTmp=0; // переменная для заданного значения температуры //Подключаем LCD-дисплей #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Подсветка управляется через пин D10 #define BACKLIGHT_PIN 10 //Создаем переменную для хранения состояния подсветки boolean backlightStatus = 1; // Подключаем библиотеку для работы с ARDUINO EEPROM //Заданная температура будет храниться по адресу 0 #include <EEPROM2.h> //Реле подключено к пину D11 #define RELAY_PIN 11 //Объявим переменную для хранения состояния реле boolean relayStatus1=LOW; //Объявим переменные для задания задержки long previousMillis1 = 0; long interval1 = 1000; // интервал опроса датчиков температуры //Аналоговая клавиатура подключена к пину A0 #define KEYPAD_PIN A0 //Определим значения на аналоговом входе для клавиатуры #define ButtonUp_LOW 90 #define ButtonUp_HIGH 100 #define ButtonDown_LOW 240 #define ButtonDown_HIGH 280 #define ButtonLeft_LOW 390 #define ButtonLeft_HIGH 450 #define ButtonRight_LOW 0 #define ButtonRight_HIGH 50 #define ButtonSelect_LOW 620 #define ButtonSelect_HIGH 650 void setup() { //Настроим пин для управления реле pinMode(RELAY_PIN,OUTPUT); digitalWrite(RELAY_PIN,LOW); //Считаем из постоянной памяти заданную температуру setTmp=EEPROM_read_byte(0); //Инициализируем термодатчик и установим разрешающую способность 12 бит (обычно она установлена по умолчанию, так что последнюю строчку можно опустить) sensors.begin(); sensors.getAddress(tempDeviceAddress, 0); sensors.setResolution(12); //Настроим подсветку дисплея pinMode(BACKLIGHT_PIN, OUTPUT); digitalWrite(BACKLIGHT_PIN, backlightStatus); //Выведем на дисплей стартовое сообщение на 2 секунды lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("Temp. Controller"); lcd.setCursor(0, 1); lcd.print(" v1.0 "); delay(2000); // выведем на дисплей заданное значение температуры на 2 секунды lcd.setCursor(0, 1); lcd.print(" Set temp: "); lcd.setCursor(12,1); lcd.print(setTmp); delay(2000); //Очистим дисплей lcd.begin(16, 2); } //Определим функцию для опроса аналоговой клавиатуры //Функция опроса клавиатуры, принимает адрес пина, к которому подключена клавиатура, и возвращает код клавиши: // 1 - UP // 2 - DOWN // 3 - LEFT // 4 - RIGHT // 5 - SELECT 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<ButtonUp_HIGH&&KeyValue2>ButtonUp_LOW) {KeyNum=1;}//Up if (KeyValue2<ButtonDown_HIGH&&KeyValue2>ButtonDown_LOW) {KeyNum=2;}//Down if (KeyValue2<ButtonLeft_HIGH&&KeyValue2>ButtonLeft_LOW) {KeyNum=3;}//Left if (KeyValue2<ButtonRight_HIGH&&KeyValue2>ButtonRight_LOW) {KeyNum=4;}//Right if (KeyValue2<ButtonSelect_HIGH&&KeyValue2>ButtonSelect_LOW) {KeyNum=5;}//Select //Возвращаем код нажатой клавиши return KeyNum; } //Определим процедуру редактирования заданной температуры //Вызывается по нажатию клавиши Select, отображает на дисплее заданную температуру и позволяет изменять ее клавишами Up и Down void setTemperature() { int keyCode=0; //выводим на дисплей заданное значение температуры lcd.begin(16,2); lcd.setCursor(0, 0); lcd.print(" Setting temp "); lcd.setCursor(7, 1); lcd.print(setTmp); //Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем значение на 1, если Down – уменьшаем на 1 //Если нажаты клавиши Select или Right – цикл опроса прерывается //Задержки введены для борьбы с дребезгом, если клавиши срабатывают четко – можно уменьшить время задержек или вообще их убрать do { keyCode=ReadKey(KEYPAD_PIN); if (keyCode==1){setTmp++;delay(200);lcd.setCursor(7, 1);lcd.print(setTmp);} if (keyCode==2){setTmp--;delay(200);lcd.setCursor(7, 1);lcd.print(setTmp);} } while (keyCode!=5 && keyCode!=4); delay(200); //По клавише Select – созраняем в EEPROM измененное значение //По клавише Right – восстанавливаем старое значение if (keyCode==5) {EEPROM_write_byte(0, setTmp);} if (keyCode==4) {setTmp = EEPROM_read_byte(0);} } void loop() { //Модуль опроса датчиков и получения сведений о температуре //Вызывается 1 раз в секунду unsigned long currentMillis1 = millis(); if(currentMillis1 - previousMillis1 > interval1) { previousMillis1 = currentMillis1; //Запуск процедуры измерения температуры sensors.setWaitForConversion(false); sensors.requestTemperatures(); sensors.setWaitForConversion(true); Delay(750) // задержка для обработки информации внутри термометра, в данном случае можно не задавать //Считывание значения температуры sensors.getAddress(tempDeviceAddress, 0); temp1=sensors.getTempC(tempDeviceAddress); // Вывод текущего значения температуры на дисплей lcd.setCursor(0, 0); lcd.print(" Current temp "); lcd.setCursor(5, 1); lcd.print(temp1); // Serial.println(temp1,4); } //Проверка условия включения/выключения нагревателя if (temp1<setTmp&&relayStatus1==LOW){relayStatus1=HIGH; digitalWrite(RELAY_PIN,HIGH);} if (temp1>setTmp&&relayStatus1==HIGH){relayStatus1=LOW; digitalWrite(RELAY_PIN,LOW);} // Опрос клавиатуры int Feature = ReadKey(KEYPAD_PIN); if (Feature==1 ) {backlightStatus=1;digitalWrite(BACKLIGHT_PIN, backlightStatus);} //Включение подсветки if (Feature==2 ) {backlightStatus=0;digitalWrite(BACKLIGHT_PIN, backlightStatus);} //Отключение подсветки if (Feature==5 ) {delay(200);setTemperature();} //Переход к редактированию заданной температуры }
Поиск готового решения - плохой способ обучения. Схема устройства уже есть? Или пишете сферическую прошивку в вакууме?
Да все это понятно ! Я и шел от малого к большому ! вот только мой отец делает устройство "Экструдер" и так сказать попросил помочь по электронной части вот поэтому и попытался в ускоренном темпе обучаться ! Собственно нужно четыре температурных датчика, четыре реле, возможность задавать нужную температуру для каждого контура отдельно, и один ШД (управление оборотами двигателя) у меня есть мега 2560 ЛСД= клавиатура из 5 кнопок есть релюшки твердотельные и термопары !
Какие именно термопары? Нужно сперва определиться со способом их подключения к контроллеру. Для этого нужно знать их характеристики.
Вот есть как раз 4 штуки одинаковые, вот документация прикрепляю! Вот такие тоже можно (EPCOS B57560G104F NTC 100k THERMISTOR) но будут через месяц недавно только заказал для 3 D принтеров
Спасибо ! Беру код в копилку по изучению программирования Ардуино Стоит похожая задача - поддерживать температуру в резервуарах в заданном диапазоне. Думаю взяв Ваш скетч за основу теперь не будет проблем Кстати экструдер чего делаете (пластик, пелеты, зерновые ?)
Всегда пожалуйста ! это мой первый опыт,так что если что не так сильно не ругайте а лучше пишете , одна голова хорошо а две всегда лучше !! А про экструдер ! нитку (PLA ABS ) 3mm и 1.75. пластики для 3D принтеров(REpRAP) производство налаживаю !! как закончу фото видео выложу, да и сайт собственный хочу заказать ! как то так вот . Если что пишите чем смогу помогу ))
Код (Text): if (Feature==5) { EEPROM_write_byte(0,setTmp1); EEPROM_write_byte(1,setTmp2); EEPROM_write_byte(2,setTmp3); EEPROM_write_byte(3,setTmp4); }
Всегда рад помочь Код (Text): lcd.setCursor(0, 0); lcd.print(" Set temp1: "); lcd.setCursor(16,0); lcd.print(setTmp1); lcd.setCursor(0, 1); lcd.print(" Set temp2: "); lcd.setCursor(16,1); lcd.print(setTmp2); lcd.setCursor(0, 2); lcd.print(" Set temp3: "); lcd.setCursor(16,2); lcd.print(setTmp3); lcd.setCursor(0, 3); lcd.print(" Set temp4: "); lcd.setCursor(16,3); lcd.print(setTmp4); Пробелы в конце выводить не обязательно. Если есть необходимость очистить дисплей - используйте lcd.clear(). Чем короче строка, тем больше памяти останется для более полезных вещей. Одинаковые фрагменты строк по этой же причине можно хранить в виде одной строковой константы, например, "Set temp". Случаи, конечно, бывают разные, но часто это помогает сэкономить память. Поэкспериментируйте и посмотрите на размер прошивки при компиляции. Также можете сравнить, как меняется размер прошивки при добавлении одного вызова функции. В контроллере памяти кот наплакал - бывает, что приходится биться за каждый байт. Если будете писать большую программу и памяти перестанет хватать - вспомните об этом История одного байта.
вот почему-от мне кажется что эту историю надо рассказать другому человеку на этом форуме... sorry за
Вот вчера получил датчики http://www.ebay.com/itm/50x-Reprap-100K-ohm-NTC-Thermistor-/160978297048 подскажите пожалуйста как их грамотно откалибровать, или может есть еще какие то способы определить их в скетче так чтоб точно показывали температуру !
Опытным путем разве что. Снимайте показания термистора одновременно с измерением хорошим градусником. Ищите зависимость между расхождениями. Стройте формулу.
А как насчет вот таких таблиц ?? если можно поясните вкратце в чем разница той формулы что я использую (кстати я вроде настроил термистор с резистором на 4.7 к вроде правильно все показывает ) и так сказать вот этих таблиц их тоже используют с резистором на 4.7 к ток схема подключения немного отличается ! Да и сами понимаете как сильно хочется применить ее в своем коде ! ну или на ее основе сделать новый ! Код (Text): #ifndef THERMISTORTABLES_H_ #define THERMISTORTABLES_H_ #include "Marlin.h" #define OVERSAMPLENR 16 #if (THERMISTORHEATER_0 == 1) || (THERMISTORHEATER_1 == 1) || (THERMISTORHEATER_2 == 1) || (THERMISTORBED == 1) //100k bed thermistor const short temptable_1[][2] PROGMEM = { { 23*OVERSAMPLENR , 300 }, { 25*OVERSAMPLENR , 295 }, { 27*OVERSAMPLENR , 290 }, { 28*OVERSAMPLENR , 285 }, { 31*OVERSAMPLENR , 280 }, { 33*OVERSAMPLENR , 275 }, { 35*OVERSAMPLENR , 270 }, { 38*OVERSAMPLENR , 265 }, { 41*OVERSAMPLENR , 260 }, { 44*OVERSAMPLENR , 255 }, { 48*OVERSAMPLENR , 250 }, { 52*OVERSAMPLENR , 245 }, { 56*OVERSAMPLENR , 240 }, { 61*OVERSAMPLENR , 235 }, { 66*OVERSAMPLENR , 230 }, { 71*OVERSAMPLENR , 225 }, { 78*OVERSAMPLENR , 220 }, { 84*OVERSAMPLENR , 215 }, { 92*OVERSAMPLENR , 210 }, { 100*OVERSAMPLENR , 205 }, { 109*OVERSAMPLENR , 200 }, { 120*OVERSAMPLENR , 195 }, { 131*OVERSAMPLENR , 190 }, { 143*OVERSAMPLENR , 185 }, { 156*OVERSAMPLENR , 180 }, { 171*OVERSAMPLENR , 175 }, { 187*OVERSAMPLENR , 170 }, { 205*OVERSAMPLENR , 165 }, { 224*OVERSAMPLENR , 160 }, { 245*OVERSAMPLENR , 155 }, { 268*OVERSAMPLENR , 150 }, { 293*OVERSAMPLENR , 145 }, { 320*OVERSAMPLENR , 140 }, { 348*OVERSAMPLENR , 135 }, { 379*OVERSAMPLENR , 130 }, { 411*OVERSAMPLENR , 125 }, { 445*OVERSAMPLENR , 120 }, { 480*OVERSAMPLENR , 115 }, { 516*OVERSAMPLENR , 110 }, { 553*OVERSAMPLENR , 105 }, { 591*OVERSAMPLENR , 100 }, { 628*OVERSAMPLENR , 95 }, { 665*OVERSAMPLENR , 90 }, { 702*OVERSAMPLENR , 85 }, { 737*OVERSAMPLENR , 80 }, { 770*OVERSAMPLENR , 75 }, { 801*OVERSAMPLENR , 70 }, { 830*OVERSAMPLENR , 65 }, { 857*OVERSAMPLENR , 60 }, { 881*OVERSAMPLENR , 55 }, { 903*OVERSAMPLENR , 50 }, { 922*OVERSAMPLENR , 45 }, { 939*OVERSAMPLENR , 40 }, { 954*OVERSAMPLENR , 35 }, { 966*OVERSAMPLENR , 30 }, { 977*OVERSAMPLENR , 25 }, { 985*OVERSAMPLENR , 20 }, { 993*OVERSAMPLENR , 15 }, { 999*OVERSAMPLENR , 10 }, { 1004*OVERSAMPLENR , 5 }, { 1008*OVERSAMPLENR , 0 } //safety }; #endif
Помогите разобраться с кодом ! у меня не получается избавиться от лишних кнопок ! сейчас код работает так Вот а я хочу сделать чтобы при нажатие кнопки вызова меню редактирования температуры , либо двигался курсор по пунктам верх вниз и при активации какого либо из пунктов можно было редактировать значение или так чтобы кнопка селект вызывала по очереди четыре пункта для редактирования ! вроде решение дето рядом а вот нормально реализовать не могу Вот первая часть кода ! (почему то весь не поместился сюда) Код (Text): //Arduino Pro mini Extruder v2.81 finish 24.01.2014 #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; }
вот вторая часть кода и она как раз начинается с функции вызова меню редактирования температуры Код (Text): /////////////////////////////////////////////////////////////////////////////////////////////////////////// //Определим процедуру редактирования заданной температуры //Вызывается по нажатию клавиши 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; } }