Разработка фена для пайки на Arduino

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#11 Дим » 3 марта 2018, 12:17

Попробовав ещё раз u8glib библиотеку, всё заработало нормально. Всё, теперь точно остановился на ней и в дальнейшей разработке буду использовать её.
КОД

Код: Выделить всё

#include "U8glib.h"
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <Encoder.h>
#define PIN_ENCODER_CLK 8
#define PIN_ENCODER_DT 9
#define PIN_ENCODER_SW 7
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);
//===========================================================
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;                    // Что изменять, скорость или мощность фена
int accel = 1;
int i = 0;
long oldPosition = 0;
volatile uint8_t tic, Dimmer1;
// =================================== Кнопка энкодера   =====================
bool     button_state      = false;
bool     button_auto_state = false;
uint32_t ms_button         = 0;
uint32_t ms_auto_click     = 0;
// =================================== Кнопка энкодера   =====================
void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
  u8g.setFont(u8g_font_ncenR24);
  u8g.setPrintPos(0, 30);
  u8g.print(fanPower7);
}
void setup()
{
  //Serial.begin( 9600 );
  TCCR2B = TCCR2B & 0b11111000 | 7;
  pinMode(motorPin, OUTPUT);
  D4_Out;  //Настраиваем порты на выход
  D4_Low;  //установить на выходах низкий уровень сигнала
  D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
  pinMode(PIN_ENCODER_SW, INPUT_PULLUP); // =================================== Кнопка энкодера
  attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
  StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
  StopTimer1(); //остановить таймер
}
//********************обработчик и прерываний******************** ***********
void halfcycle() //прерывания таймера
{
  tic++; //счетчик
  if(Dimmer1 < 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); //перепрограммировать прерывание на другой обработчик
}
//**************************************** *********************************
void loop()
{
// =================================== Кнопка энкодера   =====================
  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 == 0)
    {
      selectMode = 1;  
//      Serial.println("Press key");
    }
    else
    
{
      selectMode = 0;
    }
  }
  if( pin_state  == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ) // После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия  
  {
    button_auto_state = true;
    ms_auto_click     = ms;
//    Serial.println("Auto press key");    
  }  
  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");
  }
// =================================== Кнопка энкодера   =====================   
  analogWrite(motorPin, motorSpeed);  // Устанавливаем первоначальную скорость
//=== ручка энкодера/регулироака
  long newPosition = myEnc.read() / accel;    
  if 
(newPosition > oldPosition) 
  
{ 
    if 
(selectMode == 0)  
    
{  
      motorSpeed 
+= 5;                  // Прибавляем скорость
      if ( motorSpeed > 255 )
      motorSpeed = 255;
    }
    else
    
{
      fanPower -= 5;                   // Прибавляем мощность фена
      if ( fanPower < 0)
      fanPower = 0;

  u8g.firstPage();  
  do 
{
      draw();
  } while( u8g.nextPage() );
      
    
}
  }
  else
  if 
(newPosition < oldPosition)
  {
    if (selectMode == 0)  
    
{       
      motorSpeed 
-= 5;                  // Убавляем скорость
      if ( motorSpeed < 75 )
      motorSpeed = 75;
    }
    else
    
{
      fanPower += 5;                   // Убавляем мощность фена
      if ( fanPower > 255)
      fanPower = 255;

  u8g.firstPage();  
  do 
{
      draw();
  } while( u8g.nextPage() );
      
    
}
  } 
  if 
( newPosition != oldPosition)
  {
    i = (+ 1)%16;
    oldPosition = newPosition;
    analogWrite( motorPin, motorSpeed );
    Dimmer1= fanPower;
//    Serial.println(motorSpeed);
  } 
}
[center]i love you [s]mxIni[/s] Mysql[/center]


Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#12 Дим » 4 марта 2018, 19:41

На данный момент сделал простую "морду" контроллера с соответствующим функционалом. При нажатии на вал энкодера, выбираем режим - или регулировка мощности фена или обороты куллера. Об этом сигнализирует точка перед установленными значениями. В общем то теперь нужна ручка для продолжения сборки и дописывания кода.
Сделал заставку при старте контроллера. Оставлю пока здесь, а то в коде мешается. Хотя и не занимает много памяти.
Logo DimFen.bmp
Logo DimFen
Logo DimFen.bmp (9.05 КБ) 3053 просмотра

