не могу програмно настроить пины на лед драйвере АТ1628

alexey3
Offline
Зарегистрирован: 25.11.2017

И вот какой результат если шнур юсб отключить а питание 6 вольт оставить то пашет не сбрасывает, однако если вернуть юсб кабель и оставить питание сброс через 15 секунд, а если в иде включить монитор нету сброса

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

На какие пины подаёте 6 вольт? Если на Vin, то этого мало. Минимум 7,5, а лучше 9. думаю, где-то здесь собака и порылась. А если на +5, то этого соответсвенно много.

alexey3
Offline
Зарегистрирован: 25.11.2017

штекр питания ардуины туда и подал 6 вольт

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexey3 пишет:

штекр питания ардуины туда и подал 6 вольт

Не меньше 7,5, а лучше 9-12

alexey3
Offline
Зарегистрирован: 25.11.2017

9 вольт подал не в етом дело похоже с компа какойто сигнал приходит и обнуляет ардуину хотя и отключил все программы

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Например, перезапуск окна монитора (если его закрыть/открыть) вызывает перезагрузку.

Вы вообще перезагрузку проверили? Поставьте пищалку и проверьте, чтобы убедиться.

alexey3
Offline
Зарегистрирован: 25.11.2017

перезапуск монитора вызывает перезагрузку, а пищалку куда прицепить ?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Пищалку на любой свободный пин (ну, типа с резистором, но это не мне Вас учить). В программно пищание вставить в setup. Тогда всё понятно будет, т.к. setup выполняется один раз сразу после перезугрузки.

alexey3
Offline
Зарегистрирован: 25.11.2017

В общем немного разобрался ,Это компьютер формирует какой то сигнал сброса потому как если выйти из пользователя на панель выбора то сброса не происходит и ето явно не програмный код, извините

alexey3
Offline
Зарегистрирован: 25.11.2017
#include <stdio.h>
//#include <math.h>
static int serial_fputchar(const char ch, FILE *stream) { ((void*)stream); Serial.write(ch); return ch; }
static FILE *serial_stream = fdevopen(serial_fputchar, NULL);
//
//  Подключение пинов
//  разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка:
//    GND 3,3V  CLK DIO STB OUT-IR  5V
//

#define PIN_DIO 9
#define PIN_CLK 8
#define PIN_STB 7 

#define INIT_6x12 2
#define INIT_7x11 3

/////////////////////////////////////////////////////////////
/////////////    ТИПА "библиотека" ДЛЯ TM1668    ////////////
/////////////////////////////////////////////////////////////

//
// при том подключении, что есть
// достаточно 10 байтов на светодиоды и 2 на кнопки
//
#define LED_DATA_LENGTH 14
#define KEY_DATA_LENGTH 5

//
// Маски нажатых кнопок (слева направо)
//
//#define KEY_2_BLUE  0x00001000ul
//#define KEY_1_BLUE  0x00000200ul
//#define KEY_2_RED   0x00020000ul
//#define KEY_1_RED   0x00000010ul
/*
#define KEY_2_BLUE   0x0010000000
#define KEY_1_BLUE   0x0002000000
#define KEY_2_RED    0x0000020000
#define KEY_1_RED    0x1000000000
#define POWER_2  0x0000000010 // LE6
#define POWER_1  0x0000000002 // LE8
*/

//
// Подключено 5 "цифр". 
// 0-ая - это двоеточие, залействовано только два младших бита
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.) 
//
#define LE6 0x0001 // зел справа
#define LE5 0x0020 // красн справа
#define LE7 0x0040 // красн слева
#define LE8 0x0080 // зел. слева

#define SEG_A 0x0001
#define SEG_F 0x0002
#define SEG_B 0x0004
#define SEG_G 0x0008
#define SEG_C 0x0010
#define SEG_DP  0x0020
#define SEG_D 0x0040
#define SEG_E 0x0080


//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#define SYMBOL_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
#define SYMBOL_1 (SEG_B | SEG_C)
#define SYMBOL_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
#define SYMBOL_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
#define SYMBOL_4 (SEG_B | SEG_C | SEG_F | SEG_G)
#define SYMBOL_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
#define SYMBOL_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_7 (SEG_A | SEG_B | SEG_C)
#define SYMBOL_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)

