два 8-ми сегментных индикаторов

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

здравствуйте, не могу понять про индикаторы. вообщем нужно по нажатии кнопки прибавлять цифру на индикаторе с 01 до 02 и т.д. до 99

примерный скетч набрасал, но это тупо каждая цифра 01,02,03,04 и т.д. набирается путем отдельной функции "void" 

как сделать проще?

001
002 
003 
004 
005void loop() {
006  if (millis()>dlya_sekund + 150){
007 if (digitalRead(12) == 0){
008 dlya_sekund = millis();
009 schet = schet +1;
010 if (schet > 12){
011  schet = 1;
012 }
013 }
014 else if (digitalRead(11) == 0){
015 dlya_sekund = millis();
016 schet = schet -1;
017 if (schet < 0){
018  schet = 12;
019 }
020 }
021  }
022 if (schet == 1){
023  A01();
024 }
025 else if (schet == 2){
026  A02();
027 }
028  else if (schet == 3){
029  A03();
030 }
031 else if (schet == 4){
032  A04();
033 }
034 else if (schet == 5){
035  A05();
036 }
037 else if (schet == 6){
038  A06();
039 }
040 else if (schet == 7){
041  A07();
042 }
043 else if (schet == 8){
044  A08();
045 }
046 else if (schet == 9){
047  A09();
048 }
049 else if (schet == 10){
050  A10();
051 }
052 else if (schet == 11){
053  A11();
054 }
055 else if (schet == 12){
056  A12();
057 }
058  
059 }
060 
061void A01()
062{
063   
064PORTD=(a0);// пишем "0" в порт D
065DDRB=B1; // первая цифра
066delay(70);
067PORTD=(a1);// пишем "1" в порт B
068DDRB=B10; //вторая цифра
069delay(70);
070 
071pusk();
072}
073void A02()
074{
075delay(70);
076PORTD=(a0);// пишем "0" в порт D
077DDRB=B1;
078delay(70);
079PORTD=(a2);// пишем "2" в порт В
080DDRB=B10;
081 
082pusk();
083}
084void A03()
085{
086delay(70);
087PORTD=(a0);// пишем "0" в порт D
088DDRB=B1;
089delay(70);
090PORTD=(a3);// пишем "3" в порт B
091DDRB=B10;
092 
093pusk();
094}
095void A04()
096{
097delay(70);
098PORTD=(a0);// пишем "0" в порт D
099DDRB=B1;
100delay(70);
101PORTD=(a4);// пишем "4" в порт B
102DDRB=B10;
103 
104pusk();
105}
106void A05()
107{
108delay(70);
109PORTD=(a0);// пишем "0" в порт D
110DDRB=B1;
111delay(70);
112PORTD=(a5);// пишем "5" в порт B
113DDRB=B10;
114 
115pusk();
116}
117void A06()
118{
119delay(70);
120PORTD=(a0);// пишем "0" в порт D
121DDRB=B1;
122delay(70);
123PORTD=(a6);// пишем "6" в порт B
124DDRB=B10;
125 
126pusk();
127}
128void A07()
129{
130delay(70);
131PORTD=(a0);// пишем "0" в порт D
132DDRB=B1;
133delay(70);
134PORTD=(a7);// пишем "7" в порт B
135DDRB=B10;
136 
137pusk();
138}
139void A08()
140{
141delay(70);
142PORTD=(a0);// пишем "0" в порт D
143DDRB=B1;
144delay(70);
145PORTD=(a8);// пишем "8" в порт B
146DDRB=B10;
147 
148pusk();
149}
150void A09()
151{
152delay(70);
153PORTD=(a0);// пишем "0" в порт D
154DDRB=B1;
155delay(70);
156PORTD=(a9);// пишем "9" в порт B
157DDRB=B10;
158 
159pusk();
160}
161void A10()
162{
163delay(70);
164PORTD=(a1);// пишем "1" в порт D
165DDRB=B1;
166delay(70);
167PORTD=(a0);// пишем "0" в порт B
168DDRB=B10;
169 
170pusk();
171}
172void A11()
173{
174delay(70);
175PORTD=(a1);// пишем "1" в порт D
176DDRB=B1;
177delay(70);
178PORTD=(a1);// пишем "1" в порт B
179DDRB=B10;
180 
181pusk();
182}
183void A12()
184{
185delay(70);
186PORTD=(a1);// пишем "1" в порт D
187DDRB=B1;
188delay(70);
189PORTD=(a2);// пишем "2" в порт B
190DDRB=B10;
191 
192pusk();
193}

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

за название темы прошу прощения))) хотел написать одно а потом написал другое))) и не склонил последнее слово)

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

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

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

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

делаю задержку для споттера (контаакной сварки) с индикацией на сегменты