Картинки
Logo DimFen.JPG
Logo DimFen
Logo DimFen.JPG (416.8 КБ) 3053 просмотра

Экран контроллера паяльного фена.JPG
Экран контроллера паяльного фена
Экран контроллера паяльного фена.JPG (416.82 КБ) 3053 просмотра
Код

Код: Выделить всё

const uint8_t Logo[]U8G_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xC4,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x22,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x22,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x22,
0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x82,
0xFF, 0xFC, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x42, 0x42,
0x3E, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x42, 0x22,
0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x27, 0x74,
0x1E, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x10, 0x08,
0x1E, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x10,
0x1E, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0,
0x1E, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00,
0x1E, 0x00, 0x38, 0xFC, 0x3F, 0x3E, 0x0F, 0x80, 0x1E, 0x04, 0x00, 0xFC, 0x0F, 0x9F, 0x80, 0x00,
0x1E, 0x00, 0x38, 0x1C, 0x07, 0x43, 0x31, 0xC0, 0x1E, 0x04, 0x01, 0x02, 0x03, 0xA1, 0xC0, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x81, 0xC0, 0xE0, 0x1E, 0x0C, 0x02, 0x03, 0x81, 0xC0, 0xC0, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1F, 0xFC, 0x06, 0x01, 0x81, 0x80, 0x40, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1F, 0xFC, 0x06, 0x01, 0x81, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x0C, 0x0E, 0x01, 0x81, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x04, 0x0F, 0xFF, 0xC1, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x38, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x04, 0x0E, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x38, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x30, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x30, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x06, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x60, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x06, 0x00, 0xC1, 0x80, 0x60, 0x00,
0x1E, 0x00, 0xC0, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x06, 0x00, 0xC1, 0x80, 0x60, 0x00,
0x1E, 0x01, 0x00, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x03, 0x81, 0x81, 0x80, 0x60, 0x00,
0x3E, 0x06, 0x00, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3F, 0x00, 0x01, 0xFF, 0x03, 0xC0, 0xF0, 0x00,
0xFF, 0xF8, 0x00, 0x7F, 0x1F, 0xCF, 0xFB, 0xFC, 0xFF, 0xC0, 0x00, 0x7C, 0x0F, 0xF3, 0xFC, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
  //======================
    u8g.firstPage();  
    do 
{
  u8g.drawBitmapP(0, 0, 16, 64, Logo);
    } while( u8g.nextPage() );
  delay (4000);
  //======================  
 
Весь код

Код: Выделить всё

#include "U8glib.h"
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <Encoder.h>
#include "rus6x12.h"

