Работает. А почему (#define CLK 3) // Clock Подключаем к INT1, нельзя переназначать?
Не знал что (#define GT 6 // Gate Triac управление симистором) можно поменять с 4 на 6.
P,S не приходит письмо с форума, на восстановление пароля. (Kevin)
Работает. А почему (#define CLK 3) // Clock Подключаем к INT1, нельзя переназначать?
Не знал что (#define GT 6 // Gate Triac управление симистором) можно поменять с 4 на 6.
P,S не приходит письмо с форума, на восстановление пароля. (Kevin)
Спасибо! значит я могу выкладывать? Хотя еще хочу немного доделать, что бы он последние настройки сохранял и управлял вкл/выкл кнопкойРаботает.
Потому что D2 уже занят под диммер, а прерываний все 2, int0 и int1А почему (#define CLK 3) // Clock
Можно сделать и без прерываний, но это уже не совсем правильно, так как не будет работать в фоновом режиме
Можно на любой пин поменятьНе знал что (#define GT 6 // Gate Triac управление симистором) можно поменять с 4 на 6.
Рассылку почты забанили опятьP,S не приходит письмо с форума, на восстановление пароля. (Kevin)
Скинул новый пароль в личку
Последний раз редактировалось Chip; 07.03.2018 в 01:45.
При подключении библиотеки u8glib, лампочка при малых мощностях начинает мерцать.
Код HTML:void loop() { u8g.firstPage(); do { draw(); } while( u8g.nextPage() ); } void draw(void) { u8g.setFont(u8g_font_courR24n); u8g.setPrintPos(15, 22); u8g.print(dimmer); }
Последний раз редактировалось Kevin; 07.03.2018 в 01:44.
выложи весь код посмотрю где ошибка
Хотя врятли поможет, нужно смотреть на саму либу
Скорее всего i2c при транзакции запрещает все прерывания
Последний раз редактировалось Chip; 07.03.2018 в 01:49.
Бардачина в коде - экспериментировал
PHP код:
#include "U8glib.h"
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include "rus6x12.h"
#define PAGE_HEIGHT HEIGHT
// Выводы ЭНКОДЕРА
#define CLK 3 // Clock Подключаем к INT1, нельзя переназначать
#define DT 4 // второй вывод энкодера
#define SW 5 // switch кнопка энкодера
#define ZD 2 // zero detection детектор ноля
#define GT 6 // Gate Triac управление симистором
#define Min 0 // минимальное значение диммера для устранения мерцания
#define Max 255 //максимальное значение диммера для устранения мерцания
volatile uint8_t tic, dimmer=0;
boolean DT_last; // последнее состояние энкодера
//===========================================================
U8GLIB_SSD1306_128X64 u8g(A4, /* data=*/ A3, /* cs=*/ A0, /* dc=*/ A1, /* reset=*/ A2); // наш дисплей ||
//===========================================================
int motorPin = 3;
int motorSpeed = 75; // Изначальная скорость двигателя
int fanPower = 155; // Изначальная мощность фена
int selectMode = 1; // Что изменять, скорость или мощность фена
void draw(void) {
u8g.setFont(u8g_font_courR24n);// мой тонкие цифры
u8g.setPrintPos(15, 22);
u8g.print(dimmer);
u8g.setPrintPos(15, 64);
u8g.print(motorSpeed);
if(selectMode == 1)
{
u8g.setPrintPos(78, 23);
u8g.print(".");
}
else
{
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(dimmer);
u8g.setPrintPos(95, 64);
u8g.print(motorSpeed);
// ===================================
u8g.setPrintPos(-2, 70);
u8g.setFont(u8g_font_ncenR24);
u8g.print("*");
// ===================================
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()
{
pinMode(CLK,INPUT_PULLUP); // Clock Подключаем к INT1, нельзя переназначать
pinMode(DT, INPUT_PULLUP); // второй вывод энкодера
pinMode(SW, INPUT_PULLUP); // кнопка энкодера
pinMode(ZD, INPUT); // детектор нуля
pinMode(GT, OUTPUT); // управление симистором
digitalWrite(GT, 0); // отключить симмистор
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания int0 на низкий уровень
attachInterrupt(1, encoderTick, CHANGE); // прерывания от Энкодера
StartTimer1(halfcycle, 40); // время для одного разряда ШИМ в мкс
StopTimer1(); //остановить таймер
DT_last = digitalRead(CLK); // считываем положение CLK
// Serial.begin(115200); // для отладки
//Serial.begin( 9600 );
TCCR2B = TCCR2B & 0b11111000 | 7;
pinMode(motorPin, OUTPUT);
//======================
u8g.firstPage();
do {
u8g.drawBitmapP(0, 0, 16, 64, Logo);
} while( u8g.nextPage() );
delay (4000);
//======================
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
//======================
}
//********************обработчики прерываний*******************************
void halfcycle() //прерывания таймера
{
tic++; //счетчик
if( dimmer < tic ) digitalWrite(GT, HIGH); //управляем выходом на симистор
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic=0; //обнулить счетчик
ResumeTimer1(); //запустить таймер
attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
StopTimer1(); //остановить таймер
digitalWrite(GT, LOW); //логический ноль на выход
tic=0; //обнулить счетчик
attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
//**************************************** *********************************
void encoderTick() // Обратка прерываний от Энкодера
{
uint8_t DT_now = digitalRead(CLK); // считываем текущее положение CLK
if (DT_now != DT_last) // если предыдущее и текущее положение CLK не равны, значит был поворот
{
if (digitalRead(DT) != DT_now) // если DT не равен CLK, значит вращение по часовой стрелке
{
if( dimmer < Max )
// dimmer++; // прибавить яркость
//======================
if (selectMode == 0)
{
motorSpeed += 5; // Прибавляем скорость
if ( motorSpeed > 255 )
motorSpeed = 255;
}
else
{
dimmer++;
// fanPower -= 5; // Прибавляем мощность фена
// if ( fanPower < 0)
// fanPower = 0;
}
//======================
/* u8g.firstPage();
do {
draw();
}
while( u8g.nextPage() );*/
//======================
} else
//====================== ===================== ===================== ===================== =====================
{ // если DT равен CLK, значит вращение против часовой
if( dimmer > Min )
// dimmer--; // убавить яркость
//======================
if (selectMode == 0)
{
motorSpeed -= 5; // Убавляем скорость
if ( motorSpeed < 75 )
motorSpeed = 75;
}
else
{
dimmer--;
// fanPower += 5; // Убавляем мощность фена
// if ( fanPower > 255)
// fanPower = 255;
}
//======================
/* u8g.firstPage();
do {
draw();
}
while( u8g.nextPage() );*/
//======================
}
}
DT_last = DT_now; // сохранить положение CLK для следующей проверки
}
void loop()
{
u8g.firstPage();
do {
draw();
}
while( u8g.nextPage() );
// Serial.println(dimmer);
// delay(100);
}
А для чего вот этот цикл?
Я думаю что нужно скорость цикла уменьшить, поставить там delay(500) после drawdo {
draw();
}
while( u8g.nextPage() );
Последний раз редактировалось Chip; 07.03.2018 в 02:01.
Это обновление/вывод инфы на дисплей. Без него не работает. Вот пример из либы
PHP код:
void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_unifont);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 0, 22, "Hello World!");
}
void setup(void) {
// flip screen, if required
// u8g.setRot180();
// set SPI backup if required
//u8g.setHardwareBackup(u8g_backup_avr_spi);
// assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
}
void loop(void) {
// picture loop
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
// rebuild the picture after some delay
delay(500);
}
Частота мерцания меняется. Пробовал 100 и 500. В принципе для фена это наверно не будет критично.
Для фена точно не будет критично
Ну тогда и забуду про это. Проверял мультиметром - максимум на 1 вольт скачет напруга. Кстати - опять резюк 510 дыманул, хотя и спарил 2 по 0.25w
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)