001int a0=B11111101;
002int a1=B01100001;
003int a2=B11011010;
004int a3=B11110010;
005int a4=B01100110;
006int a5=B10110110;
007int a6=B10111110;
008int a7=B11100000;
009int a8=B11111110;
010int a9=B11110110;
011 
012long kolichestvo_sekund = 100;
013unsigned long startstop = 0;
014unsigned long currentMillis = 0;
015int schet = 1;
016const int vihod =  10;      // номер выхода, подключенного к светодиоду
017 
018int vihodState = LOW;             // этой переменной устанавливаем состояние светодиода
019long previousMillis = 0;        // храним время последнего переключения светодиода
020  
021unsigned long dlya_sekund = 0;
022 
023void setup() {
024DDRD=B11111111; // пины порта D и B обозначаем выходными
025pinMode(10, OUTPUT);
026pinMode(11, INPUT);
027digitalWrite(11, HIGH);
028pinMode(12, INPUT);
029digitalWrite(12, HIGH);
030 
031}
032void loop() {
033  if (millis()>dlya_sekund + 150){
034 if (digitalRead(12) == 0){
035 dlya_sekund = millis();
036 schet = schet +1;
037 if (schet > 12){
038  schet = 1;
039 }
040 }
041 else if (digitalRead(11) == 0){
042 dlya_sekund = millis();
043 schet = schet -1;
044 if (schet < 0){
045  schet = 12;
046 }
047 }
048  }
049 if (schet == 1){
050  A01();
051 }
052 else if (schet == 2){
053  A02();
054 }
055  else if (schet == 3){
056  A03();
057 }
058 else if (schet == 4){
059  A04();
060 }
061 else if (schet == 5){
062  A05();
063 }
064 else if (schet == 6){
065  A06();
066 }
067 else if (schet == 7){
068  A07();
069 }
070 else if (schet == 8){
071  A08();
072 }
073 else if (schet == 9){
074  A09();
075 }
076 else if (schet == 10){
077  A10();
078 }
079 else if (schet == 11){
080  A11();
081 }
082 else if (schet == 12){
083  A12();
084 }
085  
086 }
087 
088void A01()
089{
090   
091PORTD=(a0);// пишем "0" в порт D
092DDRB=B1; // первая цифра
093delay(70);
094PORTD=(a1);// пишем "1" в порт B
095DDRB=B10; //вторая цифра
096delay(70);
097 
098pusk();
099}
100void A02()
101{
102delay(70);
103PORTD=(a0);// пишем "0" в порт D
104DDRB=B1;
105delay(70);
106PORTD=(a2);// пишем "2" в порт В
107DDRB=B10;
108 
109pusk();
110}
111void A03()
112{
113delay(70);
114PORTD=(a0);// пишем "0" в порт D
115DDRB=B1;
116delay(70);
117PORTD=(a3);// пишем "3" в порт B
118DDRB=B10;
119 
120pusk();
121}
122void A04()
123{
124delay(70);
125PORTD=(a0);// пишем "0" в порт D
126DDRB=B1;
127delay(70);
128PORTD=(a4);// пишем "4" в порт B
129DDRB=B10;
130 
131pusk();
132}
133void A05()
134{
135delay(70);
136PORTD=(a0);// пишем "0" в порт D
137DDRB=B1;
138delay(70);
139PORTD=(a5);// пишем "5" в порт B
140DDRB=B10;
141 
142pusk();
143}
144void A06()
145{
146delay(70);
147PORTD=(a0);// пишем "0" в порт D
148DDRB=B1;
149delay(70);
150PORTD=(a6);// пишем "6" в порт B
151DDRB=B10;
152 
153pusk();
154}
155void A07()
156{
157delay(70);
158PORTD=(a0);// пишем "0" в порт D
159DDRB=B1;
160delay(70);
161PORTD=(a7);// пишем "7" в порт B
162DDRB=B10;
163 
164pusk();
165}
166void A08()
167{
168delay(70);
169PORTD=(a0);// пишем "0" в порт D
170DDRB=B1;
171delay(70);
172PORTD=(a8);// пишем "8" в порт B
173DDRB=B10;
174 
175pusk();
176}
177void A09()
178{
179delay(70);
180PORTD=(a0);// пишем "0" в порт D
181DDRB=B1;
182delay(70);
183PORTD=(a9);// пишем "9" в порт B
184DDRB=B10;
185 
186pusk();
187}
188void A10()
189{
190delay(70);
191PORTD=(a1);// пишем "1" в порт D
192DDRB=B1;
193delay(70);
194PORTD=(a0);// пишем "0" в порт B
195DDRB=B10;
196 
197pusk();
198}
199void A11()
200{
201delay(70);
202PORTD=(a1);// пишем "1" в порт D
203DDRB=B1;
204delay(70);
205PORTD=(a1);// пишем "1" в порт B
206DDRB=B10;
207 
208pusk();
209}
210void A12()
211{
212delay(70);
213PORTD=(a1);// пишем "1" в порт D
214DDRB=B1;
215delay(70);
216PORTD=(a2);// пишем "2" в порт B
217DDRB=B10;
218 
219pusk();
220}
221void pusk()
222{
223 if (millis()>startstop+2000){
224 if (analogRead(A1) == 0)
225 {
226   
227 startstop = millis();
228  currentMillis = millis();
229  }
230 }
231  if(millis()<currentMillis+(kolichestvo_sekund*schet))
232  {
233  vihodState = 1;
234  }
235  else{
236    vihodState = 0;
237  }
238   digitalWrite(vihod, vihodState);
239}

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

