7- cегментный дисплей для arduino

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Температуру, если она Вам нужна сама ардуина тоже умеете измерять.

Хотите мигать двоеточием. Ну, можно просто "блинк" на него напустить. Вы с какой частотой хотите мигать?

А что сейчас делать.

1. Продумать что Вы хотите от сових часов. Продумать и выписать все фичи и возможности (например, про темепратуру я сегодня впервые услышал).

2. Когда всё выписано, потихоньку делать всё шаг за шагом.

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

4. Закончить программирование и сделать корпус 

1. блинк? я вроде это в примерах скетчей видел. Не знаю с какой частотой, это уже надо смотреть и регулировать. А так наверное раз в секунду-две.

2.изначально я хотел просто часы, но сейчас решил поставить туда ещё всяких фич,зря я что-ли покупал эти провода и макетку? . Про температуру я знаю,что и модуль часов может измерять. Но там точность такая себе. Поэтому захотелось dht22 чтобы ещё и влажность узнать. Ну и будильник думаю запилить, но это уже как пойдет и не супер важно.

3 преобразователь 220 на 12 уже в пути из китая.

 

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

Ну вот и займитесь составленим списка фич. Иначе Вы никогда не закончите работы. Например, утановка времени (кнопками или автоматически по интернету) нужна? Таймер? Будильник чем будить будет? Нужна пищалка или надо MP3 проигрывать? Может туда ещё радио присобачить?

В общем, составьте список, "утвердите" его и делайте. Иначе никогда не закончите, всё время будет что-то новое всплывать.

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

Да, кстати, как только придёт БП и преобразователь, имеет смысл спаять плату экрана на которой будет Ваш индикатор и все регистры (а может и преобразователь). У этой платы будет всего 5 или 6 выводов - представьте насколько меньше соплей будет на макетке! Сейчас ведь у Вас там туева хуча проводов и почти все - для экрана. А когда будет плата, они все уберутся.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Ну вот и займитесь составленим списка фич. Иначе Вы никогда не закончите работы. Например, утановка времени (кнопками или автоматически по интернету) нужна? Таймер? Будильник чем будить будет? Нужна пищалка или надо MP3 проигрывать? Может туда ещё радио присобачить?

В общем, составьте список, "утвердите" его и делайте. Иначе никогда не закончите, всё время будет что-то новое всплывать.

по поводу установки времени не решил ещё это оставлю на последний момент или там будут серьезные изменения в коде?

Будилиьник, если уж делать, то mp3, это получается динамик из любой колонки выпаять. Но ещё же нужно куда-то записать мелодию, это нужен будет модуль для сд карты? 

 

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Да, кстати, как только придёт БП и преобразователь, имеет смысл спаять плату экрана на которой будет Ваш индикатор и все регистры (а может и преобразователь). У этой платы будет всего 5 или 6 выводов - представьте насколько меньше соплей будет на макетке! Сейчас ведь у Вас там туева хуча проводов и почти все - для экрана. А когда будет плата, они все уберутся.

спаять вы имеете ввиду вытравить дорожки? с этим проблема потому что я был на ждановичах и по длинне там больше 20см нету текстолита. Я видел там только плату паечную( с отверстиями) длинной где-то 25 см.

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

protone77 пишет:

 по длинне там больше 20см нету текстолита. 

А Вам сколько надо?

Во-первых, текстолит намного дешевле покупать большими листами типа метр на метр или метр на два. Ну, а так - закажите в другом месте - этого добра везде навалом, например http://www.chipdip.ru/ в Белоруссию доставляет.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

protone77 пишет:

 по длинне там больше 20см нету текстолита. 

А Вам сколько надо?

Во-первых, текстолит намного дешевле покупать большими листами типа метр на метр или метр на два. Ну, а так - закажите в другом месте - этого добра везде навалом, например http://www.chipdip.ru/ в Белоруссию доставляет.

длинна всех сегментов вместе 28 см, а если от пина до пина то 24, но ещё где-то см между ними под двоеточие

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

protone77 пишет:

по поводу установки времени не решил ещё это оставлю на последний момент или там будут серьезные изменения в коде?

Да, код-то хрен с ним, код и с готовой платой допиливать можно. Там нужны либо кнопки, либо Wi-Fi модуль, под всё это надо провода/разъёмы на плате предусматривать. Если W-Fi, то полевой транзистор, чтобы включать ему питание только когда нужно.

protone77 пишет:

Будилиьник, если уж делать, то mp3, это получается динамик из любой колонки выпаять. Но ещё же нужно куда-то записать мелодию, это нужен будет модуль для сд карты? 

Если на MP3, то нужна вот такого типа хрень. Мелодии можно на SD записать. Но она только на наушники играет, так что ещё нужен усилитель Например вот такой, но он моно, так что если хочется стерео, то нужно поискать другой или брать два таких.

Опять же, всё это надо на плате размещать, поэтому надо заранее продумать, до изготовления платы.

 

 

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

Пока речь идёт об экране (о его плате). Его можно делать как только придёт БП и Вы всё перепроверите, особенно токи. Это стльно уменьшить количество проводов. Советую Вам сначала нарисовать плату, а потом уж смотреть какого она размера.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

protone77 пишет:

по поводу установки времени не решил ещё это оставлю на последний момент или там будут серьезные изменения в коде?

Да, код-то хрен с ним, код и с готовой платой допиливать можно. Там нужны либо кнопки, либо Wi-Fi модуль, под всё это надо провода/разъёмы на плате предусматривать. Если W-Fi, то полевой транзистор, чтобы включать ему питание только когда нужно.

protone77 пишет:

Будилиьник, если уж делать, то mp3, это получается динамик из любой колонки выпаять. Но ещё же нужно куда-то записать мелодию, это нужен будет модуль для сд карты? 

Если на MP3, то нужна вот такого типа хрень. Мелодии можно на SD записать. Но она только на наушники играет, так что ещё нужен усилитель Например вот такой, но он моно, так что если хочется стерео, то нужно поискать другой или брать два таких.