const uint8_t Logo[]U8G_PROGMEM = {
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x070xE0,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x080x10,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x100x08,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x270xC4,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x420x22,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x420x22,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x420x22,
0x000x000x000x1C0x000x000x000x000x000x000x000x000x000x000x430x82,
0xFF0xFC0x000x1C0x000x000x000x000xFF0xFF0xC00x000x000x000x420x42,
0x3E0x060x000x1C0x000x000x000x000x3E0x010xC00x000x000x000x420x22,
0x1E0x010x800x000x000x000x000x000x1E0x000xC00x000x000x000x270x74,
0x1E0x000xC00x000x000x000x000x000x1E0x000xC00x000x000x000x100x08,
0x1E0x000x600x000x000x000x000x000x1E0x000x400x000x000x000x080x10,
0x1E0x000x700x000x000x000x000x000x1E0x000x000x000x000x000x070xE0,
0x1E0x000x300x000x000x000x000x000x1E0x000x000x780x000x000x000x00,
0x1E0x000x380xFC0x3F0x3E0x0F0x800x1E0x040x000xFC0x0F0x9F0x800x00,
0x1E0x000x380x1C0x070x430x310xC00x1E0x040x010x020x030xA10xC00x00,
0x1E0x000x3C0x1C0x070x810xC00xE00x1E0x0C0x020x030x810xC00xC00x00,
0x1E0x000x3C0x1C0x070x010xC00x700x1F0xFC0x060x010x810x800x400x00,
0x1E0x000x3C0x1C0x070x010xC00x700x1F0xFC0x060x010x810x800x600x00,
0x1E0x000x3C0x1C0x070x010xC00x700x1E0x0C0x0E0x010x810x800x600x00,
0x1E0x000x3C0x1C0x070x010xC00x700x1E0x040x0F0xFF0xC10x800x600x00,
0x1E0x000x380x1C0x070x010xC00x700x1E0x040x0E0x000x010x800x600x00,
0x1E0x000x380x1C0x070x010xC00x700x1E0x000x0E0x000x010x800x600x00,
0x1E0x000x300x1C0x070x010xC00x700x1E0x000x0E0x000x010x800x600x00,
0x1E0x000x300x1C0x070x010xC00x700x1E0x000x060x000x010x800x600x00,
0x1E0x000x600x1C0x070x010xC00x700x1E0x000x060x000xC10x800x600x00,
0x1E0x000xC00x1C0x070x010xC00x700x1E0x000x060x000xC10x800x600x00,
0x1E0x010x000x1C0x070x010xC00x700x1E0x000x030x810x810x800x600x00,
0x3E0x060x000x3E0x0F0x830xE00xF80x3F0x000x010xFF0x030xC00xF00x00,
0xFF0xF80x000x7F0x1F0xCF0xFB0xFC0xFF0xC00x000x7C0x0F0xF30xFC0x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00,
0x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x00
};

const 
uint8_t Termometr[]U8G_PROGMEM = {
0x180x240x420x420x420x420x420x420x420x620x620x720x720x7A0x7A0x7E,
0x7E0x7E0xFF0x9F0x9F0xFF0x7E0x18
};

const 
uint8_t Cooler[]U8G_PROGMEM = {
0x010x800x010x800x010x800x310x9C0x390x9C0x1F0xF80x070xE00x070xC0,
0x1F0xF00x390x9C0x310x9C0x010x800x010x800x010x80
};

#define PIN_ENCODER_CLK 8
#define PIN_ENCODER_DT 9
#define PIN_ENCODER_SW 10
Encoder myEnc(PIN_ENCODER_DTPIN_ENCODER_CLK);
//===========================================================
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;                    // Что изменять, скорость или мощность фена
int accel 1;
int i 0;
long oldPosition 0;
volatile uint8_t ticDimmer1;
// =================================== Кнопка энкодера   =====================
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(1522);
  
u8g.print(fanPower);

  
u8g.setPrintPos(1564);
  
u8g.print(motorSpeed);
  
  if(
selectMode == 1)
  {  
  
u8g.setPrintPos(7823);
  
u8g.print(".");
  }
  else
  {
  
u8g.setPrintPos(7859);
  
u8g.print(".");
  }
// =================================== 
  
u8g.setPrintPos(816);
  
u8g.setFont(rus6x12);
  
u8g.print("температура");

  
u8g.setPrintPos(8443);
  
u8g.print("обороты");
// =================================== 
  
u8g.setFont(u8g_font_courR14r);
  
u8g.setPrintPos(9527);
  
u8g.print(fanPower);

  
u8g.setPrintPos(9564);
  
u8g.print(motorSpeed);
  
// =================================== 
 // u8g.setPrintPos(-2, 70);

//  u8g.setFont(u8g_font_ncenR24);
 // u8g.print("*");
  
// =================================== 
  
u8g.drawLine(7707764); // Вертикальная линия
  
u8g.drawLine(803212832); // Горизонтальная короткая линия

  
u8g.drawBitmapP(00124Termometr);
  