и не пойму почему выход с 10 пина всего лишь 0.05мА? когда на остальных 250мА?

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

d13lider пишет:

и не пойму почему выход с 10 пина всего лишь 0.05мА? когда на остальных 250мА?

Да, Вы как-то странно ток измеряете. Амперметр встраивается в цепь последовательно, а Вы как его к 6-му пину присобачили? Вы просто закоротили пин на землю и что-то там измеряете.

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

Значит, начнём с того, что эту схему выбрасываем.

Нагрузка на 8-ой и 9-пины здесь у Вас будет доходить до 160 ма, при предельно допустимой - 40. 

В цепи пинов 0-7 необходимо вставлять токоограничивающие резисторы (в каждую свой), чтобы ток не превышал 20мА на каждом пине. Какие резисторы - зависит от Вашего семисегментника (какого цвета и т.п.). Если красный - я бы начал со 150 ом, а там померял бы ток и подобрал бы поточнее.

Программу тоже выбрасываем.

Вы не ответили, что у Вас делают 70мс задержки во всех функциях? Полагаю, чтобы успеть полюбоваться на светящуюся цифру? Это очень большие задержки, дисплей будет замето на глаз переключаться. Да и нужны они только когда цифра светится, а не когда погашена.

Запомните, задержка переключения цифр в семисегментике равна 20/<количество разрядов>, т.е. у Вас она равна 10мс. Кроме того, задержка здесь делается не делэями, я таймером иначе экран по-любому будет дёргаться, т.к. задержка у Вас будет зависеть от скорости loop.

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

 

 

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

Кстати, что у Вас там на 10 пине? Светодиод? Тоже токоограничивающий резистор вставляйте.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

спасибо большое!

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

Кстати, кнопки на пинах А1 и 12 притянуты к питанию, а на пине 11 почему-то нет. За что её так обидели? Притягивать надо все.

В принципе резисторы у кнопок можно и выкинуть, а пользоваться встроенными в контроллер. Для этого вместо INPUT соответсвующему пину надо говорить INPUT_PULLUP

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

на 10-ом светодиод, не светится... задержку 70 ставлю пока в протеусе гоняю, когда буду ставить на макетке, сделаю и резисторы и задержку меньше. но конечно думал вообще от нее избавиться - это не проблемма. без delay а с millis(). все будет работать, нашел библиотеку #include <SevSeg.h> не совсем могу разобраться с ней. в общем передумал такую большую программу строить строил для того что бы понять как все работает. с библиотекой все конечно проще. но где интерес. на счет библиотеки знаете что нибудь?