Опять же, всё это надо на плате размещать, поэтому надо заранее продумать, до изготовления платы.

 

 

кнопки лучше будут, я думаю. А по поводу mp3 мелодии я ещё подумаю. 

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Пока речь идёт об экране (о его плате). Его можно делать как только придёт БП и Вы всё перепроверите, особенно токи. Это стльно уменьшить количество проводов. Советую Вам сначала нарисовать плату, а потом уж смотреть какого она размера.

ну этой плате грубо говоря будет разводка от регистров к сегментам ну и соединение питания и тд между самими регистрами ? я представляю примерно, как будет выглядеть. Буду рисовать. Потом закину скрин

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

Какой скрин???

Вы в чём рисовать собрались?

В какой программе?

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Какой скрин???

Вы в чём рисовать собрались?

В какой программе?

в той которую вы скидывали сприн лейаут

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

Ага, хорошо.

Кстати, подумайте о варианте самостоятельной платы для каждой цифры, а то у Вас получается огромная - пустая плата. И дорого и травить неудобно. Если самостоятельная плата для каждой цифры даст экономию, то лучше так и сделать. Плата - на на ней одна цифра, регистр и все нужные резисторы. В плате предусмотреть пару отверстий (вне индикатора) для крепежа, а потом их все прикрепить к куску фанеры. Разумеется в платах должны быть контакты для проводов, чтобы их вместе соединить.

Еще момент. Посмотрите на свои индикаторы. Что у них снизу. Некоторые залиты компаундом по самый низ, а у некоторых бывает там пустота. Если у Вас с пустотой, то резисторы и сдвиговый регистр можно прямо под индикатором расположить, чтобы места не занимали.

И ещё одна идея. Может Вам сейчас сделать на пате(ах) готовые идужие часы, но свободные выводы ардуины и выитание вывести на разъём. Тогда у Вас будут готовые часы, а всякие расширения типа температуры и будильника можно будет делать отдельно и через разъём присоединять.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Ага, хорошо.

Кстати, подумайте о варианте самостоятельной платы для каждой цифры, а то у Вас получается огромная - пустая плата. И дорого и травить неудобно. Если самостоятельная плата для каждой цифры даст экономию, то лучше так и сделать. Плата - на на ней одна цифра, регистр и все нужные резисторы. В плате предусмотреть пару отверстий (вне индикатора) для крепежа, а потом их все прикрепить к куску фанеры. Разумеется в платах должны быть контакты для проводов, чтобы их вместе соединить.

Еще момент. Посмотрите на свои индикаторы. Что у них снизу. Некоторые залиты компаундом по самый низ, а у некоторых бывает там пустота. Если у Вас с пустотой, то резисторы и сдвиговый регистр можно прямо под индикатором расположить, чтобы места не занимали.

И ещё одна идея. Может Вам сейчас сделать на пате(ах) готовые идужие часы, но свободные выводы ардуины и выитание вывести на разъём. Тогда у Вас будут готовые часы, а всякие расширения типа температуры и будильника можно будет делать отдельно и через разъём присоединять.

самостоятельная плата для цифры хорошая идея.

да, в индикаторах есть углубление сверху. высотой в 1 см примерно.

не совсем понял, что вы имели ввиду про "но свободные выводы ардуины и выитание вывести на разъём" https://youtu.be/5dXOXyj4kOo?t=2m что-то на подобии как в этом видео?

или вот как тут http://mysku.ru/blog/ebay/32542.html

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

Не могу смотреть видео.

Ну, Вы Ардуино Нано видели? У неё все выводы торчат как ноги.

Теперь представили, что Вы сделали плату часов. На плате час, ардуина, регистры, ну всё барахло. Часы идут себе, тикают. Часть ног ардуины занято под это дело. А ноги, которые не заняты вы вывели на такую же "гребёнку" - пачку торчащих пинов, как у Нано. Тогда, если Вам нужно расширить устройство (например, будильник добавить), Вы делаете "плату расширения", а с аруиной (которая на плате часов) эту новую плату соединяете через ту "гребёнку". ВОт и получается, что ардуина, которая давно уже стоит на плате часов теперь может управлять и новой платой расширения.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Не могу смотреть видео.

Ну, Вы Ардуино Нано видели? У неё все выводы торчат как ноги.

Теперь представили, что Вы сделали плату часов. На плате час, ардуина, регистры, ну всё барахло. Часы идут себе, тикают. Часть ног ардуины занято под это дело. А ноги, которые не заняты вы вывели на такую же "гребёнку" - пачку торчащих пинов, как у Нано. Тогда, если Вам нужно расширить устройство (например, будильник добавить), Вы делаете "плату расширения", а с аруиной (которая на плате часов) эту новую плату соединяете через ту "гребёнку". ВОт и получается, что ардуина, которая давно уже стоит на плате часов теперь может управлять и новой платой расширения.

а, ну тогда понятно

protone77
Offline
Зарегистрирован: 02.10.2016

как получу датчик, докуплю провода для 4 сегмента попробую написать код, чтобы показывало время температуру и влажность. Может к тому времени и питание придёт из китая на почту

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

А как Вы собираетесь переключаться между временим, температурой и влажностью? Кнопка-то есть? Или что Вы там будете использовать?

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

А как Вы собираетесь переключаться между временим, температурой и влажностью? Кнопка-то есть? Или что Вы там будете использовать?

я планировал так, допустим показывает время секунд 20, потом переключается на температуру на 3 секунды, потом влажность на 3 секунды и опять время. Через дилей такое можно сделать?

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

Ну, почему нет, возможно. Лучше, конечно, без делэя обойтись, но можно и так.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Ну, почему нет, возможно. Лучше, конечно, без делэя обойтись, но можно и так.

а чем он плох, или есть команда лучше чем дилей?

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

Ну, сам по себе ничем не плох. На показ времени это не отразится, т.к. он у Вас на прерывании.

