странно, а раньше тоже AMS1117 стоял?
странно, а раньше тоже AMS1117 стоял?
Да, я выпаял его из нерабочей и впаял в рабочую (она работает с ним) Что то не получается управлять вентилятором с другого пина. Вращая ручку энкодера ни чего не происходит вплоть до достижения максимального значения - тогда моторчик запускается на полную.
Последний раз редактировалось Kevin; 17.05.2018 в 00:15.
Может в коде ошибка?
Возможно. Нужно ведь как то второй таймер подключить? int motorPin = 6; заменить на 9 недостаточно?
PHP код:
#include "U8glib.h"
#include "rus6x12.h"
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
//===========================================================
U8GLIB_SSD1306_128X64 u8g(A4, /* data=*/ A3, /* cs=*/ A2, /* dc=*/ A1, /* reset=*/ A0); // наш дисплей ||
//===========================================================
volatile uint8_t tic, Dimmer;
int motorPin = 6;
int motorSpeed = 75; // Изначальная скорость двигателя
int fanPower = 170; // Изначальная мощность фена
int stepFen = 5; // шаг изменения мощности
int stepMoto = 5; // шаг изменения мощности
int selectMode = 0; // Что изменять, скорость или мощность фена
// =================================== энкодер =====================
unsigned long currentTime;
unsigned long loopTime;
#define PIN_ENCODER_CLK 3
#define PIN_ENCODER_DT 5
#define PIN_ENCODER_SW 7
unsigned char ENCODER_CLK;
unsigned char ENCODER_DT;
unsigned char ENCODER_CLK_prev=0;
// =================================== Кнопка энкодера =====================
bool button_state = false;
bool button_auto_state = false;
uint32_t ms_button = 0;
uint32_t ms_auto_click = 0;
// =================================== дисплей =====================
void draw(void) {
u8g.setFont(u8g_font_courR24n); // тонкие цифры
u8g.setPrintPos(15, 22);
u8g.print(fanPower);
u8g.setPrintPos(15, 64);
u8g.print(motorSpeed);
u8g.setPrintPos(-2, 70);
u8g.print("*");
// if(selectMode == 1 && (millis() & 512))
if(selectMode == 1)
{
u8g.setPrintPos(78, 23);
u8g.print(".");
}
//if(selectMode == 2 && (millis() & 512))
if(selectMode == 2)
{
u8g.setPrintPos(78, 59);
u8g.print(".");
}
// ===================================
u8g.setPrintPos(81, 6);
u8g.setFont(rus6x12);
u8g.print("температура");
u8g.setPrintPos(84, 43);
u8g.print("обороты");
// ===================================
u8g.setFont(u8g_font_courR14r);
u8g.setPrintPos(95, 27);
// u8g.print(SetPower);
u8g.setPrintPos(95, 64);
// u8g.print(SetSpeed);
// =================================== =====================
u8g.drawLine(77, 0, 77, 64); // Вертикальная линия
u8g.drawLine(80, 32, 128, 32); // Горизонтальная короткая линия
// u8g.drawBitmapP(0, 0, 1, 24, Termometr);
// u8g.drawBitmapP(-2, 47, 2, 14, Cooler);
}
void setup() {
// =================================== Диммер =====================
//TCCR0B = TCCR0B & 0b11111000 | 5;
TCCR1B = TCCR1B & 0b11111000 | 5;
Dimmer = fanPower;
D4_Out; //Настраиваем порты на выход
D4_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
StopTimer1(); //остановить таймер
// =================================== энкодер =====================
pinMode(PIN_ENCODER_CLK, INPUT);
pinMode(PIN_ENCODER_DT, INPUT);
pinMode(PIN_ENCODER_SW, INPUT_PULLUP); // Кнопка энкодера
pinMode(motorPin, OUTPUT);
currentTime = millis();
loopTime = currentTime;
Serial.begin(9600); // для отладки
//====================== Обновление дисплея ======================
u8g.firstPage();
do {draw();} while( u8g.nextPage() );
//====================== Обновление дисплея ======================
}
void loop()
{
analogWrite(motorPin, motorSpeed); // Устанавливаем первоначальную скорость
// =================================== Кнопка энкодера =====================
uint32_t ms = millis();
bool pin_state = digitalRead(PIN_ENCODER_SW);
if( pin_state == LOW && !button_state && ( ms - ms_button ) > 50 )// Фиксируем нажатие кнопки
{
button_state = true;
button_auto_state = false;
ms_button = ms;
if(selectMode == 1)
{
selectMode = 2;
Serial.println("Press key");
}
else
{
selectMode = 0;
}
//====================== Обновление дисплея ======================
u8g.firstPage();
do {draw();} while( u8g.nextPage() );
//====================== Обновление дисплея ======================
}
if( pin_state == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ) // После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия
{
button_auto_state = true;
ms_auto_click = ms;
selectMode = 1;
Serial.println("Auto press key");
//====================== Обновление дисплея ======================
u8g.firstPage();
do {draw();} while( u8g.nextPage() );
//====================== Обновление дисплея ======================
}
if( pin_state == HIGH && button_state && ( ms - ms_button ) > 50 ) // Фиксируем отпускание кнопки
{
button_state = false;
ms_button = ms;
if( !button_auto_state )
Serial.println("No Press key");
}
// =================================== Вал энкодера =====================
currentTime = millis();
if(currentTime >= (loopTime + 5))
{ // проверяем каждые 5мс (200 Гц)
ENCODER_CLK = digitalRead(PIN_ENCODER_CLK); // считываем состояние выхода А энкодера
ENCODER_DT = digitalRead(PIN_ENCODER_DT); // считываем состояние выхода B энкодера
if((!ENCODER_CLK) && (ENCODER_CLK_prev))
{ // если состояние изменилось с положительного к нулю
if(ENCODER_DT) // выход В в полож. сост., значит вращение по часовой стрелке
{
if (selectMode == 1)
{
if(fanPower - stepFen >= 0)
fanPower -= stepFen; // увеличиваем мощность фена, не ниже 0
}
//else
if (selectMode == 2)
{
if(motorSpeed + stepMoto <= 255)
motorSpeed += stepMoto; // Прибавляем скорость
}
}
else // выход В в 0 сост., значит вращение против часовой стрелки
{
if (selectMode == 1)
{
if(fanPower + stepFen <= 255)
fanPower += stepFen; // уменьшаем мощность фена, но не более чем до 255
}
// else
if (selectMode == 2)
{
if(motorSpeed - stepMoto >= 0)
motorSpeed -= stepMoto; // уменьшаем скорость
}
}
//====================== Обновление дисплея ======================
u8g.firstPage();
do {draw();} while( u8g.nextPage() );
//====================== Обновление дисплея ======================
}
ENCODER_CLK_prev = ENCODER_CLK; // сохраняем значение А для следующего цикла
loopTime = currentTime;
}
Dimmer = fanPower;
}
// =================================== обработчик и прерываний =====================
void halfcycle() //прерывания таймера
{
tic++; //счетчик
if(Dimmer < tic ) D4_High; //управляем выходом
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic=0; //обнулить счетчик
ResumeTimer1(); //запустить таймер
attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
StopTimer1(); //остановить таймер
D4_Low; //логический ноль на выходы
tic=0; //обнулить счетчик
attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
Последний раз редактировалось Kevin; 17.05.2018 в 00:36.
Timer1 тоже занятStartTimer1(halfcycle, 40); //время для одного разряда ШИМ
остается только Timer2
Получилось на 11 пин
Вроде работает нормально - регулирует обороты и температуру. Встроенную термопару пока подключать не стал - измеряю температуру термопарой мультиметра. Заметил что температура не очень стабильна, а при добавлении оборотов немного падает (что и не удивительно). Вот и думаю - надо как то сделать поддержание установленной температуры, но боюсь что намудрю. Как лучше реализовать данное действо. Думаю так:
1. Регулируя температуру, устанавливать мощность диммера на примерную величину (к примеру 170 единиц диммера = 200 градусов)
2. Задать переменной (к примеру setTemp) значение 200
3. И далее в секундном таймере делать проверку - если температура на термопаре фена больше setTemp на 10, то уменьшить мощность диммера на -1. А если меньше - то прибавить.
Верна ли логика моих мыслей?
Последний раз редактировалось Kevin; 17.05.2018 в 20:25.
Логика верна, но нужно регулировать дельту в обе стороны. как на понижение так и на увеличение температуры
Не внимательно прочитал
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)