u8g.drawBitmapP(-247214Cooler);
}
void setup()
{
  
//Serial.begin( 9600 );
  
TCCR2B TCCR2B 0b11111000 7;
  
pinMode(motorPinOUTPUT);
  
D4_Out;  //Настраиваем порты на выход
  
D4_Low;  //установить на выходах низкий уровень сигнала
  
D2_In//настраиваем порт на вход для отслеживания прохождения сигнала через ноль
  
pinMode(PIN_ENCODER_SWINPUT_PULLUP); // =================================== Кнопка энкодера
  
attachInterrupt(0detect_upLOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
  
StartTimer1(halfcycle40); //время для одного разряда ШИМ
  
StopTimer1(); //остановить таймер
  //======================
    
u8g.firstPage();  
    do {
  
u8g.drawBitmapP(001664Logo);
    } while( 
u8g.nextPage() );
  
delay (4000);
  
//======================  
    
u8g.firstPage();  
    do {
        
draw();
    } while( 
u8g.nextPage() );
  
//====================== 
}
//********************обработчик и прерываний******************** ***********
void halfcycle() //прерывания таймера
{
  
tic++; //счетчик
  
if(Dimmer1 tic D4_High//управляем выходом
}

void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
  
tic=0//обнулить счетчик
  
ResumeTimer1(); //запустить таймер
  
attachInterrupt(0detect_downHIGH); //перепрограммировать прерывание на другой обработчик
}

void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
  
StopTimer1(); //остановить таймер
  
D4_Low//логический ноль на выходы
  
tic=0//обнулить счетчик
  
attachInterrupt(0detect_upLOW); //перепрограммировать прерывание на другой обработчик
}
//**************************************** *********************************
void loop()
{
// =================================== Кнопка энкодера   =====================
  
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 == 0)
    {
      
selectMode 1;  
//      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;
//    Serial.println("Auto press key");    
  
}  
  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");
  }
// =================================== Кнопка энкодера   =====================   
  
analogWrite(motorPinmotorSpeed);  // Устанавливаем первоначальную скорость
//=== ручка энкодера/регулироака
  
long newPosition myEnc.read() / accel;    
  if (
newPosition oldPosition
  { 
    if (
selectMode == 0)  
    {  
      
motorSpeed += 5;                  // Прибавляем скорость
      
if ( motorSpeed 255 )
      
motorSpeed 255;
    }
    else
    {
      
fanPower -= 5;                   // Прибавляем мощность фена
      
if ( fanPower 0)
      
fanPower 0;     
    }
//======================
  
u8g.firstPage();  
  do {
      
draw();
  } while( 
u8g.nextPage() );
//====================== 
  
}
  else
  if (
newPosition oldPosition)
  {
    if (
selectMode == 0)  
    {       
      
motorSpeed -= 5;                  // Убавляем скорость
      
if ( motorSpeed 75 )
      
motorSpeed 75;
    }
    else
    {
      
fanPower += 5;                   // Убавляем мощность фена
      
if ( fanPower 255)
      
fanPower 255;   
    }
//======================
  
u8g.firstPage();  
  do {
      
draw();
  } while( 
u8g.nextPage() );
//====================== 
  

  if ( 
newPosition != oldPosition)
  {
    
= (1)%16;
    
oldPosition newPosition;
    
analogWritemotorPinmotorSpeed );
    
Dimmer1fanPower;
//    Serial.println(motorSpeed);



  

}  
[center]i love you [s]mxIni[/s] Mysql[/center]

aidar_i
Аватара
aidar_i
Сообщения: 1
Зарегистрирован: 27 февраля 2018
С нами: 6 лет 1 месяц

#13 aidar_i » 5 марта 2018, 13:09

Тоже заказал ручку фена, хочу собрать по Вашим наработкам.

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#14 Дим » 5 марта 2018, 16:31

aidar_i писал(а):Тоже заказал ручку фена, хочу собрать по Вашим наработкам.
Пока не советую применять мои наработки. Так как всё очень "сырое" и не опробованное в полную меру.
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#15 Дим » 12 марта 2018, 23:25

При содействии Chipа обновил обработчик энкодера и сделано сохранение в EEPROM установленной мощности фена и скорости турбины. Также добавлена обработка кнопок Arduino. Уменьшил размер лого и ещё что то делал уже и не припомню, в общем как всегда оставляю код тут, и жду ручку фена.
КОД

Код: Выделить всё

#include "U8glib.h"
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include "rus6x12.h"

const uint8_t Logo[]U8G_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xC4,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x22,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x22,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x22,
0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x82,
0xFF, 0xFC, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x42, 0x42,
0x3E, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x42, 0x22,
0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x27, 0x74,
0x1E, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x10, 0x08,
0x1E, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x10,
0x1E, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0,
0x1E, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00,
0x1E, 0x00, 0x38, 0xFC, 0x3F, 0x3E, 0x0F, 0x80, 0x1E, 0x04, 0x00, 0xFC, 0x0F, 0x9F, 0x80, 0x00,
0x1E, 0x00, 0x38, 0x1C, 0x07, 0x43, 0x31, 0xC0, 0x1E, 0x04, 0x01, 0x02, 0x03, 0xA1, 0xC0, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x81, 0xC0, 0xE0, 0x1E, 0x0C, 0x02, 0x03, 0x81, 0xC0, 0xC0, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1F, 0xFC, 0x06, 0x01, 0x81, 0x80, 0x40, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1F, 0xFC, 0x06, 0x01, 0x81, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x0C, 0x0E, 0x01, 0x81, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x3C, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x04, 0x0F, 0xFF, 0xC1, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x38, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x04, 0x0E, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x38, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x30, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x30, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x06, 0x00, 0x01, 0x80, 0x60, 0x00,
0x1E, 0x00, 0x60, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x06, 0x00, 0xC1, 0x80, 0x60, 0x00,
0x1E, 0x00, 0xC0, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x06, 0x00, 0xC1, 0x80, 0x60, 0x00,
0x1E, 0x01, 0x00, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x00, 0x03, 0x81, 0x81, 0x80, 0x60, 0x00,
0x3E, 0x06, 0x00, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3F, 0x00, 0x01, 0xFF, 0x03, 0xC0, 0xF0, 0x00,
0xFF, 0xF8, 0x00, 0x7F, 0x1F, 0xCF, 0xFB, 0xFC, 0xFF, 0xC0, 0x00, 0x7C, 0x0F, 0xF3, 0xFC, 0x00
};

