Кстати, будете смеяться, но так, как сейчас сделано, когда экранчик выключен, кнопки (увеличение/уменьшение) продолжают работать. Можете попробовать - выключите, нажмите кнопку, включите - будет новое значение :)
там ещё и термодатчики желательно предусмотреть )) и чтобы цифры что на дисплейчиках обрабатывать можно было ))) И ето готовый проект инфракрасной станции почти будет или просто паяльной но хорошей станции на AT1628 или TM1628
В общем поменял я местами микросхемы теперь правая работает левая нет и таки определения другие стоят так как светодиоды отдельные не правильно работают и потенциометр не регулирует ничего ))) а дисплеи чётко показывают
Здраствуйте Евгений В общем я тут немного всё усложнил и подключаю на место атмеги к плате плату ардуино и вот вопрос контакт AREF ссоеденять с таким же на месте атмеги (Atmega8l-8pu) ?
Блин, ну Вы так не шутите. У меня тут библиотека готова (только тесты осталось написать). Но это имеет смысл, если аппаратно всё работает. Оно же работало у нас!
Там добавлено там теперь паяльник включается и температура ставится , энкодер опрашивается, вот а как подключить одновременно 2 spi я так и не додумался, если прописать вашь готовый скетчь то всё работает как и было
Здраствуйте Евгений прилагаю код понимаю что у меня подключено по i2c 2 устройства отдельно но они не хотят совместно работать помогите распутать сей клубок код прилагаю за ошибки не ругайте
#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 PIN_DIO1 6 //
#define PIN_CLK1 5 // > ето я добавляю вторую группу дисплеев и кнопок по i2c - но ничего не выходит
#define PIN_STB1 4 // /
#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 0x0008 // зел справа
#define LE5 0x0020 // красн справа
#define LE7 0x0040 // красн слева
#define LE8 0x0080 // зел. слева
//#define LE4 0x0040
#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); // Пауза до следующей команды
// digitalWrite(PIN_STB1, LOW);
// shiftOut(PIN_DIO1, PIN_CLK1, LSBFIRST, command);
// digitalWrite(PIN_STB1, 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);
shiftOut(PIN_DIO1, PIN_CLK1, LSBFIRST, 0xC0); // Установка адреса в 0
// uint8_t * p = (uint8_t *) ledGRID;
// for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO1, PIN_CLK1, LSBFIRST, *p); // запись данных
digitalWrite(PIN_STB1, HIGH);
// updateDisplay();
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
#define POWER_3 64
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(PIN_CLK1, OUTPUT);//
pinMode(PIN_DIO1, OUTPUT);// я добавил
pinMode(PIN_STB1, OUTPUT);//
digitalWrite(PIN_STB1, HIGH);
digitalWrite(PIN_CLK1, HIGH);
*/
pinMode(A0, INPUT_PULLUP); //сенсор стола
pinMode(Sens_A1, INPUT_PULLUP); //сенсор паяльника
pinMode(sting, OUTPUT);
digitalWrite(PIN_STB, HIGH);
digitalWrite(PIN_CLK, HIGH);
// digitalWrite(PIN_STB1, HIGH); //я добавил
// digitalWrite(PIN_CLK1, 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(); //процедура нагрева фена
// STOL(); //процедура нагрева стола
// LAMPA(); //процедура нагрева ВЕРХНЕГО НАГРЕВАТЕЛЯ
}
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 ()
// {
// setDigit(6, ledGRID[6] | LE7); //
// }
/* else
{
setDigit(6, ledGRID[6]); // & ~LE7
setDigit(0, 0);
setDigit(1, 0);
setDigit(2, 0);
}
*/
if (newKeys & POWER_1)
setDigit(6, ledGRID[6] | LE6); //
else
{
setDigit(6, ledGRID[6] & ~LE6);
setDigit(3, 0);
setDigit(4, 0);
setDigit(5, 0);
}
updateDisplay();
if (newKeys & POWER_2)
setDigit(6, ledGRID[6] | LE5); //
else
{
setDigit(6, ledGRID[6] & ~LE5);
setDigit(0, 0);
setDigit(1, 0);
setDigit(2, 0);
}
//saveBrightness = setBrightness(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, 330);
if (sting_tmp > payaln)
{
analogWrite(sting, 768);
setDigit(6, ledGRID[6] | LE7);
updateDisplay();
}
if (sting_tmp <= payaln)
{
digitalWrite(sting, HIGH);
setDigit(6, ledGRID[6] | LE7);
updateDisplay();
}
}
void FEN()
{
}
/*static int l = 20, r = 000;
#include <math.h>
int encoder1 = 127;
int payaln1 = 378;
int sting_tmp1;
int fadeAmount1 = 1;
byte Sens_A2 = A2;
byte sting1 = 13;
unsigned long currentTime1;
unsigned long loopTime1;
unsigned long timing1;
const int enc_pin_A1 = 3;
const int enc_pin_B1 = 2;
unsigned char encoder_A1;
unsigned char encoder_B1;
unsigned char encoder_A_prev1=0;
void setup(void){
stdout1 = serial_stream1; // эта строка первая в setup
Serial.begin(115200);
//
// Инициализация пинов
pinMode(PIN_CLK1, OUTPUT);
pinMode(PIN_DIO1, OUTPUT);
pinMode(PIN_STB1, OUTPUT);
pinMode(PIN_CLK1, OUTPUT);//
pinMode(PIN_DIO1, OUTPUT);// я добавил
pinMode(PIN_STB1, OUTPUT);//
digitalWrite(PIN_STB1, HIGH);
digitalWrite(PIN_CLK1, HIGH);
pinMode(A0, INPUT_PULLUP); //сенсор стола
pinMode(Sens_A2, INPUT_PULLUP); //сенсор паяльника
pinMode(sting1, OUTPUT);
digitalWrite(PIN_STB1, HIGH);
digitalWrite(PIN_CLK1, HIGH);
// digitalWrite(PIN_STB1, HIGH); //я добавил
// digitalWrite(PIN_CLK1, 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_A1, INPUT_PULLUP);
pinMode(enc_pin_B1, INPUT_PULLUP);
currentTime = millis();
loopTime = currentTime1;
}
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(); //процедура нагрева фена
// STOL(); //процедура нагрева стола
// LAMPA(); //процедура нагрева ВЕРХНЕГО НАГРЕВАТЕЛЯ
}
if (newKeys == 0x00000000){
payaln = 378;
l = 20;
}
if (newKeys == 0x00000010){
payaln = 378;
l = 20;
}
showNumber(LEFT_POSITION1, l);
showNumber(RIGHT_POSITION1, encoder); //r
//#define POWER_2 0x0000000010 // LE6
//#define POWER_1 0x0000000002 // LE8
// if ()
// {
// setDigit(6, ledGRID[6] | LE7); //
// }
/* else
{
setDigit(6, ledGRID[6]); // & ~LE7
setDigit(0, 0);
setDigit(1, 0);
setDigit(2, 0);
}
*/
/* if (newKeys & POWER_1)
setDigit(6, ledGRID[6] | LE6); //
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() //Процедура опроса энкодера
{
currentTime1 = millis();
if(currentTime1 >= (loopTime1 + 3))
{
encoder_A1 = digitalRead(enc_pin_A);
encoder_B1 = 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_prev1 = encoder_A;
loopTime1 = currentTime;
}
}
void STING()
{
sting_tmp = analogRead(Sens_A1);
payaln = map(l, 20, 400, 378, 330);
if (sting_tmp > payaln)
{
analogWrite(sting, 768);
setDigit(6, ledGRID[6] | LE7);
updateDisplay();
}
if (sting_tmp <= payaln)
{
digitalWrite(sting, HIGH);
setDigit(6, ledGRID[6] | LE7);
updateDisplay();
}
}
void FEN()
{
}
*/
Алексей, я сегодня выложу Вам готовую библиотеку (собственно она с неделю как готова, нет только тестового примера). Давайте её дожмём, чтобы она у Вас уже была, а потом будем смотреть на i2c и что там ещё.
Если всё сделано правильно, он быдет компилироваться без ошибок.
Убедитесь, что наш старый пример работает на текущем железе.
Вы там меняли какие-то коды. Найдите их в файле TM1628Symbols.h и также поменяйте.
Убедитесь, что скорость сериала в строке 21 такая же как у Вас в мониторе порта. Включите Ваши тумбелры, чтобы дисплеи были включены. Запустите скетч. Скорее всего он повалится (мне проверять не на чем), но мы его дожмём - это не проблема.
По идее он должен делать два теста.
Тест №1. Занимает 20 секунд. В левом жисплее цифры меняются с 0 до 999, а в правом в то же самое время с 999 до 0. Если этот тест заработал и с ним всё в порядке, закомментируйте строку 23, чтобы впредь он не запускался.
Тест №2. Начинается после теста №1. Раз в 5 секунд в сериал печаются значения, которые Вы видите на дисплее. При этом Вы можете менять значения кнопками, выключать дисплей и т.п. Значения должны печататься текущими. Если Вы нажмёте кнопку изменения значения и будете держать не отпуская, то изменение будет ускоряться. Сейчас там стоят огромные задержки, чтобы видно было, но потом Вы поставите такие, какие Вам нравятся.
===============
В общем, запускайтесь, смотрите, пробуйте, фиксируйте ошибки. Я буду доступен примерно через полчаса-минут сорок.
Здравствуйте ЕвгенийП И вот какая интересная штука выявилась Если с етим кодом включен монитор порта то значения держатся а если монитор выключить то они примерно через 10-15 секунд обнуляются )) Проверил delay нету нигде а где были закоментировал не помогло
Ну, значит, она у Вас перегружается. Скорее всего из-за питания или чего-нмбудь подобного. Может, конечно, и программно чего, но вряд ли - там нет работы с памятью.
Для начала убедитесь, что она именно перегружается. Сможете?
1. Когда Вы питаете от USB оно работает, а когда питаете от "родного" питания в устройстве, оно иногда обнуляется. Значит, 90% проходит скачок по питанию (например, при включении нагрузки) и ардуина перегружается. Проверить это очень просто. Присоедините к ардуине какой-нибудь buzzer и вставьте в setup полусекундный писк. При запуске она пискнет. А потом, если при обнулении пискнет снова - значит действительно произошла перезагрузка. Проверьте.
2. Мы же с Вами выключали и всё было нормально? Или сейчас у Вас там нагрузка есть? Если так, то вполне может быть опять же "перезагрузка". Когда будете проверять п.1. Пощёлкайте и выключателем - если будет пищать, значит перезагрузка.
Если происходит перезагрузка, то почти наверняка дело в питании. Если бы дело было в программе - она бы всегда обнулялалсь, хоть с USB, хоть без. Ну, совсем чтобы убедиться, запитайте ардуину не от USB, а от совсем постороннего БП (только земли соедините) и убедитесь.
Если подтвердится, что проблема в питании, это уже Ваша епархия - Вы же электронщик, а не я. Ставьте там конденсаторы, дроссели или чего там ещё положено, в общем обеспечьте стабильное питание.
#include <stdio.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 4 // // Маски нажатых кнопок (слева направо) // #define KEY_2_BLUE 0x1000 #define KEY_1_BLUE 0x0200 #define KEY_2_RED 0/???? #define KEY_1_RED 0x0010 // // Подключено 5 "цифр". // 0-ая - это двоеточие, залействовано только два младших бита // 1-4 - собственно цифры слева направо. // В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой) // и 7-ой бит под доплнительный символ (питание, конверт и т.п.) // #define LE6 0x0001 #define LE5 0x0020 #define LE7 0x0040 #define LE8 0x0040 #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 = 1; // текущая яркость 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 // void readKeyData(uint32_t * data) { digitalWrite(PIN_STB, LOW); shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42); // чтение данных pinMode(PIN_DIO, INPUT_PULLUP); delayMicroseconds(1); * data = (uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 8) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 16) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 24); pinMode(PIN_DIO, OUTPUT); digitalWrite(PIN_STB, HIGH); } // // Установить яркость от 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); } ///////////////////////////////////////////////////////////// //////////// КОНЕЦ "библиотеки" ДЛЯ TM1668 //////////// ///////////////////////////////////////////////////////////// void setup(void) { stdout = serial_stream; // эта строка первая в setup Serial.begin(115200); // // Инициализация пинов pinMode(PIN_CLK, OUTPUT); pinMode(PIN_DIO, OUTPUT); pinMode(PIN_STB, 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(5000); // // Рисуем нулевое время showClock(0, 0); updateDisplay(); setDigit(0, SYMBOL_0); setDigit(1, SYMBOL_1); setDigit(2, SYMBOL_2); setDigit(3, SYMBOL_3); setDigit(4, SYMBOL_4); setDigit(5, SYMBOL_5); updateDisplay(); printf("Press key\n"); } void loop(void) { uint32_t newKeys; readKeyData(& newKeys); printf("0x%08lX\n", newKeys); delay(1000); } ///// Всё! Веселье закончилось!#include <stdio.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 4 // // Маски нажатых кнопок (слева направо) // #define KEY_2_BLUE 0x00001000ul #define KEY_1_BLUE 0x00000200ul #define KEY_2_RED 0x00020000ul #define KEY_1_RED 0x00000010ul // // Подключено 5 "цифр". // 0-ая - это двоеточие, залействовано только два младших бита // 1-4 - собственно цифры слева направо. // В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой) // и 7-ой бит под доплнительный символ (питание, конверт и т.п.) // #define LE6 0x0001 #define LE5 0x0020 #define LE7 0x0040 #define LE8 0x0040 #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 = 1; // текущая яркость 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 // void readKeyData(uint32_t * data) { digitalWrite(PIN_STB, LOW); shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42); // чтение данных pinMode(PIN_DIO, INPUT_PULLUP); delayMicroseconds(1); * data = (uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 8) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 16) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 24); pinMode(PIN_DIO, OUTPUT); digitalWrite(PIN_STB, HIGH); } // // Установить яркость от 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 //////////// ///////////////////////////////////////////////////////////// void setup(void) { stdout = serial_stream; // эта строка первая в setup Serial.begin(115200); // // Инициализация пинов pinMode(PIN_CLK, OUTPUT); pinMode(PIN_DIO, OUTPUT); pinMode(PIN_STB, 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, 666); showNumber(RIGHT_POSITION, 321); 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"); } void loop(void) { uint32_t newKeys; readKeyData(& newKeys); printf("0x%08lX\n", newKeys); delay(1000); } ///// Всё! Веселье закончилось!#include <stdio.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 4 // // Маски нажатых кнопок (слева направо) // #define KEY_2_BLUE 0x00001000ul #define KEY_1_BLUE 0x00000200ul #define KEY_2_RED 0x00020000ul #define KEY_1_RED 0x00000010ul // // Подключено 5 "цифр". // 0-ая - это двоеточие, залействовано только два младших бита // 1-4 - собственно цифры слева направо. // В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой) // и 7-ой бит под доплнительный символ (питание, конверт и т.п.) // #define LE6 0x0001 #define LE5 0x0020 #define LE7 0x0040 #define LE8 0x0040 #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 = 1; // текущая яркость 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 // void readKeyData(uint32_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); for (int i=0; i<KEY_DATA_LENGTH; i++) { printf("%02X", buffer[i]); } printf("\n"); * data = 0; } // // Установить яркость от 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 //////////// ///////////////////////////////////////////////////////////// void setup(void) { stdout = serial_stream; // эта строка первая в setup Serial.begin(115200); // // Инициализация пинов pinMode(PIN_CLK, OUTPUT); pinMode(PIN_DIO, OUTPUT); pinMode(PIN_STB, 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, 666); // showNumber(RIGHT_POSITION, 321); // 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"); } void loop(void) { uint32_t newKeys; readKeyData(& newKeys); // printf("0x%08lX\n", newKeys); delay(1000); } ///// Всё! Веселье закончилось!#include <stdio.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 = 666, r = 321; void setup(void) { stdout = serial_stream; // эта строка первая в setup Serial.begin(115200); // // Инициализация пинов pinMode(PIN_CLK, OUTPUT); pinMode(PIN_DIO, OUTPUT); pinMode(PIN_STB, 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"); } 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 (newKeys & KEY_1_BLUE) { if (l < 999) l++; } if (newKeys & KEY_1_RED) { if (l > 0) l--; } if (newKeys & KEY_2_BLUE) { if (r < 999) r++; } if (newKeys & KEY_2_RED) { if (r > 0) r--; } //#define POWER_2 0x0000000010 // LE6 //#define POWER_1 0x0000000002 // LE8 if (newKeys & POWER_2) setDigit(5, ledGRID[5] | LE6); else setDigit(5, ledGRID[5] & ~LE6); if (newKeys & POWER_1) setDigit(5, ledGRID[5] | LE8); else setDigit(5, ledGRID[5] & ~LE8); showNumber(LEFT_POSITION, l); showNumber(RIGHT_POSITION, r); updateDisplay(); // printf("0x%08lX\n", newKeys); delay(1000); } ///// Всё! Веселье закончилось!#include <stdio.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 = 666, r = 321; void setup(void) { stdout = serial_stream; // эта строка первая в setup Serial.begin(115200); // // Инициализация пинов pinMode(PIN_CLK, OUTPUT); pinMode(PIN_DIO, OUTPUT); pinMode(PIN_STB, 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"); } 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 (newKeys & KEY_1_BLUE) { if (l < 999) l++; } if (newKeys & KEY_1_RED) { if (l > 0) l--; } if (newKeys & KEY_2_BLUE) { if (r < 999) r++; } if (newKeys & KEY_2_RED) { if (r > 0) r--; } showNumber(LEFT_POSITION, l); showNumber(RIGHT_POSITION, 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); if (newKeys & POWER_1) setDigit(6, ledGRID[6] | LE8); else setDigit(6, ledGRID[6] & ~LE8); updateDisplay(); // printf("0x%08lX\n", newKeys); delay(100); } ///// Всё! Веселье закончилось!Огромное спасибо ЕвгенийП Очень доходчиво и практично обьяснили и помогли !!!
Кстати, будете смеяться, но так, как сейчас сделано, когда экранчик выключен, кнопки (увеличение/уменьшение) продолжают работать. Можете попробовать - выключите, нажмите кнопку, включите - будет новое значение :)
Забавно! Но мне потом всё равно дорабатывать мне отключение ещё и на силовую часть туда вводить
Так что когда доберусь до включения и отключения силовой части наверно тогда и отключу кнопки вместе с дисплеем
Я это в библиотеке предусмотрю.
там ещё и термодатчики желательно предусмотреть )) и чтобы цифры что на дисплейчиках обрабатывать можно было ))) И ето готовый проект инфракрасной станции почти будет или просто паяльной но хорошей станции на AT1628 или TM1628
В общем поменял я местами микросхемы теперь правая работает левая нет и таки определения другие стоят так как светодиоды отдельные не правильно работают и потенциометр не регулирует ничего ))) а дисплеи чётко показывают
Может микросхема битая? Ну, Вы разбирайтесь. С позициями-то нет проблем, также их исследуем.
100% битая я ею на дня заменю
Здраствуйте Евгений В общем я тут немного всё усложнил и подключаю на место атмеги к плате плату ардуино и вот вопрос контакт AREF ссоеденять с таким же на месте атмеги (Atmega8l-8pu) ?
Не знаю. Это зависит от того как и для чего Вы собираетесь ADC использовать.
ну ето продолжение истории с дисплеями только теперь ещё датчики и запуск силовых агрегатов нагревания через 0
Я тут допиливаю бибилотеку по мотивам наших прошлых изысканий. Скоро выложу. Будете проверять. А датчики - это уже другая опера :)
библиотека ето хорошо как только выложите начну проверять
#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 6 #define PIN_CLK 5 #define PIN_STB 4 #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(); //процедура опроса энкодера // STING(); //процедура нагрева паяльника 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() { }ВОт кое что наваяли
Имикросхему драйвера поставил и энкодер опрашивается но не всё работает
В частности не рулят кнопки на пинах 9 8 7 и не можем разобратся как погасить диоды
А на левой половине (на которой мы отлаживались) всё по-прежнему нормально?
в том то и дело что чтобы энкодер наладить переместил микросхему туда на правую и там отладили
и теперь левая не работают кнопки ) и дисплеи паралельно естественно показывают
Блин, ну Вы так не шутите. У меня тут библиотека готова (только тесты осталось написать). Но это имеет смысл, если аппаратно всё работает. Оно же работало у нас!
Аппаратно всё работает если я пины в коде поменяю и удалю 3 пина что добавил то всё будет работать.
Вы наверно ваш изменённый мною скетч не смотрели, я скинул его
А что там изменено? Пины как раз поменяны?
Там добавлено там теперь паяльник включается и температура ставится , энкодер опрашивается, вот а как подключить одновременно 2 spi я так и не додумался, если прописать вашь готовый скетчь то всё работает как и было
Здраствуйте Евгений прилагаю код понимаю что у меня подключено по i2c 2 устройства отдельно но они не хотят совместно работать помогите распутать сей клубок код прилагаю за ошибки не ругайте
#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 PIN_DIO1 6 // #define PIN_CLK1 5 // > ето я добавляю вторую группу дисплеев и кнопок по i2c - но ничего не выходит #define PIN_STB1 4 // / #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 0x0008 // зел справа #define LE5 0x0020 // красн справа #define LE7 0x0040 // красн слева #define LE8 0x0080 // зел. слева //#define LE4 0x0040 #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); // Пауза до следующей команды // digitalWrite(PIN_STB1, LOW); // shiftOut(PIN_DIO1, PIN_CLK1, LSBFIRST, command); // digitalWrite(PIN_STB1, 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); shiftOut(PIN_DIO1, PIN_CLK1, LSBFIRST, 0xC0); // Установка адреса в 0 // uint8_t * p = (uint8_t *) ledGRID; // for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO1, PIN_CLK1, LSBFIRST, *p); // запись данных digitalWrite(PIN_STB1, HIGH); // updateDisplay(); 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 #define POWER_3 64 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(PIN_CLK1, OUTPUT);// pinMode(PIN_DIO1, OUTPUT);// я добавил pinMode(PIN_STB1, OUTPUT);// digitalWrite(PIN_STB1, HIGH); digitalWrite(PIN_CLK1, HIGH); */ pinMode(A0, INPUT_PULLUP); //сенсор стола pinMode(Sens_A1, INPUT_PULLUP); //сенсор паяльника pinMode(sting, OUTPUT); digitalWrite(PIN_STB, HIGH); digitalWrite(PIN_CLK, HIGH); // digitalWrite(PIN_STB1, HIGH); //я добавил // digitalWrite(PIN_CLK1, 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(); //процедура нагрева фена // STOL(); //процедура нагрева стола // LAMPA(); //процедура нагрева ВЕРХНЕГО НАГРЕВАТЕЛЯ } 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 () // { // setDigit(6, ledGRID[6] | LE7); // // } /* else { setDigit(6, ledGRID[6]); // & ~LE7 setDigit(0, 0); setDigit(1, 0); setDigit(2, 0); } */ if (newKeys & POWER_1) setDigit(6, ledGRID[6] | LE6); // else { setDigit(6, ledGRID[6] & ~LE6); setDigit(3, 0); setDigit(4, 0); setDigit(5, 0); } updateDisplay(); if (newKeys & POWER_2) setDigit(6, ledGRID[6] | LE5); // else { setDigit(6, ledGRID[6] & ~LE5); setDigit(0, 0); setDigit(1, 0); setDigit(2, 0); } //saveBrightness = setBrightness(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, 330); if (sting_tmp > payaln) { analogWrite(sting, 768); setDigit(6, ledGRID[6] | LE7); updateDisplay(); } if (sting_tmp <= payaln) { digitalWrite(sting, HIGH); setDigit(6, ledGRID[6] | LE7); updateDisplay(); } } void FEN() { } /*static int l = 20, r = 000; #include <math.h> int encoder1 = 127; int payaln1 = 378; int sting_tmp1; int fadeAmount1 = 1; byte Sens_A2 = A2; byte sting1 = 13; unsigned long currentTime1; unsigned long loopTime1; unsigned long timing1; const int enc_pin_A1 = 3; const int enc_pin_B1 = 2; unsigned char encoder_A1; unsigned char encoder_B1; unsigned char encoder_A_prev1=0; void setup(void){ stdout1 = serial_stream1; // эта строка первая в setup Serial.begin(115200); // // Инициализация пинов pinMode(PIN_CLK1, OUTPUT); pinMode(PIN_DIO1, OUTPUT); pinMode(PIN_STB1, OUTPUT); pinMode(PIN_CLK1, OUTPUT);// pinMode(PIN_DIO1, OUTPUT);// я добавил pinMode(PIN_STB1, OUTPUT);// digitalWrite(PIN_STB1, HIGH); digitalWrite(PIN_CLK1, HIGH); pinMode(A0, INPUT_PULLUP); //сенсор стола pinMode(Sens_A2, INPUT_PULLUP); //сенсор паяльника pinMode(sting1, OUTPUT); digitalWrite(PIN_STB1, HIGH); digitalWrite(PIN_CLK1, HIGH); // digitalWrite(PIN_STB1, HIGH); //я добавил // digitalWrite(PIN_CLK1, 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_A1, INPUT_PULLUP); pinMode(enc_pin_B1, INPUT_PULLUP); currentTime = millis(); loopTime = currentTime1; } 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(); //процедура нагрева фена // STOL(); //процедура нагрева стола // LAMPA(); //процедура нагрева ВЕРХНЕГО НАГРЕВАТЕЛЯ } if (newKeys == 0x00000000){ payaln = 378; l = 20; } if (newKeys == 0x00000010){ payaln = 378; l = 20; } showNumber(LEFT_POSITION1, l); showNumber(RIGHT_POSITION1, encoder); //r //#define POWER_2 0x0000000010 // LE6 //#define POWER_1 0x0000000002 // LE8 // if () // { // setDigit(6, ledGRID[6] | LE7); // // } /* else { setDigit(6, ledGRID[6]); // & ~LE7 setDigit(0, 0); setDigit(1, 0); setDigit(2, 0); } */ /* if (newKeys & POWER_1) setDigit(6, ledGRID[6] | LE6); // 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() //Процедура опроса энкодера { currentTime1 = millis(); if(currentTime1 >= (loopTime1 + 3)) { encoder_A1 = digitalRead(enc_pin_A); encoder_B1 = 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_prev1 = encoder_A; loopTime1 = currentTime; } } void STING() { sting_tmp = analogRead(Sens_A1); payaln = map(l, 20, 400, 378, 330); if (sting_tmp > payaln) { analogWrite(sting, 768); setDigit(6, ledGRID[6] | LE7); updateDisplay(); } if (sting_tmp <= payaln) { digitalWrite(sting, HIGH); setDigit(6, ledGRID[6] | LE7); updateDisplay(); } } void FEN() { } */Тебе запятых отсыпать? У меня их есть, могу поделица.
Это был пост ради поста , или запятых в коде не хватает ?
Алексей, я сегодня выложу Вам готовую библиотеку (собственно она с неделю как готова, нет только тестового примера). Давайте её дожмём, чтобы она у Вас уже была, а потом будем смотреть на i2c и что там ещё.
Вся электроника уже в сборе. Я по своему незнанию толком и доработать ничего не могу. И вопросик сегодня ето во сколько ?
Вы во сколько сможете связатся со мной ?
1. Возьмите архив - https://drive.google.com/file/d/1VfI8f4kTwDvBZTEoE0acxKK2WD75-64p/view?usp=sharing
2. В нём находится папка TM1628L
3. распакуйте так, чтобы эта папка оказалась в Вашей папке libraries (в прошлый раз мы туда помещали другую библиотеку).
4. Создайте вот такой скетч
#include <TM1628L.h> #define PIN_DIO 9 #define PIN_CLK 8 #define PIN_STB 7 TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB); static uint32_t oldMillis; void testAllNumbers(void) { for (int i = 0; i < 1000; i++) { panel.leftPanel.setValue(i); panel.rightPanel.setValue(999 - i); panel.updateDisplay(); delay(20); } } void setup(void) { Serial.begin(115200); panel.init(); testAllNumbers(); oldMillis = millis(); } void loop(void) { const uint32_t curMillis = millis(); if (curMillis - oldMillis >= 5000L) { oldMillis = curMillis; Serial.print("Left: "); Serial.print(panel.leftPanel.getValue()); Serial.print("; Right: "); Serial.println(panel.rightPanel.getValue()); } } ///// Всё! Веселье закончилось!Если всё сделано правильно, он быдет компилироваться без ошибок.
Убедитесь, что наш старый пример работает на текущем железе.
Вы там меняли какие-то коды. Найдите их в файле TM1628Symbols.h и также поменяйте.
Убедитесь, что скорость сериала в строке 21 такая же как у Вас в мониторе порта. Включите Ваши тумбелры, чтобы дисплеи были включены. Запустите скетч. Скорее всего он повалится (мне проверять не на чем), но мы его дожмём - это не проблема.
По идее он должен делать два теста.
Тест №1. Занимает 20 секунд. В левом жисплее цифры меняются с 0 до 999, а в правом в то же самое время с 999 до 0. Если этот тест заработал и с ним всё в порядке, закомментируйте строку 23, чтобы впредь он не запускался.
Тест №2. Начинается после теста №1. Раз в 5 секунд в сериал печаются значения, которые Вы видите на дисплее. При этом Вы можете менять значения кнопками, выключать дисплей и т.п. Значения должны печататься текущими. Если Вы нажмёте кнопку изменения значения и будете держать не отпуская, то изменение будет ускоряться. Сейчас там стоят огромные задержки, чтобы видно было, но потом Вы поставите такие, какие Вам нравятся.
===============
В общем, запускайтесь, смотрите, пробуйте, фиксируйте ошибки. Я буду доступен примерно через полчаса-минут сорок.
1й тест в правом дисплее отлично в левом в последнем сегменте цифры только в остальных 2х сегментах бардак
#include <TM1628L.h> #define PIN_DIO 9 #define PIN_CLK 8 #define PIN_STB 7 TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB); static uint32_t oldMillis; void testAllNumbers(void) { for (int i = 0; i < 1000; i++) { panel.leftPanel.setValue(i); panel.rightPanel.setValue(999 - i); panel.updateDisplay(); delay(20); } } void test1(void) { for (int i = 0; i < 7; i++) { panel.showSymbol(i, 0xff); delay(4000); } } void setup(void) { Serial.begin(115200); panel.init(); // testAllNumbers(); test1(); oldMillis = millis(); } void loop(void) { const uint32_t curMillis = millis(); if (curMillis - oldMillis >= 5000L) { oldMillis = curMillis; Serial.print("Left: "); Serial.print(panel.leftPanel.getValue()); Serial.print("; Right: "); Serial.println(panel.rightPanel.getValue()); } } ///// Всё! Веселье закончилось!void TM1628L::init(void) { writeSingleCommand(m_grid); clearScreenMemory(); leftPanel.showNumber(); rightPanel.showNumber(); updateDisplay(); setBrightness(m_CurrentBrightness); }#include <TM1628L.h> #define PIN_DIO 9 #define PIN_CLK 8 #define PIN_STB 7 TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB); static uint32_t oldMillis; void testAllNumbers(void) { for (int i = 0; i < 1000; i++) { panel.leftPanel.setValue(i); panel.rightPanel.setValue(999 - i); panel.updateDisplay(); delay(20); } } void test1(void) { for (int i = 0; i < 7; i++) { panel.showSymbol(i, 0xff); panel.updateDisplay(); delay(4000); } } void setup(void) { Serial.begin(115200); panel.init(); delay(4000); // testAllNumbers(); // test1(); panel.updateDisplay(); oldMillis = millis(); } void loop(void) { const uint32_t curMillis = millis(); if (panel.readKeys()) panel.updateDisplay(); if (curMillis - oldMillis >= 5000L) { oldMillis = curMillis; Serial.print("Left: "); Serial.print(panel.leftPanel.getValue()); Serial.print("; Right: "); Serial.println(panel.rightPanel.getValue()); } } ///// Всё! Веселье закончилось!#include <TM1628L.h> #define PIN_DIO 6 #define PIN_CLK 5 #define PIN_STB 4 #define PIN_DIO1 9 #define PIN_CLK1 8 #define PIN_STB1 7 TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB); TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1); static uint32_t oldMillis; void testAllNumbers(void) { for (int i = 0; i < 1000; i++) { panel.leftPanel.setValue(i); panel.rightPanel.setValue(999 - i); panel.updateDisplay(); panel1.leftPanel.setValue(i); panel1.rightPanel.setValue(999 - i); panel1.updateDisplay(); delay(20); } } void test1(void) { for (int i = 0; i < 7; i++) { panel.showSymbol(i, 0xff); panel.updateDisplay(); delay(4000); } } void setup(void) { Serial.begin(115200); panel.init(); panel1.init(); delay(4000); testAllNumbers(); // test1(); oldMillis = millis(); } void loop(void) { const uint32_t curMillis = millis(); if (panel.readKeys()) panel.updateDisplay(); if (curMillis - oldMillis >= 5000L) { oldMillis = curMillis; Serial.print("Left: "); Serial.print(panel.leftPanel.getValue());//getValue что в данных Serial.print("; Right: "); Serial.println(panel.rightPanel.getValue()); } } ///// Всё! Веселье закончилось!uint8_t TM1628L::readKeyData(void) { digitalWrite(m_STB, LOW); shiftOut(m_DIO, m_CLK, LSBFIRST, 0x42); // чтение данных pinMode(m_DIO, INPUT_PULLUP); delayMicroseconds(1); byte buffer[keyDataLength]; for (int i=0; i < keyDataLength; i++) buffer[i] = shiftIn(m_DIO, m_CLK, LSBFIRST); pinMode(m_DIO, OUTPUT); digitalWrite(m_STB, HIGH); for (int i = 0; i < keyDataLength; i++) { Serial.print(buffer[i], HEX); Serial.print(' '); } Serial.println(); m_lastKeys = 0; if (buffer[1] & 0x10) m_lastKeys |= KEY_2_BLUE; if (buffer[1] & 0x02) m_lastKeys |= KEY_1_BLUE; if (buffer[2] & 0x02) m_lastKeys |= KEY_2_RED; if (buffer[0] & 0x10) m_lastKeys |= KEY_1_RED; if (buffer[4] & 0x10) m_lastKeys |= POWER_2; if (buffer[4] & 0x02) m_lastKeys |= POWER_1; return m_lastKeys; }Скетч
#include <TM1628L.h> #define PIN_DIO 6 #define PIN_CLK 5 #define PIN_STB 4 #define PIN_DIO1 9 #define PIN_CLK1 8 #define PIN_STB1 7 TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB); TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1); static uint32_t oldMillis; void testAllNumbers(void) { for (int i = 0; i < 1000; i++) { panel.leftPanel.setValue(i); panel.rightPanel.setValue(999 - i); panel.updateDisplay(); panel1.leftPanel.setValue(i); panel1.rightPanel.setValue(999 - i); panel1.updateDisplay(); delay(20); } } void test1(void) { for (int i = 0; i < 7; i++) { panel.showSymbol(i, 0xff); panel.updateDisplay(); delay(4000); } } void setup(void) { Serial.begin(115200); panel.init(); panel1.init(); delay(4000); // testAllNumbers(); // test1(); oldMillis = millis(); } void loop(void) { const uint32_t curMillis = millis(); if (panel.readKeys()) panel.updateDisplay(); if (panel1.readKeys()) panel1.updateDisplay(); if (curMillis - oldMillis >= 5000L) { oldMillis = curMillis; Serial.print("Panel (Left: "); Serial.print(panel.leftPanel.getValue());//getValue что в данных Serial.print("; Right: "); Serial.print(panel.rightPanel.getValue()); Serial.print(") Panel1 (Left: "); Serial.print(panel1.leftPanel.getValue());//getValue что в данных Serial.print("; Right: "); Serial.print(panel1.rightPanel.getValue()); Serial.println(); } } ///// Всё! Веселье закончилось!Файл библиотеки TM1628L.cpp
#include <arduino.h> #include "TM1628L.h" const uint16_t TM1628L::digits[10] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4, SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9 }; TM1628L::TM1628L(const uint8_t dio, const uint8_t clk, const uint8_t stb, const uint8_t brighness, const uint8_t grid) : m_DIO(dio), m_CLK(clk), m_STB(stb), m_grid(grid), m_CurrentBrightness(brighness), m_lastKeys(0) { pinMode(m_CLK, OUTPUT); pinMode(m_DIO, OUTPUT); pinMode(m_STB, OUTPUT); digitalWrite(m_STB, HIGH); digitalWrite(m_CLK, HIGH); leftPanel.setPanel(this); rightPanel.setPanel(this); leftPanel.init(3, POWER_1, KEY_1_BLUE, KEY_1_RED, LE8, LE7); rightPanel.init(0, POWER_2, KEY_2_BLUE, KEY_2_RED, LE6, LE5); } void TM1628L::init(void) { writeSingleCommand(m_grid); clearScreenMemory(); leftPanel.showNumber(); rightPanel.showNumber(); updateDisplay(); setBrightness(m_CurrentBrightness); } // // Запись одиночной команды в TM1628 // void TM1628L::writeSingleCommand(const uint8_t command) { digitalWrite(m_STB, LOW); shiftOut(m_DIO, m_CLK, LSBFIRST, command); digitalWrite(m_STB, HIGH); delayMicroseconds(1); // Пауза до следующей команды } // // Установка яркости // 0 - экран выключен // 8 - максимальная яркость // uint8_t TM1628L::setBrightness(const uint8_t newBrighness) { const uint8_t res = m_CurrentBrightness; m_CurrentBrightness = (newBrighness > 8) ? 8 : newBrighness; if (m_CurrentBrightness == 0) writeSingleCommand(0x80); // Выключить дисплей else writeSingleCommand(0x88 + (m_CurrentBrightness - 1)); // Установить яркость return res; } // // Запись состояния дисплея в TM1628 // void TM1628L::updateDisplay(void) { writeSingleCommand(0x40); // запись данных, автоматический адрес digitalWrite(m_STB, LOW); shiftOut(m_DIO, m_CLK, LSBFIRST, 0xC0); // Установка адреса в 0 register uint8_t * p = (uint8_t *) m_ledGRID; for (int8_t i = 0; i < ledDataLength; i++, p++) shiftOut(m_DIO, m_CLK, LSBFIRST, *p); // запись данных digitalWrite(m_STB, HIGH); delayMicroseconds(1); // Пауза до следующей команды } // // Чтение состояния кнопок с TM1628 // uint8_t TM1628L::readKeyData(void) { digitalWrite(m_STB, LOW); shiftOut(m_DIO, m_CLK, LSBFIRST, 0x42); // чтение данных pinMode(m_DIO, INPUT_PULLUP); delayMicroseconds(1); byte buffer[keyDataLength]; for (int i=0; i < keyDataLength; i++) buffer[i] = shiftIn(m_DIO, m_CLK, LSBFIRST); pinMode(m_DIO, OUTPUT); digitalWrite(m_STB, HIGH); //for (int i = 0; i < keyDataLength; i++) { // Serial.print(buffer[i], HEX); // Serial.print(' '); //} //Serial.println(); //delay(500); m_lastKeys = 0; if (buffer[1] & 0x10) m_lastKeys |= KEY_2_BLUE; if (buffer[1] & 0x02) m_lastKeys |= KEY_1_BLUE; if (buffer[2] & 0x02) m_lastKeys |= KEY_2_RED; if (buffer[0] & 0x10) m_lastKeys |= KEY_1_RED; if (buffer[4] & 0x10) m_lastKeys |= POWER_2; if (buffer[4] & 0x02) m_lastKeys |= POWER_1; return m_lastKeys; } // // Показать знак value в позиции position (0-6) // void TM1628L::showSymbol(const uint8_t position, const uint8_t value) { if (position > 6) return; // цифры у нас с 0-ой по 6-ую справа налево m_ledGRID[position] = value; } // // Показать цифру value (0 - 9) в позиции position (0-5) // void TM1628L::showDigit(const uint8_t position, const uint8_t value) { if (position > 5 || value > 9) return; // цифры у нас с 0-ой по 5-ую справа налево, значения - 0-9 m_ledGRID[position] = digits[value]; } // // Зажечь (newState == true) или погасить (newState == false) // светодиод led (LE5 - LE8) // Возвращает прежнее состояние // bool TM1628L::setLED(const ExtraLeds led, const bool newState) { const bool res = m_ledGRID[6] & led; if (newState) showSymbol(6, m_ledGRID[6] | led); showSymbol(6, m_ledGRID[6] & ~led); return res; }#include <TM1628L.h> #define PIN_DIO1 9 #define PIN_CLK1 8 #define PIN_STB1 7 TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1); void setup(void) { Serial.begin(115200); panel1.init(); panel1.showSymbol(6, 0xFF); } void loop(void) {}#include <TM1628L.h> #define PIN_DIO1 9 #define PIN_CLK1 8 #define PIN_STB1 7 TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1); void setup(void) { Serial.begin(115200); panel1.init(); panel1.showSymbol(0, 0xFF); panel1.showSymbol(1, 0xFF); panel1.showSymbol(2, 0xFF); panel1.showSymbol(3, 0xFF); panel1.showSymbol(4, 0xFF); panel1.showSymbol(5, 0xFF); panel1.showSymbol(6, 0xFF); panel1.updateDisplay(); } void loop(void) {}#include <TM1628L.h> #define PIN_DIO 6 #define PIN_CLK 5 #define PIN_STB 4 #define PIN_DIO1 9 #define PIN_CLK1 8 #define PIN_STB1 7 TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB); TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1, LGL, LGR); static uint32_t oldMillis; void testAllNumbers(void) { for (int i = 0; i < 1000; i++) { panel.leftPanel.setValue(i); panel.rightPanel.setValue(999 - i); panel.updateDisplay(); panel1.leftPanel.setValue(i); panel1.rightPanel.setValue(999 - i); panel1.updateDisplay(); delay(20); } } void test1(void) { for (int i = 0; i < 7; i++) { panel.showSymbol(i, 0xff); panel.updateDisplay(); delay(4000); } } void setup(void) { Serial.begin(115200); panel.init(); panel1.init(); delay(4000); // testAllNumbers(); // test1(); oldMillis = millis(); } void loop(void) { const uint32_t curMillis = millis(); if (panel.readKeys()) panel.updateDisplay(); if (panel1.readKeys()) panel1.updateDisplay(); if (curMillis - oldMillis >= 5000L) { oldMillis = curMillis; Serial.print("Panel (Left: "); Serial.print(panel.leftPanel.getValue());//getValue что в данных Serial.print("; Right: "); Serial.print(panel.rightPanel.getValue()); Serial.print(") Panel1 (Left: "); Serial.print(panel1.leftPanel.getValue());//getValue что в данных Serial.print("; Right: "); Serial.print(panel1.rightPanel.getValue()); Serial.println(); } } ///// Всё! Веселье закончилось!#include <TM1628L.h> #define PIN_DIO 6 #define PIN_CLK 5 #define PIN_STB 4 #define PIN_DIO1 9 #define PIN_CLK1 8 #define PIN_STB1 7 TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB); TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1, LGL, LGR); static uint32_t oldMillis; void testAllNumbers(void) { for (int i = 0; i < 1000; i++) { panel.leftPanel.setValue(i); panel.rightPanel.setValue(999 - i); panel.updateDisplay(); panel1.leftPanel.setValue(i); panel1.rightPanel.setValue(999 - i); panel1.updateDisplay(); delay(20); } } void test1(void) { for (int i = 0; i < 7; i++) { panel.showSymbol(i, 0xff); panel.updateDisplay(); delay(4000); } } void setup(void) { Serial.begin(115200); panel.init(); panel1.init(); // delay(4000); // testAllNumbers(); // test1(); oldMillis = millis(); } void loop(void) { const uint32_t curMillis = millis(); panel.setRedLeftLED(panel.leftPanel.getValue() > 250); panel.setRedRightLED(panel.rightPanel.getValue() > 200); panel.updateDisplay(); // panel1.setRedLeftLED(panel1.leftPanel.getValue() > 150); panel1.setRedRightLED(panel1.rightPanel.getValue() > 100); panel1.updateDisplay(); // if (panel.readKeys()) panel.updateDisplay(); if (panel1.readKeys()) panel1.updateDisplay(); if (curMillis - oldMillis >= 5000L) { oldMillis = curMillis; Serial.print("Panel (Left: "); Serial.print(panel.leftPanel.getValue());//getValue что в данных Serial.print("; Right: "); Serial.print(panel.rightPanel.getValue()); Serial.print(") Panel1 (Left: "); Serial.print(panel1.leftPanel.getValue());//getValue что в данных Serial.print("; Right: "); Serial.print(panel1.rightPanel.getValue()); Serial.println(); } } ///// Всё! Веселье закончилось!Здравствуйте ЕвгенийП И вот какая интересная штука выявилась Если с етим кодом включен монитор порта то значения держатся а если монитор выключить то они примерно через 10-15 секунд обнуляются )) Проверил delay нету нигде а где были закоментировал не помогло
С каким "етим кодом"? Моим? Или Вы добавили чего? И что значит обнуляются? Прямо на экране?
без каких либо дополнений, да прям на экране
Ну, значит, она у Вас перегружается. Скорее всего из-за питания или чего-нмбудь подобного. Может, конечно, и программно чего, но вряд ли - там нет работы с памятью.
Для начала убедитесь, что она именно перегружается. Сможете?
Как именно можно убедится если включить монитор порта то он не перегружается
И вот ещё что выявилось если выкллючить выключатели на передней панели дисплеи загораются со значением 0
Кнопки не работают естественно
Значит, давайте по-порядку.
1. Когда Вы питаете от USB оно работает, а когда питаете от "родного" питания в устройстве, оно иногда обнуляется. Значит, 90% проходит скачок по питанию (например, при включении нагрузки) и ардуина перегружается. Проверить это очень просто. Присоедините к ардуине какой-нибудь buzzer и вставьте в setup полусекундный писк. При запуске она пискнет. А потом, если при обнулении пискнет снова - значит действительно произошла перезагрузка. Проверьте.
2. Мы же с Вами выключали и всё было нормально? Или сейчас у Вас там нагрузка есть? Если так, то вполне может быть опять же "перезагрузка". Когда будете проверять п.1. Пощёлкайте и выключателем - если будет пищать, значит перезагрузка.
Если происходит перезагрузка, то почти наверняка дело в питании. Если бы дело было в программе - она бы всегда обнулялалсь, хоть с USB, хоть без. Ну, совсем чтобы убедиться, запитайте ардуину не от USB, а от совсем постороннего БП (только земли соедините) и убедитесь.
Если подтвердится, что проблема в питании, это уже Ваша епархия - Вы же электронщик, а не я. Ставьте там конденсаторы, дроссели или чего там ещё положено, в общем обеспечьте стабильное питание.