01/*
02testWholeDisplay.ino
03-test each segment in the display
04-a simple example using Dean Reading's SevSeg library to light up all 4 digits plus the 4 decimal points on a 4 digit display
05-the purpose of this example is to ensure you have the wires all hooked up right for every segment and digit, and to troubleshoot the display and wiring
06 to ensure *every* segment and period lights up
07 
08By Gabriel Staples
10My contact info is available by clicking the "Contact Me" tab at the top of my website.
11Written: 1 Oct. 2015
12Last Updated: 1 Oct. 2015
13*/
14 
15/*
16LICENSING:
17-this *example file* only is modified from Dean Reading's original example, and is in the public domain.
18 
19Dean Reading's SevSeg library is as follows:
20Copyright 2014 Dean Reading
21 
22Licensed under the Apache License, Version 2.0 (the "License");
23you may not use this file except in compliance with the License.
24You may obtain a copy of the License at
26 
27Unless required by applicable law or agreed to in writing, software
28distributed under the License is distributed on an "AS IS" BASIS,
29WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30See the License for the specific language governing permissions and
31limitations under the License.
32*/
33 
34#include <SevSeg.h>
35 
36SevSeg sevseg; //Instantiate a seven segment controller object
37int schet = 1;
38unsigned long start = 0;
39void setup()
40{
41  byte numDigits = 2;  
42  byte digitPins[] = {8, 9}; //Digits: 1,2,3,4 <--put one resistor (ex: 220 Ohms, or 330 Ohms, etc, on each digit pin)
43  byte segmentPins[] = {7, 6, 5, 4, 3, 2, 1, 0}; //Segments: A,B,C,D,E,F,G,Period
44 
45  sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
46  sevseg.setBrightness(99); //Note: 100 brightness simply corresponds to a delay of 2000us after lighting each segment. A brightness of 0
47                            //is a delay of 1us; it doesn't really affect brightness as much as it affects update rate (frequency).
48                            //Therefore, for a 4-digit 7-segment + pd, COMMON_ANODE display, the max update rate for a "brightness" of 100 is 1/(2000us*8) = 62.5Hz.
49                            //I am choosing a "brightness" of 10 because it increases the max update rate to approx. 1/(200us*8) = 625Hz.
50                            //This is preferable, as it decreases aliasing when recording the display with a video camera....I think.
51}
52 
53void loop()
54{
55  if(millis()>start+300){
56  if (digitalRead(11) == 0){
57    schet = schet + 1;
58    start = millis();
59  }
60}
61  //local vars
62  static byte decPlace = 0;
63   
64  sevseg.setNumber(schet,decPlace);
65  decPlace++;
66  decPlace %= 1; //rollover back to 0 once variable gets to 4; To anyone wondering: the % is called the "modulo" operator; see here for explanation & example: <a href="https://www.arduino.cc/en/Reference/Modulo" title="https://www.arduino.cc/en/Reference/Modulo" rel="nofollow">https://www.arduino.cc/en/Reference/Modulo</a>
67 
68  sevseg.refreshDisplay(); // Must run repeatedly; don't use blocking code (ex: delay()) in the loop() function or this won't work right
69}

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

вот так выглядит цифра "8"

а вот так цифра "18"

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

может это просто глюк протеуса?

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

Нет, там надо не с миллис, а именно с таймером - так точнее и точно не будет дёргаться.

Библиотекой никогда не интересовался - это настолько простая операция. что тянуть сюда ещё чужие ошибки совсем не хочется - мне своих хватает.

Про цифру, думаю замените в 66 строке 1 на 2 и всё образуется, но, повторяю, библиотеку никогда не смотрел и смотреть не имею желания.

Это очень простая программа, давайте её напишем, только по-возможности не с протеусом с номальным живым железом. Вы нарисовали нормальную схему?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

переписал немного код. но delay еще оставил

