Четыре зоны управления температурой + ШД

Тема в разделе "Arduino & Shields", создана пользователем SONIC300077, 17 окт 2013.

  1. SONIC300077

    SONIC300077 Нуб

    Здравствуйте ! Я совсем недавно начал заниматься ардуно и поэтому не могу пока сам полностью написать программу для своих нужд, а программа очень нужна, поэтому не пинайте меня сильно , вот нашел почти то что нужно!
    для начало мне нужно чтобы вместо 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();} //Переход к редактированию заданной температуры
    }
     
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Поиск готового решения - плохой способ обучения.
    Схема устройства уже есть? Или пишете сферическую прошивку в вакууме?
     
  3. SONIC300077

    SONIC300077 Нуб

    Да все это понятно ! Я и шел от малого к большому ! вот только мой отец делает устройство "Экструдер" и так сказать попросил помочь по электронной части вот поэтому и попытался в ускоренном темпе обучаться ! Собственно нужно четыре температурных датчика, четыре реле, возможность задавать нужную температуру для каждого контура отдельно, и один ШД (управление оборотами двигателя)
    у меня есть мега 2560 ЛСД= клавиатура из 5 кнопок есть релюшки твердотельные и термопары !
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Какие именно термопары? Нужно сперва определиться со способом их подключения к контроллеру.
    Для этого нужно знать их характеристики.
     
  5. SONIC300077

    SONIC300077 Нуб

    Вот есть как раз 4 штуки одинаковые, вот документация прикрепляю!
    Вот такие тоже можно (EPCOS B57560G104F NTC 100k THERMISTOR) но будут через месяц недавно только заказал для 3 D принтеров
     

    Вложения:

    • thermocouple.pdf
      Размер файла:
      121,3 КБ
      Просмотров:
      360
  6. SONIC300077

    SONIC300077 Нуб

    Я завершил дело ! что кажете может что поправите, или посоветуете !!



    код прикрепляю !
     

    Вложения:

  7. SeverKZ

    SeverKZ Нуб

    Спасибо !
    Беру код в копилку по изучению программирования Ардуино
    Стоит похожая задача - поддерживать температуру в резервуарах в заданном диапазоне.
    Думаю взяв Ваш скетч за основу теперь не будет проблем
    Кстати экструдер чего делаете (пластик, пелеты, зерновые ?)
     
  8. SONIC300077

    SONIC300077 Нуб

    Всегда пожалуйста ! это мой первый опыт,так что если что не так сильно не ругайте а лучше пишете , одна голова хорошо а две всегда лучше !!
    А про экструдер !
    нитку (PLA ABS ) 3mm и 1.75. пластики для 3D принтеров(REpRAP) производство налаживаю !!

    как закончу фото видео выложу, да и сайт собственный хочу заказать ! как то так вот .

    Если что пишите чем смогу помогу ))
     
  9. Megakoteyka

    Megakoteyka Оракул Модератор

    Код (Text):
      if (Feature==5) {
        EEPROM_write_byte(0,setTmp1);
        EEPROM_write_byte(1,setTmp2);
        EEPROM_write_byte(2,setTmp3);
        EEPROM_write_byte(3,setTmp4);
      }
     
  10. SONIC300077

    SONIC300077 Нуб

    Спасибо ! многое проясняет для меня ! ну а вообщем есть что еще подметить, буду очень признателен !
     
  11. Megakoteyka

    Megakoteyka Оракул Модератор

    Всегда рад помочь :)
    Код (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". Случаи, конечно, бывают разные, но часто это помогает сэкономить память. Поэкспериментируйте и посмотрите на размер прошивки при компиляции. Также можете сравнить, как меняется размер прошивки при добавлении одного вызова функции.
    В контроллере памяти кот наплакал - бывает, что приходится биться за каждый байт.
    Если будете писать большую программу и памяти перестанет хватать - вспомните об этом :)

    История одного байта.
     
  12. lerik2703

    lerik2703 Гик

    вот почему-от мне кажется что эту историю надо рассказать другому человеку на этом форуме...
    sorry за [​IMG]
     
  13. SONIC300077

    SONIC300077 Нуб

    Спасибо! хорошо попробуем .
     
  14. SONIC300077

    SONIC300077 Нуб

    Вот вчера получил датчики http://www.ebay.com/itm/50x-Reprap-100K-ohm-NTC-Thermistor-/160978297048 подскажите пожалуйста как их грамотно откалибровать, или может есть еще какие то способы определить их в скетче так чтоб точно показывали температуру !
     
  15. Megakoteyka

    Megakoteyka Оракул Модератор

    Опытным путем разве что. Снимайте показания термистора одновременно с измерением хорошим градусником. Ищите зависимость между расхождениями. Стройте формулу.
     
  16. SONIC300077

    SONIC300077 Нуб

    А как насчет вот таких таблиц ??
    если можно поясните вкратце в чем разница той формулы что я использую (кстати я вроде настроил термистор с резистором на 4.7 к вроде правильно все показывает ) и так сказать вот этих таблиц их тоже используют с резистором на 4.7 к ток схема подключения немного отличается !
    Да и сами понимаете как сильно хочется применить ее в своем коде ! ну или на ее основе сделать новый !


    [​IMG]

    Код (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
     
  17. SONIC300077

    SONIC300077 Нуб

    Помогите разобраться с кодом ! у меня не получается избавиться от лишних кнопок ! сейчас код работает так



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

    Вот первая часть кода ! (почему то весь не поместился сюда)

    Код (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;
    }
     
    Последнее редактирование: 25 янв 2014
  18. SONIC300077

    SONIC300077 Нуб

    вот вторая часть кода и она как раз начинается с функции вызова меню редактирования температуры
    Код (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;
      }
    }
     
     
  19. TJZ

    TJZ Нуб

    нет нужно только управление нагревом
     
  20. TJZ

    TJZ Нуб

    подскажи как ты подключил кнопки