#define SYMBOL_MINUS (SEG_G)
#define SYMBOL_A (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_C (SEG_A | SEG_E | SEG_F | SEG_D)
#define SYMBOL_E (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_H (SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_P (SEG_A | SEG_B | SEG_E | SEG_F | SEG_G)
#define SYMBOL_G (SEG_A | SEG_E | SEG_F)
#define SYMBOL_L (SEG_D | SEG_E | SEG_F)
#define SYMBOL_F (SEG_A | SEG_E | SEG_F | SEG_G)
#define SYMBOL_d (SEG_B | SEG_C | SEG_D | SEG_E | SEG_G)
#define SYMBOL_b (SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_rP (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F)

//
// Глобальные переменные
//
static uint16_t ledGRID[LED_DATA_LENGTH / 2]; // текущее состояние экрана
static uint8_t currentBrightness = 7; // текущая яркость
static uint8_t digits[] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4, SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9 };
//
static uint16_t saveGRID[LED_DATA_LENGTH / 2]; // нужно для сохранения состояния экрана на время теста
static uint8_t saveBrightness;  // нужно для сохранения яркости на время теста
//

//
//  Запись одиночной команды в TM1668
//
void writeSingleCommand(const uint8_t command) {
  digitalWrite(PIN_STB, LOW);
  shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, command);
  digitalWrite(PIN_STB, HIGH);
  delayMicroseconds(1); // Пауза до следующей команды
}

//
//  Запись состояния дисплея в TM1668
//
void updateDisplay(void) {
  writeSingleCommand(0x40);  // запись данных, автоматический адрес
  digitalWrite(PIN_STB, LOW);
  shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0xC0); // Установка адреса в 0
  uint8_t * p = (uint8_t *) ledGRID;
  for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); // запись данных
  digitalWrite(PIN_STB, HIGH);
  delayMicroseconds(1); // Пауза до следующей команды
}

//
//  Чтение состояния кнопок с TM1668
//
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32

void readKeyData(uint8_t * data) {
  digitalWrite(PIN_STB, LOW);
  shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42);  // чтение данных
  pinMode(PIN_DIO, INPUT_PULLUP);
  delayMicroseconds(1);
  byte buffer[KEY_DATA_LENGTH];
  for (int i=0; i<KEY_DATA_LENGTH; i++) {
    buffer[i] = shiftIn(PIN_DIO, PIN_CLK, LSBFIRST);
  }
  pinMode(PIN_DIO, OUTPUT);
  digitalWrite(PIN_STB, HIGH);
  * data = 0;
  if (buffer[1] & 0x10) *data |= KEY_2_BLUE;
  if (buffer[1] & 0x02) *data |= KEY_1_BLUE;
  if (buffer[2] & 0x02) *data |= KEY_2_RED;
  if (buffer[0] & 0x10) *data |= KEY_1_RED;
  if (buffer[4] & 0x10) *data |= POWER_2;
  if (buffer[4] & 0x02) *data |= POWER_1;
}

//
// Установить яркость от 0 (выключено) до 8
// (возвращает старую яркость)
//
static inline uint8_t setBrightness(const uint8_t newBrighness) {
  const uint8_t res = currentBrightness;
  currentBrightness = (newBrighness > 8) ? 8 : newBrighness;
  if (currentBrightness == 0) writeSingleCommand(0x80); // Выключить дисплей
  else writeSingleCommand(0x88 + (currentBrightness - 1)); // Установить яркость
  return res;
}

//
//  Увеличить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t increaseBrightness(void) {
  const uint8_t res = currentBrightness;
  if (currentBrightness < 8) setBrightness(currentBrightness + 1);
  return res;
}

//
//  Уменьшить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t decreaseBrightness(void) {
  const uint8_t res = currentBrightness;
  if (currentBrightness > 0) setBrightness(currentBrightness - 1);
  return res;
}