Но, если Вы захотите, например, установку времени делать кнопками, то Вам нужно быдет либо завести кнопки тоже на прерывание, либо забыть о делэе потому что, если опрос кнопок Вы будете делать в loop, то во время делэя он (опрос) производится не будет и нажатия будут игнорироваться, что не есть хорошо.

protone77
Offline
Зарегистрирован: 02.10.2016

получил я датчик, и основываясь на коде у, который часы показывает написал вот это, только не понимаю, почему показвается температура, влажно и потом всё. Останавливается изображение и ничего не меняется, не обновляется, хоть я и нагревал датчик.

#include <Wire.h> 
#include <SPI.h> 
#include "DHT.h" 
#define DHTPIN 2 
#define latchpin 10 
#define clockpin 13 
#define datapin 11 
#define SEG_A 0b10111111 
#define SEG_B 0b11011111 
#define SEG_C 0b11101111 
#define SEG_D 0b11110111 
#define SEG_E 0b11111011 
#define SEG_F 0b11111101 
#define SEG_G 0b11111110 
#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_10 (SEG_A & SEG_D & SEG_E & SEG_F) 
#define SYMBOL_11 (SEG_F & SEG_G & SEG_E & SEG_B & SEG_C) 
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE);
 
void showweather(){
dht.begin(); 
int t,h; 
t = dht.readTemperature(); 
h = dht.readHumidity(); 
Serial.println(t);
Serial.print(h); 
static const uint8_t allDigits[] = { SYMBOL_0, SYMBOL_1,SYMBOL_2,SYMBOL_3,SYMBOL_4,SYMBOL_5,SYMBOL_6,SYMBOL_7,SYMBOL_8,SYMBOL_9,SYMBOL_10,SYMBOL_11}; 
digitalWrite(latchpin, LOW); 
SPI.transfer( SYMBOL_10); 
SPI.transfer( allDigits[t%10]); 
SPI.transfer( allDigits[t/10]); 
digitalWrite(latchpin, HIGH); 
delay(3000); 
digitalWrite(latchpin, LOW); 
SPI.transfer( SYMBOL_11); 
SPI.transfer( allDigits[h%10]); 
SPI.transfer( allDigits[h/10]); 
digitalWrite(latchpin, HIGH); 

  }
void setup() { 
Serial.begin(9600); 

SPI.begin(); 
SPI.setBitOrder(LSBFIRST); 
showweather();




} 
void loop() { 

}

 

protone77
Offline
Зарегистрирован: 02.10.2016

аа, всё я понял и только сейчас заметил, что у меня всё в сэтапе, а надо было в луп отправить showweather()  и всё заработало

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

:)

protone77
Offline
Зарегистрирован: 02.10.2016
#include <Wire.h> 
#include <SPI.h> 
#include "DHT.h" 
#include <DS3231.h>
#define PIN_SQW 3
#define DHTPIN 2 
#define latchpin 10 
#define clockpin 13 
#define datapin 11 
#define SEG_A 0b10111111 
#define SEG_B 0b11011111 
#define SEG_C 0b11101111 
#define SEG_D 0b11110111 
#define SEG_E 0b11111011 
#define SEG_F 0b11111101 
#define SEG_G 0b11111110 
#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_10 (SEG_A & SEG_D & SEG_E & SEG_F) 
#define SYMBOL_11 (SEG_F & SEG_G & SEG_E & SEG_B & SEG_C) 
#define DHTTYPE DHT11 
static DS3231 Clock;

void showTime(){
  int h,m;
  h=Clock.getHour();   
  m=Clock.getMinute();
  static const uint8_t allDigits[] = { SYMBOL_0, SYMBOL_1,SYMBOL_2,SYMBOL_3,SYMBOL_4,SYMBOL_5,SYMBOL_6,SYMBOL_7,SYMBOL_8,SYMBOL_9,SYMBOL_10,SYMBOL_11};
  digitalWrite(latchpin, LOW);       
  SPI.transfer( allDigits[m%10]); 
  SPI.transfer( allDigits[h%10]);
  SPI.transfer( allDigits[h/10]); 
  digitalWrite(latchpin, HIGH);  
  }

DHT dht(DHTPIN, DHTTYPE);

void showweather(){  
int t,h; 
t = dht.readTemperature(); 
h = dht.readHumidity(); 
Serial.println(t);
Serial.print(h); 
static const uint8_t allDigits[] = { SYMBOL_0, SYMBOL_1,SYMBOL_2,SYMBOL_3,SYMBOL_4,SYMBOL_5,SYMBOL_6,SYMBOL_7,SYMBOL_8,SYMBOL_9,SYMBOL_10,SYMBOL_11}; 
digitalWrite(latchpin, LOW); 
SPI.transfer( SYMBOL_10); 
SPI.transfer( allDigits[t%10]); 
SPI.transfer( allDigits[t/10]); 
digitalWrite(latchpin, HIGH); 
delay(3000); 
digitalWrite(latchpin, LOW); 
SPI.transfer( SYMBOL_11); 
SPI.transfer( allDigits[h%10]); 
SPI.transfer( allDigits[h/10]); 
digitalWrite(latchpin, HIGH); 
delay(3000);
}


static void everyMinuteAlarm(void) {
  const byte oldSReg = SREG;
  sei();
  showTime();
  Clock.clearAlarmSignal(2);
  SREG = oldSReg;
}

  
void setup() { 
  Serial.begin(115200);
  dht.begin();
  pinMode(PIN_SQW, INPUT);
  Wire.begin();
  Clock.setClockMode(false);  // Часы в 24-часовом режиме. Нужен 12-ти - пишем true
  Clock.turnOffAlarm(2);  //  Для очистки совести, мы не знаем что там часы делают
  Clock.EnableMinuteInterrupt();  // включаем ежеминутное прерывание
  attachInterrupt(PIN_SQW - 2, everyMinuteAlarm, FALLING);  // собираемся его обрабатывать

} 
void loop() { 
  SPI.begin(); 
SPI.setBitOrder(LSBFIRST); 

showTime();
delay(5000);
showweather();

}