const uint8_t Termometr[]U8G_PROGMEM = {
0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x62, 0x62, 0x72, 0x72, 0x7A, 0x7A, 0x7E,
0x7E, 0x7E, 0xFF, 0x9F, 0x9F, 0xFF, 0x7E, 0x18, 
};
/*
const uint8_t Cooler[]U8G_PROGMEM = {
0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x31, 0x9C, 0x39, 0x9C, 0x1F, 0xF8, 0x07, 0xE0, 0x07, 0xC0,
0x1F, 0xF0, 0x39, 0x9C, 0x31, 0x9C, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 
};*/

// Выводы ЭНКОДЕРА
#define CLK 3  // Clock Подключаем к INT1, нельзя переназначать
#define DT 4  // второй вывод энкодера
// =================================== Кнопка энкодера  START =====================
#define SW 5                   // switch кнопка энкодера
bool     button_state      = false;
bool     button_auto_state = false;
uint32_t ms_button         = 0;
uint32_t ms_auto_click     = 0;
// =================================== Кнопка энкодера END  =====================
#define ZD 2                   // zero detection детектор ноля
#define GT 6                   // Gate Triac управление симистором
#define MinDim 0               // минимальное значение диммера для устранения мерцания
#define MaxDim 190             //максимальное значение диммера для устранения мерцания
#define MinSpeed 0            // минимальное значение температуры
#define MaxSpeed 100            //максимальное значение температуры
int MinTemp = 100;            // минимальное значение температуры
int MaxTemp = 480;            //максимальное значение температуры

volatile uint8_t tic, SetSpeed, dimmer;
boolean DT_last; // последнее состояние энкодера
//===========================================================
U8GLIB_SSD1306_128X64 u8g(A4, /* data=*/ A3, /* cs=*/ A0, /* dc=*/ A1, /* reset=*/ A2); // наш дисплей  ||
//===========================================================
int SetPower;
int motorPin = 11;
int motorSpeed = SetSpeed;                   // Изначальная скорость двигателя (установленная)
//int dimmer = SetPower/2;                     // Изначальная мощность фена (установленная)
int selectMode = 0;                          // Что изменять, скорость или мощность фена