//
//  Показать тест экрана
// (все символы включены на максимальной яркости)
//
void showTest(void) {
  memcpy(saveGRID, ledGRID, sizeof(saveGRID));
  ledGRID[0] = 3;
  ledGRID[1] = 0xFF;
  ledGRID[2] = 0xFF;
  ledGRID[3] = 0xFF;
  ledGRID[4] = 0xFF;
  updateDisplay();
  saveBrightness = setBrightness(8);
}
//
//  Восстановить экран после теста
//
void hideTest(void) {
  memcpy(ledGRID, saveGRID, sizeof(saveGRID));
  updateDisplay();
  setBrightness(saveBrightness);
}


//
//  Показать цифру value (0-9) в позиции digit (1-4)
// при этом, если у цифры горит дополнительный символ, сохраняем его
//
static inline void setDigit(const int8_t digit, const uint8_t value) {
  if (digit < 0 || digit > 6) return; // цифры у нас с 1-ой по 4-ую слева направо
  ledGRID[digit] = value; // не обижать дополнительный символ, если есть
}

//
//  Показать число m в двух правых цифрах (типа минуты или там секунды)
//
static inline void showMinutes(const int8_t m) {
  setDigit(0, digits[m % 10]);
  setDigit(1, digits[m / 10]);
}

//
//  Показать число h в двух левых цифрах (типа часы или там минуты)
//
static inline void showHours(const int8_t h) {
  setDigit(2, digits[h % 10]);
  setDigit(3, digits[h / 10]);
}


//
//  Показать и часы, и минуты
//
static inline void showClock(const int8_t h, const int8_t m) {
  showHours(h);
  showMinutes(m);
}

#define LEFT_POSITION 3
#define RIGHT_POSITION  0

static inline void showNumber(const int8_t where, int num) {
  for (uint8_t i = where; i < where + 3; i++) {
    if (num == 0) {
      setDigit(i, i == where ? SYMBOL_0 : 0);
    } else {
      setDigit(i, digits[num % 10]);
      num  /= 10;
    }
  }
}

/////////////////////////////////////////////////////////////
////////////    КОНЕЦ "библиотеки" ДЛЯ TM1668    ////////////
/////////////////////////////////////////////////////////////

static int l = 20, r = 000;

#include <math.h>


int encoder = 127;
int payaln = 378;
int sting_tmp;
int fadeAmount = 1;
byte Sens_A1 = A1;
byte sting = 13;        
unsigned long currentTime;
unsigned long loopTime;
unsigned long timing;
const int enc_pin_A = 3;       
const int enc_pin_B = 2;      
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

void setup(void) {
  stdout = serial_stream; // эта строка первая в setup
  Serial.begin(115200);
  //
  // Инициализация пинов
  pinMode(PIN_CLK, OUTPUT);
  pinMode(PIN_DIO, OUTPUT);
  pinMode(PIN_STB, OUTPUT);
  pinMode(A0, INPUT_PULLUP);      //сенсор стола
  pinMode(Sens_A1, INPUT_PULLUP); //сенсор паяльника
  pinMode(sting, OUTPUT);
  digitalWrite(PIN_STB, HIGH);
  digitalWrite(PIN_CLK, HIGH);

  //
  // Инициализация экрана
  writeSingleCommand(INIT_7x11); // Режим отображения (1 и 2 - ничего не меняется)
  setBrightness(currentBrightness);
  //
//  // Пишем на экране слово ПОПА
//  setDigit(3, SYMBOL_rP);
//  setDigit(2, SYMBOL_0);
//  setDigit(1, SYMBOL_rP);
//  setDigit(0, SYMBOL_A);
//  updateDisplay();
//  //
//  // Даём 5 секунд полюбоваться
//  delay(1000);
//  //
//  // Рисуем нулевое время
//  showClock(0, 0);
//  updateDisplay();
//
  showNumber(LEFT_POSITION, l);
  showNumber(RIGHT_POSITION, r);
  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 0);
//  showNumber(RIGHT_POSITION, 3);
//  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 21);
//  showNumber(RIGHT_POSITION, 1);
//  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 666);
//  showNumber(RIGHT_POSITION, 321);
//  updateDisplay();
//  delay(5000);
//  
//  printf("Press key\n");