вот, соеденил я 2 скетча. Всё работает, но мне кажется что-то не так)

 

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

Конечно. Всё не так.

Представьте себе, что в момент когда на экране температура проихсодит переход через минуту. Сработает Ваша функция everyMinuteAlarm и спокойно покажет время. Хотя в данный момент должна бы по идее показываться температура. Так?

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Конечно. Всё не так.

Представьте себе, что в момент когда на экране температура проихсодит переход через минуту. Сработает Ваша функция everyMinuteAlarm и спокойно покажет время. Хотя в данный момент должна бы по идее показываться температура. Так?

ну в вместе соеденить функцию часов и датчика нельзя. Можно ли вeveryMinuteAlarm  вписать так: когда происходит переход минуты и в этот момент показана температура, не выводить время на экран? Через операторы иф,экс. 

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

protone77 пишет:

Можно ли вeveryMinuteAlarm  вписать так: когда происходит переход минуты и в этот момент показана температура, не выводить время на экран? Через операторы иф,экс. 

Можно, конечно, но там больно много if'ов полуится. особенно с перспективой расширения функций (вдруг Вам ещё один датчик подарят :))) Или если Вы захотите таки переключаемо сделать. В общем такой подход хорош для студента или школьника, профессионалы так обычно не делают.

Правильный подход - иметь виртуальные экраны. Каждые источник информации (термометр, гигрометр, часы, ещё чего) постоянно выводят иноформация на свой виртуальный экран и вообще не парятся что в данный момент показывается на физическом экране. А отдельная маленькая функциюшка умеет переключать физический экран на тот или иной виртуальный. Подумайте как это сделать. Не придумаете, тогда покажу.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

protone77 пишет:

Можно ли вeveryMinuteAlarm  вписать так: когда происходит переход минуты и в этот момент показана температура, не выводить время на экран? Через операторы иф,экс. 

Можно, конечно, но там больно много if'ов полуится. особенно с перспективой расширения функций (вдруг Вам ещё один датчик подарят :))) Или если Вы захотите таки переключаемо сделать. В общем такой подход хорош для студента или школьника, профессионалы так обычно не делают.

Правильный подход - иметь виртуальные экраны. Каждые источник информации (термометр, гигрометр, часы, ещё чего) постоянно выводят иноформация на свой виртуальный экран и вообще не парятся что в данный момент показывается на физическом экране. А отдельная маленькая функциюшка умеет переключать физический экран на тот или иной виртуальный. Подумайте как это сделать. Не придумаете, тогда покажу.

ок,завтра займусь)

protone77
Offline
Зарегистрирован: 02.10.2016

Не знаю, может я не так искал, но в интернете что-то инфы мало про виртуальные экраны. Наверное надо каждой функции присвоить переменную и уже дальше писать код, который будет выбирать, какую переменную показывать, но как такое сделать мне знаний не хватает пока(

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

Вечером помогу, сейчас бежать надо. Те коды, что Вы выкладывали актальны? Если что-то менялось, выложите свежачок, я из них буду делать пример с виртуальными экранами..

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Вечером помогу, сейчас бежать надо. Те коды, что Вы выкладывали актальны? Если что-то менялось, выложите свежачок, я из них буду делать пример с виртуальными экранами..

да, ничего не менял)

protone77
Offline
Зарегистрирован: 02.10.2016

вот, нужно было разводку нарисовать. Но я думаю может удобней будет по 2 сегмента на 1 плате? меньше проводов будет. 

https://drive.google.com/open?id=0Bw68TyJ34XNUQ1VMdUxuVmlYbkU

p/s рисую в ней первый раз

 

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

protone77 пишет:

p/s рисую в ней первый раз

Не вижу места под рещисторы, Вы прямо от регистра на дисплей ведёте.

Поскольку Вы травите впервые, не мельчите. Зачем Вам дорожки по 0.8? делайте по миллиметру а то и по полтора.

Да, кстати, извините. вечра не успел с примером. Сейчас занимаюсь.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

protone77 пишет:

p/s рисую в ней первый раз

Не вижу места под рещисторы, Вы прямо от регистра на дисплей ведёте.

Поскольку Вы травите впервые, не мельчите. Зачем Вам дорожки по 0.8? делайте по миллиметру а то и по полтора.

Да, кстати, извините. вечра не успел с примером. Сейчас занимаюсь.

 

исправил 

https://drive.google.com/open?id=0Bw68TyJ34XNUTjhRbE41a1FZR3M

 

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

Теперь про пример, давайте я заодно пройдусь по Вашему коду с замечаниями и попутно пример сделаем.

Сначала замечания.

1.
строки 8-9 не нужны. Вы же не используете эти константы, ну и чего захламлять?

2.
Строки 10-11 определяют символы С и H, Ну и называйте их SYMBOL_C и SYMBOL_H – потом в жизни не вспомните что за 10 и 11.

3.
Зачем Вы добавили буквы в массив символов? Вы же их там не используете. Либо надо использовать, либо убрать, чтобы память не занимали

4..
Что делают строки 89-90 в функции loop? Это делается один раз, зачем Вы это делаете 100500 раз? Переносим в setup.

5.
В наборе символов не хватает пустого символа, когда в какую-то позицию ничего выводить не надо, а надо её погасить. Я добавил SYMBOL_EMPTY

6.
Никогда не повторяйте один и тот же код несколько раз. Если это больше двух строк – оформляйте функцией.

Ну, поехали про виртуальные экраны.

Суть проблемы: есть физический экран, на котором показываются 4 знака. Он один. И есть несколько источников информации (часы, термометр, …) которые должны в то или иное время показываться на физическом экране. Но для этого источник  должен быть уверен, что в данный момент показываются именно он. Вылазит куча проверок. Кроме того, некоторые источники достаточно долго получают свою информацию (например, термометр может до секунды «думать», пока температуру получит). Ну и что делать? Допустим, переключаем экран на показ температуры и термометр начинает секунду думать, а только потом покажет?

