ребята помогите с подключением термопары PT100

Тема в разделе "Arduino & Shields", создана пользователем TJZ, 18 мар 2015.

  1. TJZ

    TJZ Нуб

    очень нужно подключить термопару РТ100 4 штуки с выводом сигнала на LCD экран
     
  2. X-Dron

    X-Dron Гик

    Это не термопара, а термосопротивление.
    Есть такой вариант
    http://bascomavr.3bb.ru/viewtopic.php?id=1147
    Но народ больше сходится на использовании микросхемы MAX31865.
    Есть готовые модули. Одноканальный стоит около $30, двухканальный $50
     
  3. TJZ

    TJZ Нуб

    вообщем такая тема, я только начал заниматься программированием ардуино но пошарился по инету и нашел примерно то что мне нужно, только нужно убрать некоторые части програмы и добавить кое что свое
    вот этот скетч
    #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;
    }
     
  4. TJZ

    TJZ Нуб

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Определим процедуру редактирования заданной температуры
    //Вызывается по нажатию клавиши 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. TJZ

    TJZ Нуб

    мне нужно сделать 5 зон нагрева вместо 4х
    и при перегреве 1й и 2й зоны должен включатся вентилятор
    а ещё если сигнал на реле подаётся а нагрева не происходит то должна сработать сигнализация(реле)
     
  6. vvr

    vvr Инженерище

    это уже не помогите, а сделайте:)
     
  7. TJZ

    TJZ Нуб

    ну я просто подробно описал что мне нужно от этой системы, помогите добавить 5ю зону нагрева