001int a0=B11111101;
002int a1=B01100001;
003int a2=B11011010;
004int a3=B11110010;
005int a4=B01100110;
006int a5=B10110110;
007int a6=B10111110;
008int a7=B11100000;
009int a8=B11111110;
010int a9=B11110110;
011 
012long kolichestvo_sekund = 100;
013unsigned long startstop = 0;
014unsigned long currentMillis = 0;
015int schet = 1;
016const int vihod =  10;      // номер выхода, подключенного к светодиоду
017 
018int vihodState = LOW;           
019long previousMillis = 0;     
020unsigned long dlya_sekund = 0;
021 
022void setup() {
023DDRD=B11111111; // пины порта D и B обозначаем выходными
024pinMode(10, OUTPUT);
025pinMode(11, INPUT);
026digitalWrite(11, HIGH);
027pinMode(12, INPUT);
028digitalWrite(12, HIGH);
029 
030}
031void loop() {
032  if (millis()>dlya_sekund + 150){
033 if (digitalRead(12) == 0){
034 dlya_sekund = millis();
035 schet = schet +1;
036 if (schet > 12){
037  schet = 1;
038 }
039 }
040 else if (digitalRead(11) == 0){
041 dlya_sekund = millis();
042 schet = schet -1;
043 if (schet < 0){
044  schet = 12;
045 }
046 }
047  }
048 if (schet == 1){
049  A01();
050 }
051 else if (schet == 2){
052  A02();
053 }
054  else if (schet == 3){
055  A03();
056 }
057 else if (schet == 4){
058  A04();
059 }
060 else if (schet == 5){
061  A05();
062 }
063 else if (schet == 6){
064  A06();
065 }
066 else if (schet == 7){
067  A07();
068 }
069 else if (schet == 8){
070  A08();
071 }
072 else if (schet == 9){
073  A09();
074 }
075 else if (schet == 10){
076  A10();
077 }
078 else if (schet == 11){
079  A11();
080 }
081 else if (schet == 12){
082  A12();
083 }
084  
085 }
086 
087void A01()
088{
089   
090PORTD=(a0);// пишем "0" в порт D
091DDRB=B10; // первая цифра
092delay(70);
093PORTD=(a1);// пишем "1" в порт B
094DDRB=B01; //вторая цифра
095delay(70);
096 
097pusk();
098}
099void A02()
100{
101delay(70);
102PORTD=(a0);// пишем "0" в порт D
103DDRB=B10;
104delay(70);
105PORTD=(a2);// пишем "2" в порт В
106DDRB=B01;
107 
108pusk();
109}
110void A03()
111{
112delay(70);
113PORTD=(a0);// пишем "0" в порт D
114DDRB=B10;
115delay(70);
116PORTD=(a3);// пишем "3" в порт B
117DDRB=B01;
118 
119pusk();
120}
121void A04()
122{
123delay(70);
124PORTD=(a0);// пишем "0" в порт D
125DDRB=B10;
126delay(70);
127PORTD=(a4);// пишем "4" в порт B
128DDRB=B01;
129 
130pusk();
131}
132void A05()
133{
134delay(70);
135PORTD=(a0);// пишем "0" в порт D
136DDRB=B10;
137delay(70);
138PORTD=(a5);// пишем "5" в порт B
139DDRB=B01;
140 
141pusk();
142}
143void A06()
144{
145delay(70);
146PORTD=(a0);// пишем "0" в порт D
147DDRB=B10;
148delay(70);
149PORTD=(a6);// пишем "6" в порт B
150DDRB=B01;
151 
152pusk();
153}
154void A07()
155{
156delay(70);
157PORTD=(a0);// пишем "0" в порт D
158DDRB=B10;
159delay(70);
160PORTD=(a7);// пишем "7" в порт B
161DDRB=B01;
162 
163pusk();
164}
165void A08()
166{
167delay(70);
168PORTD=(a0);// пишем "0" в порт D
169DDRB=B10;
170delay(70);
171PORTD=(a8);// пишем "8" в порт B
172DDRB=B01;
173 
174pusk();
175}
176void A09()
177{
178delay(70);
179PORTD=(a0);// пишем "0" в порт D
180DDRB=B10;
181delay(70);
182PORTD=(a9);// пишем "9" в порт B
183DDRB=B01;
184 
185pusk();
186}
187void A10()
188{
189delay(70);
190PORTD=(a1);// пишем "1" в порт D
191DDRB=B10;
192delay(70);
193PORTD=(a0);// пишем "0" в порт B
194DDRB=B01;
195 
196pusk();
197}
198void A11()
199{
200delay(70);
201PORTD=(a1);// пишем "1" в порт D
202DDRB=B10;
203delay(70);
204PORTD=(a1);// пишем "1" в порт B
205DDRB=B01;
206 
207pusk();
208}
209void A12()
210{
211delay(70);
212PORTD=(a1);// пишем "1" в порт D
213DDRB=B10;
214delay(70);
215PORTD=(a2);// пишем "2" в порт B
216DDRB=B01;
217 
218pusk();
219}
220void pusk()
221{
222 if (millis()>startstop+2000){
223 if (analogRead(A1) == 0)
224 {
225   
226 startstop = millis();
227  currentMillis = millis();
228  }
229 }
230  if(millis()<currentMillis+(kolichestvo_sekund*schet))
231  {
232  vihodState = 1;
233  }
234  else{
235    vihodState = 0;
236  }
237   digitalWrite(vihod, vihodState);
238}

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

 

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

Где резисторы в цепях пинов с 0 по 7? В каждой цепи должен быть свой резистор.

Зачем резисторы R4-R7? Они не нужны. Там транзисторы надо ставить. Иначе у Вас через эти два пина ток пойдёт в 4 раза больше предельно допустимого.

"Живого индикатора" у Вас пока нет или уже есть? Если есть, кто какой? Они бывают с общим анодом (ОА)  и общим катодом (ОК). Пока не знаем какой у Вас, не понимаем как ставить транзисторы. ОА не лучше и не хуже, чем ОК, но схема делается по-разному.

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

d13lider пишет:

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

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

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

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

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

про индикаторы уже знаю,  но планирую с обшим катодом. на схеме с общим катодом. покупать буду. пока определяюсь с элементами.

R4-R5 токоограничивающие,зачем на все пины ставить с 0 по 7 ставить. когда можно на 2 поставить? не упрек, просто думал так тоже нормально будет. просто из электротехники знаю, если через нагрузку идет ток, то не важно перед нагрузкой или после ставить резистор для уменьшения потребления нагрузки

R6-R7 думал для более четкого плюса на катоде. поэтому 470кОм думаю не помешают, а помехи уберут. в реальной схеме стять не будут. а вот в протеусе просто индикаторы "идиальные" и у них нет сопротивления. т.е. диоды без потребления. если поставить в разрыв с катодом "МИКРО"амперметр, то он даже показывает 000.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

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

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

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