Главная идея: заводим собственный виртуальный экран для каждого источника информации. Такой же четырёхсимвольный. Источник работает по своему расписанию, получает информацию и выводит её на свой виртуальный экран. Он (источник) понятия не имеет показывается ли в данный момент этот виртуальный экран на физическом или нет – его это не касается. Его дело вывести. Не показывается сейчас – покажется потом. Источник просто работает со своим виртуальным экраном и ни о чём не парится. Это его собственный экран, так что никакие проверки не нужны.

Поскольку экран у нас четырёхсимвольный, в качестве виртуального экрана будем использовать массив из четырёх символов. Заводим три виртуальных экрана:

static uint8_t clockScreen[4];	// Экран для часов
static uint8_t temperatureScreen[4];	// Экран для температуры
static uint8_t humidityScreen[4];	// Экран для влажности

Физический экран у нас будет представлен указателем на виртуальный экран. Изначально будем считать, что активным (т.е. показываемым на физическом экране) является экран часов. Так и напишем:

static uint8_t * physicalScreen = clockScreen; // физический экран - просто указатель на виртуальный

Напишем функцию показа информации на физическом экране. 

void showOnScreen(const uint8_t *screen) {
	if (screen != physicalScreen) return;
	digitalWrite(LATCH_PIN, LOW); 
	SPI.transfer(physicalScreen[0]); 
	SPI.transfer(physicalScreen[1]); 
	SPI.transfer(physicalScreen[2]); 
	SPI.transfer(physicalScreen[3]); 
	digitalWrite(LATCH_PIN, HIGH); 
}

Обратите внимание, у неё есть параметр – виртуальный экран. Она проверяет, если переданный виртуальный экран НЕ активен (т.е. НЕ равен физическому), то ничего не делает, а показывает только, если ей передали адрес физического экрана. Это выглядит немного глупо, но позже нам эта глупость пригодится – мы к этому параметру ещё вернёмся. Пока же отметим, что она показывает всегда только текущий активный экран. Если параметр не совпадает с текущим активным, то не делает ничего.

Теперь напишем переключение (активацию) экранов. Если мы, например, решили показывать экран температуры, что мы должны сделать? Две вещи 1) присвоить «физическому экрану» адрес виртуального экрана температуры и 2) освежить физический экран – вывести на него новое содержимое. Так и пишем:

static inline void activateScreen(uint8_t * screen) {
	physicalScreen = screen;
	showOnScreen(physicalScreen);
}

Параметр этой функции - виртуальный экран, который нужно активировать. Чтобы не таскать названия виртуальных экранов всё время, напишем три функции активации экранов, которые вызывают эту с правильным параметром.

void activateClockScreen(void) { 
	activateScreen(clockScreen);
}

void activateTemperatureScreen(void) { 
	activateScreen(temperatureScreen);
}

void activateHumidityScreen(void) { 
	activateScreen(humidityScreen);
}

Собственно, про виртуальные и реальные экраны - всё.

Теперь, если кто-то будет аккуратно складывать в наши виртуальные экраны информацию, мы всегда можем показывать её на физическом экране и в любой момент переключать с одного виртуального экрана на другой, разве нет?

Давайте разберёмся, как будем складывать в виртуальные экраны.

Для начала напишем универсальную функцию, вывод в любой виртуальный экран. Она получает пять параметров: первый – в какой именно экран складывать, остальные четыре – это как раз четыре символа для складывания. Вот она.

static inline void fillUpScreen(uint8_t * screen, 
			const uint8_t s0 = SYMBOL_EMPTY,  const uint8_t s1 = SYMBOL_EMPTY,  
			const uint8_t s2 = SYMBOL_EMPTY,  const uint8_t s3 = SYMBOL_EMPTY) {
	screen[0] = s0;
	screen[1] = s1;
	screen[2] = s2;
	screen[3] = s3;
	showOnScreen(screen);
}

Обратите внимание, что кроме собственно складывания четырёх значений в виртуальный экран, она в строке 6 ещё вызывает функцию показа (мы её раньше определили) и передаёт ей свой виртуальный экран в качестве параметра. Вот этот тот самый «глупый» параметр, о котором мы говорили Выше. Смотрите что происходит. Информация в виртуальном экране изменилась. Вызывается функция показа и если данный виртуальный экран активен, то обновляется физический экран, а если нет – ничего происходит, пусть себе новая информация лежит в виртуальном экране и ждёт своего часа. Понятно для чего был нужен тот «глупый параметр»?

Теперь напишем функцию для часов, термометра и гигрометра, которые вызывают эту. Функции простые как валенок:

void time2Screen(uint8_t h, uint8_t m) {
	fillUpScreen(clockScreen, m % 10, m / 10, h % 10, h / 10);
}

void temperature2Screen(uint8_t t) {
	fillUpScreen(temperatureScreen, SYMBOL_C, t % 10, t / 10);
}

void humidity2Screen(uint8_t h) {
	fillUpScreen(humidityScreen, SYMBOL_H, h % 10, h / 10);
}

Всё понятно?

Ну, тогда перепишем основную программу. Термометр и гигрометр будем вызывать раз в минуту (когда часы переключаются). Тогда же и будем выводить результаты на виртуальные экраны (на все три). В loop же ничего не будем делать, только сидеть в делэях и каждые 10 секунд перещёлкивать экраны.

Смотрите, думаю, тут нет ничего нового для Вас.

static void everyMinuteAlarm(void) {
	const byte oldSReg = SREG;
	sei();
	time2Screen(Clock.getHour(), Clock.getMinute());
	temperature2Screen(dht.readTemperature());
	humidity2Screen(dht.readHumidity());
	Clock.clearAlarmSignal(2);
	SREG = oldSReg;
}

