Регулируемый паяльник и регулируемый БП

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

Код


#include "U8glib.h"
U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI 
int stat = 0;
int stat1 = 0;
int list = 0;
int Set = 0;
float voltege = 0;
#define thermocouplePin A0     // номер порта к которому подключен выход усилителя термопары

const int analogIn = A1;
int mVperAmp = 100; // use 185 for 5A Module, 100 for 20A Module, 66 for 30A Module
int RawValue= 0;
int ACSoffset = 2500; 
double Voltage = 0;
double Amps = 0;

double Ups = 5; //напряжение питания усилителя и ардуино
double kt = 85; //коэффициент для преобразования напряжения в температуру
double ADCmaxVal = 1023; //максимальное значение выдаваемое АЦП ардуино
double tHome = 15; //комнатная температура
int thermocoupleVal = 0;           //полученное с АЦП число

float Vmax = 0;
double Tout = 0; //температура спая термопары
int Tmax = 300;
int Tdelta = 5;
int PWM = 9; // 9pin
int PWM1 = 10; // 9pin
int Power;
int Power1;
int pinButton = 2; //Пин прерывания нажатия кнопки
int pinButton2 = 3; //Пин прерывания нажатия кнопки

long timeButtonPressed =1300; // Долгое удержание кнопки после 1,5 секунд
//long timeButtonPressed2 = 1500; // Долгое удержание кнопки после 1,5 секунд
volatile bool flagButton = false; // Было ли нажатие кнопки
volatile bool flagButtonLong = false; // Было ли долгое удержание кнопки
volatile long timeButtonDown = 0; // Переменная хранящая время нажатия кнопки
volatile bool isButtonDown = false; // Переменная хранящая время нажатия кнопки
volatile bool longPressReleased = false; // Переменная для фиксации срабатывания долгого нажатия

volatile bool flagButton2 = false; // Было ли нажатие кнопки
volatile bool flagButtonLong2 = false; // Было ли долгое удержание кнопки
volatile long timeButtonDown2 = 0; // Переменная хранящая время нажатия кнопки
volatile bool isButtonDown2 = false; // Переменная хранящая время нажатия кнопки
volatile bool longPressReleased2 = false; // Переменная для фиксации срабатывания долгого нажатия

int keyLongPress=0;
int keyShortPress=0;
int keyLongPress2=0;
int keyShortPress2=0;

void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
 if (list == 0){   ////////// лист 1 ////////////
  u8g.setColorIndex(0);
  u8g.setColorIndex(1);
  
  if (stat == 0){ 
    u8g.setColorIndex(0);
    u8g.setColorIndex(1);
    u8g.setFont(u8g_font_6x10); 
    u8g.drawStr( 15, 32, "Off");
    }
 if (stat == 1){ 
    u8g.setColorIndex(0);
    u8g.setColorIndex(1);
    u8g.setFont(u8g_font_6x10); 
    u8g.drawStr( 17, 32, "On");
    }
 if (stat1 == 0){ 
    u8g.setColorIndex(0);
    u8g.setColorIndex(1);
    u8g.setFont(u8g_font_6x10); 
    u8g.drawStr( 88, 32, "Off");
    }
 if (stat1 == 1){ 
    u8g.setColorIndex(0);
    u8g.setColorIndex(1);
    u8g.setFont(u8g_font_6x10); 
    u8g.drawStr( 90, 32, "On");
    }
 if (Set == 0){ 
    u8g.setColorIndex(0);
    u8g.setColorIndex(1);
    u8g.drawLine(9, 28, 12, 28);
    u8g.drawLine(34, 28, 37, 28);
    }
  if (Set == 2){ 
    u8g.setColorIndex(0);
    u8g.setColorIndex(1);
    u8g.drawLine(82, 28, 85, 28);
    u8g.drawLine(107, 28,110, 28);
    }
  u8g.setFont(u8g_font_9x18B);   
  u8g.drawStr(50, 20, "C");
  u8g.drawCircle(48, 7, 2, U8G_DRAW_ALL);  
  u8g.drawStr(68, 10, "U=");
  u8g.setPrintPos( 90,10);
  u8g.print(voltege,1);
  u8g.drawStr(68, 22, "I=");
  u8g.setPrintPos( 90,22);
  u8g.print(Amps,1);
  u8g.setFont(u8g_font_gdr20n);
  u8g.setPrintPos( 0,20);
  u8g.print(Tout,0);
}
////////////////////////лист 2/////////////////////////////// 
 if (list == 1){
  u8g.setColorIndex(0);
  u8g.setColorIndex(1);  
  u8g.setFont(u8g_font_6x10); 
  u8g.drawStr( 5, 20, "T=");
  u8g.setFont(u8g_font_9x18B);   
  u8g.drawStr(100, 20, "C");
  u8g.drawCircle(98, 7, 2, U8G_DRAW_ALL);
  u8g.setFont(u8g_font_gdr20n);
  u8g.setPrintPos( 35,20);
  u8g.print(Tmax);
 }
 if (list == 3){
  u8g.setColorIndex(0);
  u8g.setColorIndex(1);  
  u8g.setFont(u8g_font_6x10); 
  u8g.drawStr( 5, 20, "U=");
  u8g.setFont(u8g_font_9x18B);   
  u8g.drawStr(110, 20, "v");  
  u8g.setFont(u8g_font_gdr20n);
  u8g.setPrintPos( 25,20);
  u8g.print(Vmax,1);

 }
 }
 