void draw(void) {
  u8g.setFont(u8g_font_courR24n);            // тонкие цифры
  u8g.setPrintPos(15, 22);
  u8g.print(dimmer);

  u8g.setPrintPos(15, 64);
  u8g.print(motorSpeed);

  u8g.setPrintPos(-2, 70);
  u8g.print("*");
   
  if
(selectMode == 1 && (millis() & 512))
  {  
  u8g
.setPrintPos(78, 23);
  u8g.print(".");
  }
  if(selectMode == 2 && (millis() & 512))
  {
  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()
{
  Serial.begin(9600);                       // для отладки
  TCCR2B = TCCR2B & 0b11111000 | 7;
  pinMode(motorPin, OUTPUT);
  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();                             // остановить таймер
  
  SetPower
=ReadEEPROM_Word(0);              // Прочитать из EEPROM с адреса 0 значение типа Word
  SetSpeed = ReadEEPROM_Byte(2);            // Прочитать из EEPROM с адреса 2 значение типа Byte
  
  DT_last 
= digitalRead(CLK);               // считываем положение CLK
  //======================
    u8g.firstPage();  
    do 
{
  u8g.drawBitmapP(0, 12, 16, 31, Logo);    //0 - отступ слева, 12 - от верха, 16*8 ширина картинки, 31 - высота
    } 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
( SetPower < MaxTemp && selectMode == 1)
      SetPower += 2;                    // устанавливаем мощность    
      if( SetSpeed < MaxSpeed  && selectMode == 2)
      SetSpeed ++;                    // устанавливаем скорость
    } 
    else 
    
{                          // если DT равен CLK, значит вращение против часовой
      if( SetPower > MinTemp  && selectMode == 1)           
      SetPower 
-= 2; // устанавливаем мощность          
      if( SetSpeed > MinSpeed  && selectMode == 2)           
      SetSpeed 
--; // устанавливаем скорость  
    }
  }         
  DT_last 
= DT_now;                   // сохранить положение CLK для следующей проверки
}


void loop()
{
// =================================== Кнопка энкодера  START =====================
  uint32_t ms    = millis();
  bool pin_state = digitalRead(SW);
// Фиксируем нажатие кнопки   
  if( pin_state  == LOW && !button_state && ( ms - ms_button ) > 50 )
  {
    button_state      = true;
    button_auto_state = false;  
    ms_button         
= ms;
    Serial.println("Press key");
    if(selectMode == 1)
    {
      selectMode = 2;  
      WriteEEPROM_Word
(0, SetPower);   //записать устанавленную мощность
    }
    else
    
{
      selectMode = 0;
      WriteEEPROM_Byte(2, SetSpeed); //записать устанавленную скорость
    }
  }
// После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия  
   if( pin_state  == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ){
      button_auto_state = true;
      ms_auto_click     = ms;
      Serial.println("Auto press key");  
      if
(selectMode == 0)
      {
        selectMode = 1;  
      
}  
   
}
// Фиксируем отпускание кнопки   
   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");
   }
// =================================== Кнопка энкодера END  =====================
  //======================  
    u8g.firstPage();  
    do 
{
        draw();
    } while( u8g.nextPage() );
  //====================== 
}
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#16 Дим » 30 марта 2018, 18:16

Пришла ручка фена, разобрал её для определения что куда подключать. У меня получилась вот такая схема.

1.Чёрный - нагреватель
2. Красный - нагреватель
3. Зелёный - масса
4. Синий - минус вентилятора
5. Коричневый - плюс вентилятора
6. Желтый — геркон
7. Белый - минус термопара
8. Оранжевый - плюс термопара

И картинка:

ручка фен схема подключения.png
ручка фен схема подключения
ручка фен схема подключения.png (1.08 МБ) 2959 просмотров
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#17 Дим » 2 апреля 2018, 10:41

Подключая турбину спалил очередной модуль драйвера IRF520 MOSFET - закоротил контакты выхода напряжения, и решил использовать что есть под рукой. Для этого спросил совета у Chipа, и из у меня имеющихся транзисторов, он посоветовал c2331. Схема подключения будет такова:

