Официальный сайт компании Arduino по адресу arduino.cc
Регулируемый паяльник и регулируемый БП
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 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
Да, нет, ну какие-то пояснения. описания - будут? Нет?