ааааа, крутая штука. т.е. светодиоды будут более равномерно переключаться. крутяк) а есть какой нибудь готовый шаблон, что бы на нем потренироваться? 

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

d13lider пишет:

R4-R5 токоограничивающие,зачем на все пины ставить с 0 по 7 ставить. когда можно на 2 поставить? не упрек, просто думал так тоже нормально будет. просто из электротехники знаю, если через нагрузку идет ток, то не важно перед нагрузкой или после ставить резистор для уменьшения потребления нагрузки

Так нельзя. Вот смотрите, какой именно ток они должны ограничивать? Очевидно, что ток всех сегментов (т.е. цифра 8 и точка). Нормальный ток светодиода - 20мА, стало быть, здесь Вам надо иметь ограничение 8х20 = 160мА. Отлично. Теперь представим себе, что у нас там цифра 1 без точки, т.е. горят 2 светодиода. А ток мы ограничиваем на 160мА. Стало быть эти два диода сожрут не по 20, как им положено, а по 80! Может быть сгорят, а может и нет, но если и не сгорят, то во-первых будут меньше служить, а во-вторых, цифра 1 будет светиться существенно ярче, чем 8-ка (т.к. там каждому меньше тока досталось). Понимаете?

d13lider пишет:

R6-R7 думал для более четкого плюса на катоде. поэтому 470кОм думаю не помешают, а помехи уберут. 

Не нужны они там. Там нужен нормальный транзистор. Если у Вас общий катод, то транзистор (NPN) ставится так:

От пина ардуино через токоограничивающий резистор R1, подаём сигнал на базу. Отдельно от базы стоит поставить резистор R2 = примерно 10хR1 на GND. Эмиттер транзистора - на GND. Коллектор - на пин цифры индикатора. Никакого токоограничивающего резистора в цепи коллектора не надо, т.к. ток в этой цепи уже ограничен резисторами, который Вы поставите в цепь 0-7 пинов.

----------

Теперь скажите, а какая у Вас ардуина (uno, mega, nano)? Это важно.

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

d13lider пишет:

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

там ровно три строки кода. Доберёмся. Давайте со схемой разгребём.

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

Скачайте книгу https://dl.dropboxusercontent.com/u/32245429/arduinoBasicConnections.pdf

Там на странице 9 есть схема подключения семисегментника (правда четырёхразрядного). Там, правда, лбщий анод, но разниуа только в том, как транзисторы соединять. Как надо для общего катода я Вам написал. Ещё там нет резисторов от базы к земле. Можно и без них, но очень рекомvендую. Это как раз защита от ЭМИ. У меня внук недавно собрал по той схеме (без резисторов), а потом прибежал ко мне: "дед, а чё у меня цифры на экране дёргаются, когда я настольную лампу включаю?" :)

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

 

Не нужны они там. Там нужен нормальный транзистор. Если у Вас общий катод, то транзистор (NPN) ставится так:

От пина ардуино через токоограничивающий резистор R1, подаём сигнал на базу. Отдельно от базы стоит поставить резистор R2 = примерно 10хR1 на GND. Эмиттер транзистора - на GND. Коллектор - на пин цифры индикатора. Никакого токоограничивающего резистора в цепи коллектора не надо, т.к. ток в этой цепи уже ограничен резисторами, который Вы поставите в цепь 0-7 пинов.

 

так транзисторы все таки надо ставить на эмиторы светодиодов? т.е. 8шт.?

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

 

Теперь скажите, а какая у Вас ардуина (uno, mega, nano)? Это важно.

Nano

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

Скачайте книгу https://dl.dropboxusercontent.com/u/32245429/arduinoBasicConnections.pdf

Там на странице 9 есть схема подключения семисегментника (правда четырёхразрядного). Там, правда, лбщий анод, но разниуа только в том, как транзисторы соединять. Как надо для общего катода я Вам написал. Ещё там нет резисторов от базы к земле. Можно и без них, но очень рекомvендую. Это как раз защита от ЭМИ. У меня внук недавно собрал по той схеме (без резисторов), а потом прибежал ко мне: "дед, а чё у меня цифры на экране дёргаются, когда я настольную лампу включаю?" :)

скачал книгу и понял))) 

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

d13lider пишет:

так транзисторы все таки надо ставить на эмиторы светодиодов? т.е. 8шт.?

Нет. Транзисторы ставяться по одному на цифру - на общий вывод цифры. Т.е. у Вас транзисторов будет два.
 
А вот токоограничивающие резисторы - на каждый сегмент, т.е. резисторов будет 8. (я не считаю те, что на обвязке кнопок и транзитсоров).

d13lider пишет:

