Skocz do zawartości

Jak powiązać detektor przejścia przez zero z zadawaniem temperatury za pomocą ADC?


Razor1711

Pomocna odpowiedź

Witam,

dopiero rozpoczynam przygodę z arduino, ale rzuciłem się na głęboką wodę, stąd wynikł problem. Mianowicie chodzi o sterowanie grzałką za pomocą triaka.

Chciałbym za pomocą potencjometru ustawiać temperaturę wspomnianej grzałki. W jaki sposób to zrobić? W kodzie programu jest fragment wykrywania przejścia przez zero, ale nie wiem jak powiązać to z nastawianą wartością temperatury.

/*Wyprowadzenia pinow
 *Kontaktron - 
 *CS pin on MAX 6675 -8
 *SO pin on MAX 6675 -6
 *SCK pin on MAX 6675 -7
 *Kontaktron - D2
 *Zero corss detector - D6
 *Sterowanie grzalka - D8
 *Sterowanie wentylatorem - D9
 *Przycisk gora - A3 potencjometr od HA
 *Przycisk dol - A1 potencjometr od wentylatora

*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "max6675.h"


LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display


int thermoCS = 5;            // CS pin on MAX6675
int thermoSO = 3;            // SO pin of MAX6675
int thermoSCK = 4;           // SCK pin of MAX6675
int ha = 0;
int PWM;    
int podstawa = 0; 
int reedswitch = 5;  
int stopnie;
int ADC_HA;
int ADC_FAN;
int valueRead_HA;
int valueRead_FAN;
int temperature;
int AC_LOAD = 8;
int dimming = 128; //iczby od 1 do 128 to nasze dyskretne kroki ustawiania mocy. Zadany poziom przekazujemy do funkcji poprzez zmienną "dimming"

#define reedswitch 5  //kontaktron

MAX6675 thermocouple(thermoSCK, thermoCS, thermoSO);

/**********************symbole strzalek**********************************/
byte stopienC[8] = 
{
    B01100,
    B10010,
    B10010,
    B01100,
    B00000,
    B00000,
    B00000,
    B00000,
};

byte strzalka[8] = 
{
    B00000,
    B00100,
    B00110,
    B11111,
    B11111,
    B00110,
    B00100,
    B00000,
};

byte strzalka1[8] = 
{
    B00100,
    B01010,
    B10001,
    B00100,
    B01010,
    B10001,
    B00100,
    B01010,
};

byte strzalka2[8] = 
{
    B00100,
    B01010,
    B10001,
    B00100,
    B01010,
    B10001,
    B00100,
    B01010,
};
                    
void setup()
{
  Wire.begin();
  lcd.init();                      // inicjalizacja LCD
  lcd.backlight();
  lcd.setCursor(1,0);
  lcd.print("Stacja HOT AIR ");
  lcd.setCursor(3,1);
  lcd.print("Krystian W ");
  delay(1500);
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("SSC Projekt");
  delay(2500);
  lcd.clear();

  lcd.createChar(1,stopienC);
  lcd.createChar(2,strzalka);
  lcd.createChar(3,strzalka1);
  lcd.createChar(4,strzalka2);


  pinMode(9, OUTPUT);          //pin wyjsciowy WENTYLATORA
  pinMode(8, OUTPUT);          //pin wyjsciowy GRZALKI
  
  pinMode(5, INPUT);     //pin wejściowy z kontaktronu

 Serial.begin(9600);
 
 
  pinMode(AC_LOAD, OUTPUT); // Ustawiamy pin kontrolujący triak jako wyjście
  attachInterrupt(1, zero_crosss_int, RISING);  // Konfigurujemy przerwanie do współpracy z układem detekcji zera 
}

/***************DETEKTOR PRZEJSCIA PRZEZ ZERO***************************/

