Регулируемый паяльник и регулируемый БП
- Войдите на сайт для отправки комментариев
Вс, 12/11/2017 - 09:31
Код
#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;
}
И что?
https://youtu.be/ZsFFnPBVlys
Да, нет, ну какие-то пояснения. описания - будут? Нет?