void setup(void) { 
	pinMode(PIN_SQW, INPUT);
	Serial.begin(115200);
	SPI.begin(); 
	SPI.setBitOrder(LSBFIRST); 
	dht.begin();
	Wire.begin();
	Clock.setClockMode(false);  // Часы в 24-часовом режиме. Нужен 12-ти - пишем true
	Clock.turnOffAlarm(2);  //  Для очистки совести, мы не знаем что там часы делают
	Clock.EnableMinuteInterrupt();  // включаем ежеминутное прерывание
	attachInterrupt(PIN_SQW - 2, everyMinuteAlarm, FALLING);  // собираемся его обрабатывать
	delay(10);	// на всякий случай, пусть всё устаканится.
	everyMinuteAlarm(); // Вызовем сразу, чтобы часы начали показываться сразу, а не ждали до начала минуты.
}

void loop(void) {
	static const unsigned long interScreenDeley = 10000;
	delay(interScreenDeley);
	activateTemperatureScreen(); 
	delay(interScreenDeley);
	activateHumidityScreen(); 
	delay(interScreenDeley);
	activateClockScreen(); 
}

Ниже приведёт код  «всё в одном». Предупреждаю, мне проверить не на чем, так что может я где и лопухнулся по мелочи. Идейно-то всё правильно, но мелкие ошибки бывают всегда. Если что, поправим.

#include <Wire.h> 
#include <SPI.h> 
#include "DHT.h" 
#include <DS3231.h>
#include <Adafruit_Sensor.h>

#define PIN_SQW 3
#define DHTPIN 2 
#define DHTTYPE DHT11 

static DS3231 Clock;
DHT dht(DHTPIN, DHTTYPE);

#define LATCH_PIN 10

#define SEG_A 0b10111111 
#define SEG_B 0b11011111 
#define SEG_C 0b11101111 
#define SEG_D 0b11110111 
#define SEG_E 0b11111011 
#define SEG_F 0b11111101 
#define SEG_G 0b11111110 
#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_C (SEG_A & SEG_D & SEG_E & SEG_F) 
#define SYMBOL_H (SEG_F & SEG_G & SEG_E & SEG_B & SEG_C) 
#define SYMBOL_EMPTY	0xFF

static const uint8_t allDigits[] = { SYMBOL_0, SYMBOL_1,SYMBOL_2,SYMBOL_3,SYMBOL_4,SYMBOL_5,SYMBOL_6,SYMBOL_7,SYMBOL_8,SYMBOL_9};

static uint8_t clockScreen[4];	// Экран для часов
static uint8_t temperatureScreen[4];	// Экран для температуры
static uint8_t humidityScreen[4];	// Экран для влажности

static uint8_t * physicalScreen = clockScreen; // физический экран - просто указатель на виртуальный

void showOnScreen(const uint8_t *screen) {
	if (screen != physicalScreen) return;
	digitalWrite(LATCH_PIN, LOW); 
	SPI.transfer(physicalScreen[0]); 
	SPI.transfer(physicalScreen[1]); 
	SPI.transfer(physicalScreen[2]); 
	SPI.transfer(physicalScreen[3]); 
	digitalWrite(LATCH_PIN, HIGH); 
}

static inline void fillUpScreen(uint8_t * screen, 
			const uint8_t s0 = SYMBOL_EMPTY,  const uint8_t s1 = SYMBOL_EMPTY,  
			const uint8_t s2 = SYMBOL_EMPTY,  const uint8_t s3 = SYMBOL_EMPTY) {
	screen[0] = s0;
	screen[1] = s1;
	screen[2] = s2;
	screen[3] = s3;
	showOnScreen(screen);
}

void time2Screen(uint8_t h, uint8_t m) {
	fillUpScreen(clockScreen, m % 10, m / 10, h % 10, h / 10);
}

void temperature2Screen(uint8_t t) {
	fillUpScreen(temperatureScreen, SYMBOL_C, t % 10, t / 10);
}

void humidity2Screen(uint8_t h) {
	fillUpScreen(humidityScreen, SYMBOL_H, h % 10, h / 10);
}

static inline void activateScreen(uint8_t * screen) {
	physicalScreen = screen;
	showOnScreen(physicalScreen);
}

void activateClockScreen(void) { 
	activateScreen(clockScreen);
}

void activateTemperatureScreen(void) { 
	activateScreen(temperatureScreen);
}

void activateHumidityScreen(void) { 
	activateScreen(humidityScreen);
}


static void everyMinuteAlarm(void) {
	const byte oldSReg = SREG;
	sei();
	time2Screen(Clock.getHour(), Clock.getMinute());
	temperature2Screen(dht.readTemperature());
	humidity2Screen(dht.readHumidity());
	Clock.clearAlarmSignal(2);
	SREG = oldSReg;
}

void setup(void) { 
	pinMode(PIN_SQW, INPUT);
	Serial.begin(115200);
	SPI.begin(); 
	SPI.setBitOrder(LSBFIRST); 
	dht.begin();
	Wire.begin();
	Clock.setClockMode(false);  // Часы в 24-часовом режиме. Нужен 12-ти - пишем true
	Clock.turnOffAlarm(2);  //  Для очистки совести, мы не знаем что там часы делают
	Clock.EnableMinuteInterrupt();  // включаем ежеминутное прерывание
	attachInterrupt(PIN_SQW - 2, everyMinuteAlarm, FALLING);  // собираемся его обрабатывать
	delay(10);	// на всякий случай, пусть всё устаканится.
	everyMinuteAlarm(); // Вызовем сразу, чтобы часы начали показываться сразу, а не ждали до начала минуты.
}

void loop(void) {
	static const unsigned long interScreenDeley = 10000;
	delay(interScreenDeley);
	activateTemperatureScreen(); 
	delay(interScreenDeley);
	activateHumidityScreen(); 
	delay(interScreenDeley);
	activateClockScreen(); 
}

Посмотрели? Ничего нового? Более или менее понятно? Тогда последний штрих. Работа с экраном(ами) (строки 14-92) на самом деле пишется один раз и лучше бы её убрать с глаз долой в другой файл. И глаза мозолит и случайные правки возможны (кошка пробежит по клавишам), давайте спрячем её. Умеете?