void zero_crosss_int()  // funkcja uruchamiana przez przerwanie z detektora przejścia przez zero
{
  int dimtime = (75*dimming);    // Dla 60 Hz będzie to 65 
  delayMicroseconds(dimtime);    // Oczekiwanie na załączenie
  digitalWrite(AC_LOAD, HIGH);   // Wyzwolenie triaka
  delayMicroseconds(10);         // Czas załączania się triaka (dla 60 Hz użyjmy wartości 8.33)
  digitalWrite(AC_LOAD, LOW);    // Wyłączenie napięcia na bramce triaka
}

void loop()
{
/***************************ODCZYT_TEMPERATURY***********************************/
  
  Serial.print(" C = ");
  Serial.print(thermocouple.readCelsius());
  
        lcd.setCursor(0,0); //ustawienie kursoru odkad mialby zaczac pojawiac sie tekst
        lcd.print("HOT:"); //generowanie napisu
        
        lcd.setCursor(5,0); //pozycja na LCD dla odczytywanej wartosci temperatury
        lcd.print(thermocouple.readCelsius());
            
        lcd.setCursor(8,0);  //pozycja symbolu stopni
        lcd.print((char)223); //symbol stopni
        
        lcd.setCursor(9,0); //pozycja symbolu Celsjusza
        lcd.print("C");
        delay(1500);



/***************************KONTAKTRON***********************************/

if (digitalRead(reedswitch) == LOW)
      {
      podstawa = 2;
      }
      else
        {
        podstawa = 0;
        }

/***************************HOT AIR***********************************/
if(ha > 1)
      {
      ADC_HA = 0;
      analogWrite(12, 0);
      PWM = 0;
      lcd.setCursor(10,0);
      lcd.print(" ");
      lcd.setCursor(13,0);
      lcd.print(" ");
      lcd.setCursor(13,1);
      lcd.print(" ");
      }
      else
        {
        if(podstawa > 1)
          {
          lcd.setCursor(10,0);
          lcd.print("X");
          ADC_HA = 0;
          PWM = 50;
          analogWrite(12, 126); //PWM na 50 %
          digitalWrite(11, LOW);
          lcd.setCursor(13, 0);
          lcd.print(" ");
          }
 
        if(podstawa < 1)
          {
          lcd.setCursor(10,0);
          lcd.print(" ");
          
     valueRead_HA = analogRead(A3);                         //Odczytanie wartości z ADC do grzalki
          ADC_HA = map(valueRead_HA, 5, 1005, 100, 500);    //Przeskalowanie wartości  







                    valueRead_FAN = analogRead(A1);                   //Odczytanie wartości z ADC do wentylatora
          ADC_FAN = map(valueRead_FAN, 5, 1005, 127, 253);  //Przeskalowanie wartości
          analogWrite(10, ADC_FAN);
          PWM = map(valueRead_FAN, 5, 1005, 50, 100);       //Przeskalowanie wartości 1020
          }
        }
           
    lcd.setCursor(14, 1);
    lcd.write(2);
    threenumbers(ADC_HA);
    lcd.write(1);
    lcd.print("C");
    
    lcd.setCursor(12, 2);
    lcd.print("PWM");
    lcd.write(2);
    threenumbers(PWM);
    lcd.print("%");
       
 /***********************Teermopara_HA*****************/
    
    
    if(ADC_HA >= temperature)           //termopara
      {
      digitalWrite(8, HIGH);
      lcd.setCursor(12,1);
      lcd.write(4);
      }
    if( ADC_HA + 1 <= temperature)      ////////////////////////////////////////////////////////////////bylo + 2
      {
      digitalWrite(8, LOW);
      lcd.setCursor(12,1);
      lcd.print(" ");
      }    
    

/*******************PRZESKALOWANIE RZEDU WYSWIETLANYCH CYFR*********************/
   }
void threenumbers(int number)     //Funkcja odpowiedzialna za wyswietlanie spacji na pozycji poprzedzającej gdy 3 cyfry zmieniaja się na dwie
{ 
         if (number >= 0 && number < 100) 
          {
           lcd.write(' ');
          }
         lcd.print(number);    
}

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.