void Button() {
      
      if (millis() - timeButtonDown < 30) return; 
      int pinButValue = digitalRead(pinButton); // Получаем состояние пина кнопки 
      cli(); // Запрещаем обработку прерываний, чтобы не отвлекаться 
      timeButtonDown = millis(); // Запоминаем время нажатия/отжатия 
      if (!pinButValue) { // При нажатии подается инвертированный сигнал 
      isButtonDown = true; // Устанавливаем флаг нажатия кнопки 
      } 
      else if (isButtonDown) { // Если кнопка отжата, смотрим не было ли выполнено действие 
      if (!longPressReleased) { // Если долгое нажатие не было ни разу отработано, то... 
      flagButton = true; // Если не было удержания, ставим флаг события обычного нажатия 
      }
      isButtonDown = false; // Сбрасываем флаг нажатия 
      longPressReleased = false; // Сбрасываем флаг длительного удержания 
      }
      sei(); // Разрешаем обработку прерываний 
 }
 void Button2() {
      
      if (millis() - timeButtonDown2 < 30) return; 
      int pinButValue2 = digitalRead(pinButton2); // Получаем состояние пина кнопки 
      cli(); // Запрещаем обработку прерываний, чтобы не отвлекаться 
      timeButtonDown2 = millis(); // Запоминаем время нажатия/отжатия 
      if (!pinButValue2) { // При нажатии подается инвертированный сигнал 
      isButtonDown2 = true; // Устанавливаем флаг нажатия кнопки 
      } 
      else if (isButtonDown2) { // Если кнопка отжата, смотрим не было ли выполнено действие 
      if (!longPressReleased2) { // Если долгое нажатие не было ни разу отработано, то... 
      flagButton2 = true; // Если не было удержания, ставим флаг события обычного нажатия 
      }
      isButtonDown2 = false; // Сбрасываем флаг нажатия 
      longPressReleased2 = false; // Сбрасываем флаг длительного удержания 
      }
      sei(); // Разрешаем обработку прерываний 
 }

void setup() {
  
  pinMode(pinButton, INPUT); // Пины в режим приема INPUT
  pinMode(pinButton2, INPUT); // Пины в режим приема INPUT  
  attachInterrupt(0, Button, CHANGE); // Настраиваем обработчик прерываний по изменению сигнала нажатия кнопки 
  attachInterrupt(1, Button2, CHANGE); // Настраиваем обработчик прерываний по изменению сигнала нажатия кнопки
  pinMode(PWM,OUTPUT);
  pinMode(PWM1,OUTPUT);
  pinMode(thermocouplePin, INPUT);
  //Serial.begin(9600);              //  установка связи по serial
  //analogReference(INTERNAL);
  //TCCR0B = TCCR0B & 0b11111000 | 0x01;   // 5,6 пины
  TCCR1B = TCCR1B & 0b11111000 | 0x01;   // 9,10 пины
  // TCCR2B = TCCR2B & 0b11111000 | 0x07;  // 3,11 пины
}