P.S. Если у Вас по-прежнему только три знака работют, просто закомментируйте одну из строк в функции showOnScreen и ничего другого не меняйте. Виртуальные экраны пусть остаются четырёхсимвольными - это никого не волнует.

protone77
Offline
Зарегистрирован: 02.10.2016

скомпилировалось, но время вообще не хочет показывать( рандомные знаки)

а температуру и влажность показывает (2 и далее отраженную зеркально шестерку)

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

 

Посмотрели? Ничего нового? Более или менее понятно? Тогда последний штрих. Работа с экраном(ами) (строки 14-92) на самом деле пишется один раз и лучше бы её убрать с глаз долой в другой файл. И глаза мозолит и случайные правки возможны (кошка пробежит по клавишам), давайте спрячем её. Умеете?

 

такого не делал никогда, но можно просто сделать отдельный файл и подключить, как библиотеку через инклюд?

 

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

protone77 пишет:

такого не делал никогда, но можно просто сделать отдельный файл и подключить, как библиотеку через инклюд?

Ну, я про это и спрашиваю, умеете ли Вы это делать.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

protone77 пишет:

такого не делал никогда, но можно просто сделать отдельный файл и подключить, как библиотеку через инклюд?

Ну, я про это и спрашиваю, умеете ли Вы это делать.

я попробовал и не получилось, так что нет

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

Давайте, сначала дожмём часы отдельно - в дщщз ВСЁ закомментируйте, тогда только часы будут показываться.

Что зачит рандомные? Может наоборот просто? Ну, тогда поменяйте порядок в строках 48-51 с 0-1-2-3 на 3-2-1-0

Если не поможет, то после строки 64 вставьте печать в сериал переменных h и m и напишите что печатается и что при этом показывается на экране.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Давайте, сначала дожмём часы отдельно - в дщщз ВСЁ закомментируйте, тогда только часы будут показываться.

Что зачит рандомные? Может наоборот просто? Ну, тогда поменяйте порядок в строках 48-51 с 0-1-2-3 на 3-2-1-0

Если не поможет, то после строки 64 вставьте печать в сериал переменных h и m и напишите что печатается и что при этом показывается на экране.

я сейчас уйду,вечером все исправлю. Рандомные.. ну я сделал вывод в монитор порта и следил за значениями. Когда там 8 показана,то на дисплее 0 и тд. Если что загружу фото

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

Не нужно фото, один хрен ничего не видно. Текстом давайте. Только скетч со вставленной печатью тоже выложите.

Т.е. 1) скетч 2) чего выводит в сериал и 3) чего видно на экранчике

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Не нужно фото, один хрен ничего не видно. Текстом давайте. Только скетч со вставленной печатью тоже выложите.

Т.е. 1) скетч 2) чего выводит в сериал и 3) чего видно на экранчике

#include <Wire.h> 
#include <SPI.h> 
#include "DHT.h" 
#include <DS3231.h>
#include <Adafruit_Sensor.h>

#define PIN_SQW 3
#define DHTPIN 2 
#define DHTTYPE DHT11 

static DS3231 Clock;
DHT dht(DHTPIN, DHTTYPE);

#define LATCH_PIN 10

#define SEG_A 0b10111111 
#define SEG_B 0b11011111 
#define SEG_C 0b11101111 
#define SEG_D 0b11110111 
#define SEG_E 0b11111011 
#define SEG_F 0b11111101 
#define SEG_G 0b11111110 
#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_C (SEG_A & SEG_D & SEG_E & SEG_F) 
#define SYMBOL_H (SEG_F & SEG_G & SEG_E & SEG_B & SEG_C) 
#define SYMBOL_EMPTY  0xFF

static const uint8_t allDigits[] = { SYMBOL_0, SYMBOL_1,SYMBOL_2,SYMBOL_3,SYMBOL_4,SYMBOL_5,SYMBOL_6,SYMBOL_7,SYMBOL_8,SYMBOL_9};

static uint8_t clockScreen[4];  // Экран для часов
static uint8_t temperatureScreen[4];  // Экран для температуры
static uint8_t humidityScreen[4]; // Экран для влажности

static uint8_t * physicalScreen = clockScreen; // физический экран - просто указатель на виртуальный

void showOnScreen(const uint8_t *screen) {
  if (screen != physicalScreen) return;
  digitalWrite(LATCH_PIN, LOW); 
  SPI.transfer(physicalScreen[0]); 
  SPI.transfer(physicalScreen[1]); 
  SPI.transfer(physicalScreen[2]); 
  SPI.transfer(physicalScreen[3]); 
  digitalWrite(LATCH_PIN, HIGH); 
}

static inline void fillUpScreen(uint8_t * screen, 
      const uint8_t s0 = SYMBOL_EMPTY,  const uint8_t s1 = SYMBOL_EMPTY,  
      const uint8_t s2 = SYMBOL_EMPTY,  const uint8_t s3 = SYMBOL_EMPTY) {
  screen[0] = s0;
  screen[1] = s1;
  screen[2] = s2;
  screen[3] = s3;
  showOnScreen(screen);
}

void time2Screen(uint8_t h, uint8_t m) {
  fillUpScreen(clockScreen, m % 10, m / 10, h % 10, h / 10);
}

void temperature2Screen(uint8_t t) {
  fillUpScreen(temperatureScreen, SYMBOL_C, t % 10, t / 10);
}

void humidity2Screen(uint8_t h) {
  fillUpScreen(humidityScreen, SYMBOL_H, h % 10, h / 10);
}

static inline void activateScreen(uint8_t * screen) {
  physicalScreen = screen;
  showOnScreen(physicalScreen);
}

void activateClockScreen(void) { 
  activateScreen(clockScreen);
}

void activateTemperatureScreen(void) { 
  activateScreen(temperatureScreen);
}