От управляющего пина Ардуины нужно поставить резистор на 120 Om (я поставил 150)

ШИМ c2331.png
ШИМ c2331
ШИМ c2331.png (109.92 КБ) 2938 просмотров
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#18 Дим » 11 апреля 2018, 16:45

Добрался до меня и GX16 разъем. Припаял к нему провода от ручки фена. Схема взята с потолка. Вид со стороны припайки проводов (не соединение с разъёмом).

GX16 разъем.png
GX16 разъем
GX16 разъем.png (33.55 КБ) 2813 просмотров


Итог пайки:

GX16 разъем1.JPG
GX16 разъем
GX16 разъем1.JPG (145.96 КБ) 2813 просмотров


GX16 разъем2.JPG
GX16 разъем
GX16 разъем2.JPG (148.05 КБ) 2813 просмотров
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#19 Дим » 21 апреля 2018, 20:42

Перенося схему на макетную плату пришлось некоторые пины поменять, и почему то перестал работать работать последний скетч. Сейчас постепенно собирая плату - пере собираю скетч. На данный момент проверена работоспособность диммера и ШИМ вентилятора.
Код

Код: Выделить всё

#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <Encoder.h>

#define PIN_ENCODER_CLK 3
#define PIN_ENCODER_DT 5
#define PIN_ENCODER_SW 7
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);

int motorPin = 6;
int motorSpeed = 75;                   // Изначальная скорость двигателя
int fanPower = 115;                    // Изначальная мощность фена
int selectMode = 0;                    // Что изменять, скорость или мощность фена
int accel = 1;
int i = 0;
long oldPosition = 0;
volatile uint8_t tic, Dimmer;
// =================================== Кнопка энкодера   =====================
bool     button_state      = false;
bool     button_auto_state = false;
uint32_t ms_button         = 0;
uint32_t ms_auto_click     = 0;
// =================================== Кнопка энкодера   =====================

void setup()
{
  Dimmer = fanPower;
  //Serial.begin( 9600 );
  TCCR0B = TCCR0B & 0b11111000 | 5;
  pinMode(motorPin, OUTPUT);
  D4_Out;  //Настраиваем порты на выход
  D4_Low;  //установить на выходах низкий уровень сигнала
  D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
  pinMode(PIN_ENCODER_SW, INPUT_PULLUP); // =================================== Кнопка энкодера
  attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
  StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
  StopTimer1(); //остановить таймер
}
//********************обработчик и прерываний******************** ***********
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); //перепрограммировать прерывание на другой обработчик
}
//**************************************** *********************************
void loop()
{
// =================================== Кнопка энкодера   =====================
  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 == 0)
    {
      selectMode = 1;  
//      Serial.println("Press key");
    }
    else
    
{
      selectMode = 0;
    }
  }
  if( pin_state  == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ) // После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия  
  {
    button_auto_state = true;
    ms_auto_click     = ms;
//    Serial.println("Auto press key");    
  }  
  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");
  }
// =================================== Кнопка энкодера   =====================   
  analogWrite(motorPin, motorSpeed);  // Устанавливаем первоначальную скорость
//=== ручка энкодера/регулироака
  long newPosition = myEnc.read() / accel;    
  if 
(newPosition > oldPosition) 
  
{ 
    if 
(selectMode == 0)  
    
{  
      motorSpeed 
+= 5;                  // Прибавляем скорость
      if ( motorSpeed > 255 )
      motorSpeed = 255;
    }
    else
    
{
      fanPower -= 5;                   // Прибавляем мощность фена
      if ( fanPower < 0)
      fanPower = 0;     
    
}
  }
  else
  if 
(newPosition < oldPosition)
  {
    if (selectMode == 0)  
    
{       
      motorSpeed 
-= 5;                  // Убавляем скорость
      if ( motorSpeed < 75 )
      motorSpeed = 75;
    }
    else
    
{
      fanPower += 5;                   // Убавляем мощность фена
      if ( fanPower > 255)
      fanPower = 255;   
    
}
  } 
  if 
( newPosition != oldPosition)
  {
    i = (+ 1)%16;
    oldPosition = newPosition;
    analogWrite( motorPin, motorSpeed );
    Dimmer = fanPower;
//    Serial.println(motorSpeed);



  } 
  Dimmer 