void loop() {

   if (millis() - timeButtonDown > timeButtonPressed && isButtonDown) {
      // Время длительного удержания наступило 
      flagButtonLong = true; 
      } 
            
          if (flagButton) { // Кнопка нажата // ... 
            //Serial.println("short_press");
            keyShortPress=1;
            flagButton = false; // Действие обработано - сбрасываем флаг 
            } 
            if (flagButtonLong && isButtonDown) { // Кнопка удерживается 
              if (!digitalRead(pinButton) && millis() - timeButtonDown > timeButtonPressed) { // Защита от ложного срабатывания // ... 
               // Serial.println("long_press"); 
                keyLongPress=1;
                }
                 
//=========================================== Настраиваем реакцию на долгое удержание кнопки ===============================================
            
// Чтобы событие long_press во время удержания срботало только один раз, необходимо раскомментировать блок и закомментировать следующий
//isButtonDown = false;                 // Программно "отжимаем" кнопку
// Эти две строки отвечают за то, чтобы при долгом удержании кнопки, событие long_press повторялось каждые 1,5 секунды
// Для того, чтобы изменить это поведение нужно закомментировать две эти строки и раскомментировать строку из предыдущего блока
timeButtonDown = millis();            // Сбрасываем таймер
longPressReleased = true;             // Флаг срабатывания долгого удержания, чтобы отсечь генерацию обычного нажатия при отпускании кнопки
//==========================================================================================================================================
flagButtonLong = false; // Действие обработано - сбрасываем флаг 
    }
    if (millis() - timeButtonDown2 > timeButtonPressed && isButtonDown2) {
      // Время длительного удержания наступило 
      flagButtonLong2 = true; 
      } 
if (flagButton2) { // Кнопка нажата // ... 
            //Serial.println("short_press1");
            keyShortPress2=1;
            flagButton2 = false; // Действие обработано - сбрасываем флаг 
            } 
            if (flagButtonLong2 && isButtonDown2) { // Кнопка удерживается 
              if (!digitalRead(pinButton2) && millis() - timeButtonDown2 > timeButtonPressed) { // Защита от ложного срабатывания // ... 
              // Serial.println("long_press1"); 
                keyLongPress2=1;
                }
                 
//=========================================== Настраиваем реакцию на долгое удержание кнопки ===============================================
            
// Чтобы событие long_press во время удержания срботало только один раз, необходимо раскомментировать блок и закомментировать следующий
//isButtonDown = false;                 // Программно "отжимаем" кнопку
// Эти две строки отвечают за то, чтобы при долгом удержании кнопки, событие long_press повторялось каждые 1,5 секунды
// Для того, чтобы изменить это поведение нужно закомментировать две эти строки и раскомментировать строку из предыдущего блока
timeButtonDown2 = millis();            // Сбрасываем таймер
longPressReleased2 = true;             // Флаг срабатывания долгого удержания, чтобы отсечь генерацию обычного нажатия при отпускании кнопки
//==========================================================================================================================================
flagButtonLong2 = false; // Действие обработано - сбрасываем флаг 
    }
    
  int val = analogRead(A1);
  thermocoupleVal = analogRead(thermocouplePin);
  Tout = (thermocoupleVal*Ups/ADCmaxVal)*kt+tHome;
 
  if (keyLongPress && keyLongPress2){ Set ++ ; }
  if (Set == 4){ Set=0; }
 //if (keyLongPress == 1){ Set ++ ; }
 //if (Set == 4){ Set=0; }
//if (keyLongPress2 == 1){ Set -- ; }
// if (Set ==-1){ Set=3; }
////////////////////////////// выставляем температуру////////////////////////////////
 if (Set == 1){list = 1;
 if (keyShortPress == 1) { Tmax = Tmax +1;  }   
 if (keyShortPress2 == 1) { Tmax = Tmax -1; }
 if (keyLongPress == 1) { Tmax = Tmax +10;  }   
 if (keyLongPress2 == 1) { Tmax = Tmax -10; }
 }  
//////////////////////////// включение выкл паяльника //////////////////////////////////
 if (Set == 0){list = 0;
 if (keyShortPress == 1) { stat=1; } // таймер  
 if (keyShortPress2 == 1) { stat=0;}
 }
////////////////////////////// выставляем voltage////////////////////////////////
 if (Set == 3){list = 3;
 if (keyShortPress == 1) { Vmax = Vmax +0.1;  }   
 if (keyShortPress2 == 1) { Vmax = Vmax -0.1; }
 if (keyLongPress == 1) { Vmax = Vmax +1;  }   
 if (keyLongPress2 == 1) { Vmax = Vmax -1; }
 }  
//////////////////////////// включение выкл БП //////////////////////////////////
 if (Set == 2){list = 0;
 if (keyShortPress == 1) { stat1=1; } // таймер  
 if (keyShortPress2 == 1) { stat1=0;}
 }


////////////////////////////// управление мощностью нагревателя при помощи шим ////////////////////////////////   

 if (stat==1){Power = map(Tout,(Tmax-Tdelta),Tmax,0,255);
 if (Power<0) Power=0;
 if (Power>255) Power=255;
 analogWrite(PWM,Power);}
 if (stat==0){analogWrite(PWM,255);} 

 float voltege1 = (analogRead(A2) * 5) / 1023.0;  
  voltege = voltege1 / (6.8 / (100.0 + 6.8)); // R2/(R1+R2)
  
 if (stat1==1){//Power1 = map(voltege,(Vmax-1),Vmax,255,0);
 //if (Power1<0) Power1=0;
// if (Power1>255) Power1=255;
if (voltege>Vmax){
  Power1=Power1-1;
  if (Power1<1) Power1=0;}
if (voltege<=Vmax){
  Power1=Power1+1;
  if (Power1>250) Power1=250;}  
 analogWrite(PWM1,Power1);}
 
 if (stat1==0){analogWrite(PWM1,0);}

 RawValue = analogRead(analogIn);
 Voltage = (RawValue / 1024.0) * 5000; // Gets you mV
 Amps = ((Voltage - ACSoffset) / mVperAmp);
  //if (Amps>8) stat1=0; 
   

u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  
 keyLongPress=0;
 keyShortPress=0;
 keyLongPress2=0;
 keyShortPress2=0;
}

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

И что?

aleksey19ru
Offline
Зарегистрирован: 23.06.2016
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Да, нет, ну какие-то пояснения. описания - будут? Нет?