Nano

Тогда я бы не стал использовать порт D целиком для подключения сегментов, т.к. 0 и 1 биты этого порта - это Rx и Tx соответсвенно. Формально их можно как-то использовать, но лучше не надо. CH340 может такого не пережить.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

так?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

 

d13lider пишет:

Nano

Тогда я бы не стал использовать порт D целиком для подключения сегментов, т.к. 0 и 1 биты этого порта - это Rx и Tx соответсвенно. Формально их можно как-то использовать, но лучше не надо. CH340 может такого не пережить.

эх... тогда всю программу перепысывать))) CH340 мне и не нужен будет потом))) один раз залью, и будет агрегат работать) но для надежности конечно я бы переделал. т.е. я все кнопки перенесу на аналоговые входы. и у меня как раз освободятся 11 и 12. перенесу 10-й т.е. что бы на цифры шли с 2 по 12, а по коду то что?) и значально был вопрос как упростить код. или мы к этому перейдем еще?)

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

Нет. Вы эмиттер с коллектором, похоже, перепутали. Стрелочку у транзистора видите? Это эмиттер. Так вот теперь проведите пальцем по схеме от + к GND. (В данном случае, это от 0-7 пина ардуины, через экран и транзистор, к Gnd). Видите, у Вас ток против стрелки пошёл? Подключать надо наоборот эмиттером (со стрелкой) к земле, а коллектором к экрану. (А если бы был общий анод, то коллектором к питанию, а эмиттером к экрану - как в той книге, что я Вам дал). Тогда при прохождении от + к - ток будет идти по стрелке.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

прошу прощения, вот так?

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

d13lider пишет:

эх... тогда всю программу перепысывать))) 

А её и так переписывать. И короче она станет раз в пять. дожмём схему, потом займёмся программой

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

симулятор включаю - вообще ничего не работает))) показывает 00

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

d13lider пишет:

прошу прощения, вот так?

Примерно так. От R1-R3 можно избавиться, если в программе INPUT на INPUT_PULLUP заменить.

R4-R11 лучше подобрать на железе поточнее.

R12-R13 зависят от используемых транзисторов. Вы какие собираетесь ставить? Если собираетесь только покупать, то у Вас полная свобода - подойдёт любой NPN транзистор с током коллектора от 200mA. Например, копеечные 2N2222 - только в путь. Как выберете тип транзистора, прикинем какие там резисторы нужны.

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

d13lider пишет:

симулятор включаю - вообще ничего не работает))) показывает 00

Мы ещё до программы не добрались. Вы торопитесь.

Сейчас я исчезаю. Появлюсь часов около восьми вечера.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

вверх

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

Мы ещё до программы не добрались. Вы торопитесь.

Сейчас я исчезаю. Появлюсь часов около восьми вечера.


Что то вы пропали..

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

Простите, дейстаительно пропал. Вот вернулся.

У Вас эта схема собрана?

Теперь давайте сделаем программу, которая просто засветит одну цифру. Пока не будем париться про универсальность.

Для того, чтобы засветить одну цифру, надо:

1. подать HIGH на пин 10 (первая цифра) или 11 (вторая цифра).

2. подать HIGH на те пины из 0-7, которые отвечают за сегменты, которые должны светиться. Например, если подать HIGH на все сразу, то это будет восьмёрка с точкой.

Сделайет пока функцию, которая зажигает одну цифру (любую конкретную, мы следующим шпгом присаобачим универсальность).

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

Простите, дейстаительно пропал. Вот вернулся.

У Вас эта схема собрана?

Теперь давайте сделаем программу, которая просто засветит одну цифру. Пока не будем париться про универсальность.

Для того, чтобы засветить одну цифру, надо:

1. подать HIGH на пин 10 (первая цифра) или 11 (вторая цифра).

2. подать HIGH на те пины из 0-7, которые отвечают за сегменты, которые должны светиться. Например, если подать HIGH на все сразу, то это будет восьмёрка с точкой.

Сделайет пока функцию, которая зажигает одну цифру (любую конкретную, мы следующим шпгом присаобачим универсальность).

схема только в протеусе собрана. она тоже хорошо тестируется. пока не определился с управление мощностью, поэтому не собираю схему. тестирую в протеусе. потом на печатную плату перевожу сразу. если все токи устраивают.

01void setup() {
02  // put your setup code here, to run once:
03 
04}
05 
06void loop() {
07  // put your main code here, to run repeatedly:
08PORTD=B11111000;
09PORTB=B000110;
10 
11}

 

светятся сразу 2 цифры. на оба катода почему-то приходит по  (-) хотя посылаю на 10 pin -HIGH

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

 

Примерно так. От R1-R3 можно избавиться, если в программе INPUT на INPUT_PULLUP заменить.