= fanPower;
}

Перенос схемы на макетную плату.JPG
Перенос схемы на макетную плату
Перенос схемы на макетную плату.JPG (159.74 КБ) 2771 просмотр
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#20 Дим » 22 апреля 2018, 16:48

Установил на отдельную плату энкодер. Далее на неё же установлю экран.

плата с энкодером 1.JPG
плата с энкодером
плата с энкодером 1.JPG (200.48 КБ) 2765 просмотров


Спойлер

Код: Выделить всё

#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <Encoder.h>

#define PIN_ENCODER_CLK 3
#define PIN_ENCODER_DT 5
#define PIN_ENCODER_SW 7
Encoder myEnc(PIN_ENCODER_DT, PIN_ENCODER_CLK);

int motorPin = 6;
int motorSpeed = 75;                   // Изначальная скорость двигателя
int fanPower = 115;                    // Изначальная мощность фена
int selectMode = 0;                    // Что изменять, скорость или мощность фена
int accel = 1;
int i = 0;
long oldPosition = 0;
volatile uint8_t tic, Dimmer;
// =================================== Кнопка энкодера   =====================
bool     button_state      = false;
bool     button_auto_state = false;
uint32_t ms_button         = 0;
uint32_t ms_auto_click     = 0;
// =================================== Кнопка энкодера   =====================

void setup()
{
  Dimmer = fanPower;
  Serial.begin( 9600 );
  TCCR0B = TCCR0B & 0b11111000 | 5;
  pinMode(motorPin, OUTPUT);
  pinMode(PIN_ENCODER_SW, INPUT_PULLUP); //  Кнопка энкодера
  D4_Out;  //Настраиваем порты на выход
  D4_Low;  //установить на выходах низкий уровень сигнала
  D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
  attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
  StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
  StopTimer1(); //остановить таймер
}
//********************обработчик и прерываний******************** ***********
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); //перепрограммировать прерывание на другой обработчик
}
//**************************************** *********************************
void loop()
{
// =================================== Кнопка энкодера   =====================
  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 == 0)
    {
      selectMode = 1;  
      Serial
.println("Press key");
    }
    else
    
{
      selectMode = 0;
    }
  }
  if( pin_state  == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ) // После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия  
  {
    button_auto_state = true;
    ms_auto_click     = ms;
//    Serial.println("Auto press key");    
  }  
  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");
  }
// =================================== Кнопка энкодера   =====================   
  analogWrite(motorPin, motorSpeed);  // Устанавливаем первоначальную скорость
//=== ручка энкодера/регулироака
  long newPosition = myEnc.read() / accel;    
  if 
(newPosition > oldPosition) 
  
{ 
    if 
(selectMode == 0)  
    
{  
      motorSpeed 
+= 1;                  // Прибавляем скорость
      if ( motorSpeed > 255 )
      motorSpeed = 255;
      Serial.println("1 >>>");
    }
    else
    
{
      fanPower -= 1;                   // Прибавляем мощность фена
      if ( fanPower < 0)
      fanPower = 0;   
      Serial
.println("2 >>>");  
    
}
  }
  else
  if 
(newPosition < oldPosition)
  {
    if (selectMode == 0)  
    
{       
      motorSpeed 
-= 1;                  // Убавляем скорость
      if ( motorSpeed < 75 )
      motorSpeed = 75;
      Serial.println("1 <<<");
    }
    else
    
{
      fanPower += 1;                   // Убавляем мощность фена
      if ( fanPower > 255)
      fanPower = 255;   
      Serial
.println("2 <<<");
    }
  } 
  if 
( newPosition != oldPosition)
  {
    i = (+ 1)%16;
    oldPosition = newPosition;
    analogWrite( motorPin, motorSpeed );
    Dimmer = fanPower;
  } 
  Dimmer 
= fanPower;

плата с энкодером.png
плата с энкодером
плата с энкодером.png (121.32 КБ) 2765 просмотров
[center]i love you [s]mxIni[/s] Mysql[/center]


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Прочая электроника»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 6 гостей