// Настрийки для энкодера

pinMode(enc_pin_A, INPUT_PULLUP);
pinMode(enc_pin_B, INPUT_PULLUP);
currentTime = millis();
loopTime = currentTime;

}

void loop(void) {
  
  uint8_t newKeys;
  readKeyData(& newKeys);
  
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32

  if (millis() - timing > 75){
    
  if (newKeys & KEY_1_BLUE) {
    if (l < 480) l++;
  }
  if (newKeys & KEY_1_RED) {
    if (l > 20) l--;
  }
  if (newKeys & KEY_2_BLUE) {
    if (r < 999) r++;
  }
  if (newKeys & KEY_2_RED) {
    if (r > 0) r--;
  }
  

  timing = millis();
}

  ENCODER(); //процедура опроса энкодера

  if (newKeys == 0x00000020){
    STING();   //процедура нагрева паяльника
   }
  if (newKeys == 0x00000030){
    STING();   //процедура нагрева паяльника
//  FEN();     //процедура нагрева фена
   }
  if (newKeys == 0x00000000){
    payaln = 378;
    l = 20;
   }
  if (newKeys == 0x00000010){
    payaln = 378;
    l = 20;
   }

  showNumber(LEFT_POSITION, l);
  showNumber(RIGHT_POSITION, encoder);   //r

  
//#define POWER_2  0x0000000010 // LE6
//#define POWER_1  0x0000000002 // LE8
  
 if (newKeys & POWER_2) setDigit(6, ledGRID[6] | LE6);
 else {
  setDigit(6, ledGRID[6] & ~LE6);
  setDigit(0, 0);
  setDigit(1, 0);
  setDigit(2, 0);
 }
  
  if (newKeys & POWER_1)
  setDigit(6, ledGRID[6] | LE8); //
  
  else
 {
  setDigit(6, ledGRID[6] & ~LE6);
  setDigit(3, 0);
  setDigit(4, 0);
  setDigit(5, 0);
 }
  updateDisplay();

    Serial.println();
    Serial.print(" Pay_Disp: ");    
    Serial.print(l);
    Serial.print(" | Payalnik: ");    
    Serial.print(payaln);
    Serial.print(" | Pay_Sensor: ");    
    Serial.print(sting_tmp);
    Serial.print(" | Encoder: ");    
    Serial.print(encoder);
    
    printf("0x%08lX\n", newKeys);

//  delay(100);
}

///// Всё! Веселье закончилось!

///// Мало нам веселья!

void ENCODER()    //Процедура опроса энкодера
{
  currentTime = millis();
  if(currentTime >= (loopTime + 3))
   {
    encoder_A = digitalRead(enc_pin_A);
    encoder_B = digitalRead(enc_pin_B);   
    if((!encoder_A) && (encoder_A_prev))
     {
      if(encoder_B)
     {
      if(encoder + fadeAmount <= 255)
      encoder += fadeAmount;               
     }   
     else
     {
      if(encoder - fadeAmount >= 0)
      encoder -= fadeAmount;               
     }   
   }   
  encoder_A_prev = encoder_A;
  loopTime = currentTime;
 }
}

void STING()
{
  sting_tmp = analogRead(Sens_A1);
  payaln = map(l, 20, 400, 378, 320);

  if (sting_tmp > payaln)
   {
    analogWrite(sting, 1022);
   }
  else
   {
    digitalWrite(sting, HIGH); 
   }
}

void FEN()
{
}

И снова я вас побеспокою и сразу извините !!!

Вот код на котором паяльник работает нормально но хоть убейте не пойму как его встроить в скетчь ваш готовый последний

Не могли бы вы на примере етом показать мне как встроить в ваш скетчь паяльник ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Смогу, но не сейчас. Я просьбу услышал. Как только, так сразу.

0259
0259 аватар
Offline
Зарегистрирован: 30.03.2014

здравствуйте хороший код пользовался не много скорректировав но недавно наткнулся на дисплей от DVD микросхема 1628 а вот экран с общим анодом! не подскажите как запустить его ?