void activateHumidityScreen(void) { 
  activateScreen(humidityScreen);
}


static void everyMinuteAlarm(void) {
  const byte oldSReg = SREG;
  sei();
  time2Screen(Clock.getHour(), Clock.getMinute());
  temperature2Screen(dht.readTemperature());
  humidity2Screen(dht.readHumidity());
  Clock.clearAlarmSignal(2);
  SREG = oldSReg;
}

void setup(void) { 
  pinMode(PIN_SQW, INPUT);
  Serial.begin(115200);
  SPI.begin(); 
  SPI.setBitOrder(LSBFIRST); 
  dht.begin();
  Wire.begin();
  Clock.setClockMode(false);  // Часы в 24-часовом режиме. Нужен 12-ти - пишем true
  Clock.turnOffAlarm(2);  //  Для очистки совести, мы не знаем что там часы делают
  Clock.EnableMinuteInterrupt();  // включаем ежеминутное прерывание
  attachInterrupt(PIN_SQW - 2, everyMinuteAlarm, FALLING);  // собираемся его обрабатывать
  delay(10);  // на всякий случай, пусть всё устаканится.
  everyMinuteAlarm(); // Вызовем сразу, чтобы часы начали показываться сразу, а не ждали до начала минуты.
}

void loop(void) {
  static const unsigned long interScreenDeley = 10000;
//  delay(interScreenDeley);
//  activateTemperatureScreen(); 
// delay(interScreenDeley);
 // activateHumidityScreen(); 
//  delay(interScreenDeley);
  activateClockScreen(); 
  Serial.print(Clock.getHour());
  Serial.println(Clock.getMinute());
delay(5000);
//Serial.println (dht.readTemperature()); 
//Serial.println (dht.readHumidity());
}
 

вот скетч, менял с 0-3 на 3-0 все зеркально отразилось.

на мониторе порта время 22 11

на дисплее

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

Так, ну для начала, я же просил Вас закомментировать всё внутри loop - зачем Вы оставили строки 127-130. Комментируйте.

далее, коль скоро, мы рисуем из прерывания, доавайте наши экраны обзовём volatile. Для этого:

1. Добавьте слово volatile в начало строк 39, 40, 41 и 43
2. Добавьте слово volatile сразу после открывающей скобки в строках 55, 77

Опять же, коль скоро, работаем в прерывании, давайте использовать SPI транзакции. для этого

1. Строку 109 можно удалить (не обязательно, но она не нужна)
2. Перед (или после) строкой 47 ставим 
     SPI.beginTransaction(SPISettings(F_CPU/2, LSBFIRST, SPI_MODE0));
3. Перед или после строки 52 ставим 
    SPI.endTransaction();

Всё перечисленное, скорее всего не решит проблему, но это всё равно делать, так что давайте сделаем.

А вот что должно решить проблему. Я просто забыл об этом. Кстати, Вы это знали, могли бы и заметить - будьте внимательнее.

В строках 66, 70 и 74, в параметрах, везде, где это числа, добавьте  выбор из массив allDigits. Строки должны получиться примерно такие

fillUpScreen(clockScreen, allDigits[m % 10], allDigits[m / 10], allDigits[h % 10], allDigits[h / 10]);
fillUpScreen(temperatureScreen, SYMBOL_C, allDigits[t % 10], allDigits[t / 10]);
fillUpScreen(humidityScreen, SYMBOL_H, allDigits[h % 10], allDigits[h / 10]);
 

Если проблема осталась нерешённой, то опять, скетч, печать и чего показывает.

Если же проблема решится, то раскомментируйте всё в loop и проверьет остальные режимы.

protone77
Offline
Зарегистрирован: 02.10.2016

ЕвгенийП пишет:

Так, ну для начала, я же просил Вас закомментировать всё внутри loop - зачем Вы оставили строки 127-130. Комментируйте.

далее, коль скоро, мы рисуем из прерывания, доавайте наши экраны обзовём volatile. Для этого:

1. Добавьте слово volatile в начало строк 39, 40, 41 и 43
2. Добавьте слово volatile сразу после открывающей скобки в строках 55, 77

Опять же, коль скоро, работаем в прерывании, давайте использовать SPI транзакции. для этого

1. Строку 109 можно удалить (не обязательно, но она не нужна)
2. Перед (или после) строкой 47 ставим 
     SPI.beginTransaction(SPISettings(F_CPU/2, LSBFIRST, SPI_MODE0));
3. Перед или после строки 52 ставим 
    SPI.endTransaction();

Всё перечисленное, скорее всего не решит проблему, но это всё равно делать, так что давайте сделаем.

А вот что должно решить проблему. Я просто забыл об этом. Кстати, Вы это знали, могли бы и заметить - будьте внимательнее.

В строках 66, 70 и 74, в параметрах, везде, где это числа, добавьте  выбор из массив allDigits. Строки должны получиться примерно такие

fillUpScreen(clockScreen, allDigits[m % 10], allDigits[m / 10], allDigits[h % 10], allDigits[h / 10]);
fillUpScreen(temperatureScreen, SYMBOL_C, allDigits[t % 10], allDigits[t / 10]);
fillUpScreen(humidityScreen, SYMBOL_H, allDigits[h % 10], allDigits[h / 10]);
 

Если проблема осталась нерешённой, то опять, скетч, печать и чего показывает.

Если же проблема решится, то раскомментируйте всё в loop и проверьет остальные режимы.

всё заработало

да, не заметил, хотя код просматривал несколько раз раз:(

 

protone77
Offline
Зарегистрирован: 02.10.2016

Я, кстати нашел у себя 2 светодиода( правда синие, но когда сделаю, чтобы они мигали, достану красные) у них напряжение питания где-то 2.3в( соеденил 2 вместе и запитал от блока питания, начали светится где-то от 4.8, но у меня резистор стоял 1ком на всякий случай)

А как им мигать?? Я думаю можно к цифровым пинам подклчить и там через дилей поставить high и low?