R4-R11 лучше подобрать на железе поточнее.

R12-R13 зависят от используемых транзисторов. Вы какие собираетесь ставить? Если собираетесь только покупать, то у Вас полная свобода - подойдёт любой NPN транзистор с током коллектора от 200mA. Например, копеечные 2N2222 - только в путь. Как выберете тип транзистора, прикинем какие там резисторы нужны.

этот пост почему-то не видел.... транзисторы 2n3904 есть в наличии

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

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

d13lider пишет:

светятся сразу 2 цифры. на оба катода почему-то приходит по  (-) хотя посылаю на 10 pin -HIGH

Во-первых, явно сконфигурите пины на OUTPUT.

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

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

немного разобрался. но до конца не понял. переделал скетч

01void setup() {
02  // put your setup code here, to run once:
03pinMode(2, OUTPUT);
04pinMode(3, OUTPUT);
05pinMode(4, OUTPUT);
06pinMode(5, OUTPUT);
07pinMode(6, OUTPUT);
08pinMode(7, OUTPUT);
09pinMode(8, OUTPUT);
10pinMode(9, OUTPUT);
11pinMode(10, OUTPUT);
12pinMode(11, OUTPUT);
13 
14}
15 
16void loop() {
17  // put your main code here, to run repeatedly:
18digitalWrite(2, LOW);
19digitalWrite(3, HIGH);
20digitalWrite(4, HIGH);
21digitalWrite(5, HIGH);
22digitalWrite(6, HIGH);
23digitalWrite(7, HIGH);
24digitalWrite(8, LOW);
25digitalWrite(9, HIGH);
26digitalWrite(10, HIGH);
27digitalWrite(11, LOW);
28}

на контроллере если замкнуть на землю ногу и померить ток, то получаеться 0.25А, в предыдущей версии скетча почему-то было 0.05мА.

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

и переделал схему, на эмитор подал плюс вместо минуса. все заработало, загорелась одна цифра

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

d13lider пишет:

этот пост почему-то не видел.... транзисторы 2n3904 есть в наличии

Ага, коффициент усиления очень низкий (от 30).

Светодиоды какого цвета (на экранчике)? Да, впрочем, ладно R12-R13 ставьте на 68 ом, если нет, то можно даже 62 - не умрёт, но меньше уже не стоит.

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

d13lider пишет:

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

Про группы, давайте вернёмся, кргда всё заработает. Несложно, но вот когда всё будет работать - сделаем группами.

d13lider пишет:

и переделал схему, на эмитор подал плюс вместо минуса. все заработало, загорелась одна цифра

Как хотите, можно и так. Я бы переделал программу, а не схему. Смотрите в чём разница.

Сейчас для того, чтобы зажечь цифру, Вам надо подать на пин базы тразнизстора LOW. А чтобы погасить - HIGH При включении МК (пока Ваша программа не успела туда ничего подать) там быдет LOW, и и цифра может мигнуть/дёрнуться.

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

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

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

при подключении эмитора на минус у меня в коде было прописанно что 10 в HIGH а 11 в LOW но почему-то все равно горели 2 цифры... подключил эмитор на плюс и все заработало. вообщем передумал я немного, транзисторы буду ставить pnp т.к. с общим анодом буду применять индикатор и он будет 3-ех сегментный. вместо кнопок поставлю энкодер. т.к. буду регулировать сварочный импульс от 0.01 секунды. для споттера очень важно. думаю 0.1 будет много. на кузове остаються точки прожженые. а этого мне не нужно. но это уже другая тема. транзисторы 2n5551. но суть схемы понял. и еще рассчитать резисторы для индикатора как? потому что даташида не нашел на него.сколько вольт и ампер каждый сегмент сможет выдержить продолжительное время 

vk007
Offline
Зарегистрирован: 16.06.2015

Извините, что вмешиваюсь в ваш диалог. d13lider, вы как будете это собирать - делать печатную плату или навесным монтажом?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

vk007 пишет:

Извините, что вмешиваюсь в ваш диалог. d13lider, вы как будете это собирать - делать печатную плату или навесным монтажом?


Сразу на печатку

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

vk007 пишет:

Извините, что вмешиваюсь в ваш диалог. d13lider, вы как будете это собирать - делать печатную плату или навесным монтажом?


До этого делал проект на автозапуск авто по Gsm все заработало, тоже разработал все в протеусе почти, кроме команд gsm модуля.

vk007
Offline
Зарегистрирован: 16.06.2015

Тогда подумайте о том, чтобы используемые пины назначать не явно (2, 3, 4...), а через #define. Например,

1#define A_SEG 2
2#define B_SEG 3  // и т.д.

Будете разводить плату, поймете почему.