два 8-ми сегментных индикаторов
- 1
- 2
- 3
- 4
- 5
- следующая ›
- последняя »
- Войдите на сайт для отправки комментариев
Втр, 29/03/2016 - 11:16
здравствуйте, не могу понять про индикаторы. вообщем нужно по нажатии кнопки прибавлять цифру на индикаторе с 01 до 02 и т.д. до 99
примерный скетч набрасал, но это тупо каждая цифра 01,02,03,04 и т.д. набирается путем отдельной функции "void"
как сделать проще?
001 | |
002 |
003 |
004 |
005 | void 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 |
061 | void A01() |
062 | { |
063 | |
064 | PORTD=(a0); // пишем "0" в порт D |
065 | DDRB=B1; // первая цифра |
066 | delay(70); |
067 | PORTD=(a1); // пишем "1" в порт B |
068 | DDRB=B10; //вторая цифра |
069 | delay(70); |
070 |
071 | pusk(); |
072 | } |
073 | void A02() |
074 | { |
075 | delay(70); |
076 | PORTD=(a0); // пишем "0" в порт D |
077 | DDRB=B1; |
078 | delay(70); |
079 | PORTD=(a2); // пишем "2" в порт В |
080 | DDRB=B10; |
081 |
082 | pusk(); |
083 | } |
084 | void A03() |
085 | { |
086 | delay(70); |
087 | PORTD=(a0); // пишем "0" в порт D |
088 | DDRB=B1; |
089 | delay(70); |
090 | PORTD=(a3); // пишем "3" в порт B |
091 | DDRB=B10; |
092 |
093 | pusk(); |
094 | } |
095 | void A04() |
096 | { |
097 | delay(70); |
098 | PORTD=(a0); // пишем "0" в порт D |
099 | DDRB=B1; |
100 | delay(70); |
101 | PORTD=(a4); // пишем "4" в порт B |
102 | DDRB=B10; |
103 |
104 | pusk(); |
105 | } |
106 | void A05() |
107 | { |
108 | delay(70); |
109 | PORTD=(a0); // пишем "0" в порт D |
110 | DDRB=B1; |
111 | delay(70); |
112 | PORTD=(a5); // пишем "5" в порт B |
113 | DDRB=B10; |
114 |
115 | pusk(); |
116 | } |
117 | void A06() |
118 | { |
119 | delay(70); |
120 | PORTD=(a0); // пишем "0" в порт D |
121 | DDRB=B1; |
122 | delay(70); |
123 | PORTD=(a6); // пишем "6" в порт B |
124 | DDRB=B10; |
125 |
126 | pusk(); |
127 | } |
128 | void A07() |
129 | { |
130 | delay(70); |
131 | PORTD=(a0); // пишем "0" в порт D |
132 | DDRB=B1; |
133 | delay(70); |
134 | PORTD=(a7); // пишем "7" в порт B |
135 | DDRB=B10; |
136 |
137 | pusk(); |
138 | } |
139 | void A08() |
140 | { |
141 | delay(70); |
142 | PORTD=(a0); // пишем "0" в порт D |
143 | DDRB=B1; |
144 | delay(70); |
145 | PORTD=(a8); // пишем "8" в порт B |
146 | DDRB=B10; |
147 |
148 | pusk(); |
149 | } |
150 | void A09() |
151 | { |
152 | delay(70); |
153 | PORTD=(a0); // пишем "0" в порт D |
154 | DDRB=B1; |
155 | delay(70); |
156 | PORTD=(a9); // пишем "9" в порт B |
157 | DDRB=B10; |
158 |
159 | pusk(); |
160 | } |
161 | void A10() |
162 | { |
163 | delay(70); |
164 | PORTD=(a1); // пишем "1" в порт D |
165 | DDRB=B1; |
166 | delay(70); |
167 | PORTD=(a0); // пишем "0" в порт B |
168 | DDRB=B10; |
169 |
170 | pusk(); |
171 | } |
172 | void A11() |
173 | { |
174 | delay(70); |
175 | PORTD=(a1); // пишем "1" в порт D |
176 | DDRB=B1; |
177 | delay(70); |
178 | PORTD=(a1); // пишем "1" в порт B |
179 | DDRB=B10; |
180 |
181 | pusk(); |
182 | } |
183 | void A12() |
184 | { |
185 | delay(70); |
186 | PORTD=(a1); // пишем "1" в порт D |
187 | DDRB=B1; |
188 | delay(70); |
189 | PORTD=(a2); // пишем "2" в порт B |
190 | DDRB=B10; |
191 |
192 | pusk(); |
193 | } |
за название темы прошу прощения))) хотел написать одно а потом написал другое))) и не склонил последнее слово)
Ну, что Вам сказать, скетч Вы привели неполный. Индикаторы подключены непонятно как (либо целиком к порту D, либо через дешифратор, хрен Вас разберёт). Что за задержки в 70мс можно только догадываться.
В общем, хотите нормального разговора, давайте. полный скетч, схему подключения и пояснения, что Вы хотите сделать.
001
int
a0=B11111101;
002
int
a1=B01100001;
003
int
a2=B11011010;
004
int
a3=B11110010;
005
int
a4=B01100110;
006
int
a5=B10110110;
007
int
a6=B10111110;
008
int
a7=B11100000;
009
int
a8=B11111110;
010
int
a9=B11110110;
011
012
long
kolichestvo_sekund = 100;
013
unsigned
long
startstop = 0;
014
unsigned
long
currentMillis = 0;
015
int
schet = 1;
016
const
int
vihod = 10;
// номер выхода, подключенного к светодиоду
017
018
int
vihodState = LOW;
// этой переменной устанавливаем состояние светодиода
019
long
previousMillis = 0;
// храним время последнего переключения светодиода
020
021
unsigned
long
dlya_sekund = 0;
022
023
void
setup
() {
024
DDRD=B11111111;
// пины порта D и B обозначаем выходными
025
pinMode(10, OUTPUT);
026
pinMode(11, INPUT);
027
digitalWrite(11, HIGH);
028
pinMode(12, INPUT);
029
digitalWrite(12, HIGH);
030
031
}
032
void
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
088
void
A01()
089
{
090
091
PORTD=(a0);
// пишем "0" в порт D
092
DDRB=B1;
// первая цифра
093
delay(70);
094
PORTD=(a1);
// пишем "1" в порт B
095
DDRB=B10;
//вторая цифра
096
delay(70);
097
098
pusk();
099
}
100
void
A02()
101
{
102
delay(70);
103
PORTD=(a0);
// пишем "0" в порт D
104
DDRB=B1;
105
delay(70);
106
PORTD=(a2);
// пишем "2" в порт В
107
DDRB=B10;
108
109
pusk();
110
}
111
void
A03()
112
{
113
delay(70);
114
PORTD=(a0);
// пишем "0" в порт D
115
DDRB=B1;
116
delay(70);
117
PORTD=(a3);
// пишем "3" в порт B
118
DDRB=B10;
119
120
pusk();
121
}
122
void
A04()
123
{
124
delay(70);
125
PORTD=(a0);
// пишем "0" в порт D
126
DDRB=B1;
127
delay(70);
128
PORTD=(a4);
// пишем "4" в порт B
129
DDRB=B10;
130
131
pusk();
132
}
133
void
A05()
134
{
135
delay(70);
136
PORTD=(a0);
// пишем "0" в порт D
137
DDRB=B1;
138
delay(70);
139
PORTD=(a5);
// пишем "5" в порт B
140
DDRB=B10;
141
142
pusk();
143
}
144
void
A06()
145
{
146
delay(70);
147
PORTD=(a0);
// пишем "0" в порт D
148
DDRB=B1;
149
delay(70);
150
PORTD=(a6);
// пишем "6" в порт B
151
DDRB=B10;
152
153
pusk();
154
}
155
void
A07()
156
{
157
delay(70);
158
PORTD=(a0);
// пишем "0" в порт D
159
DDRB=B1;
160
delay(70);
161
PORTD=(a7);
// пишем "7" в порт B
162
DDRB=B10;
163
164
pusk();
165
}
166
void
A08()
167
{
168
delay(70);
169
PORTD=(a0);
// пишем "0" в порт D
170
DDRB=B1;
171
delay(70);
172
PORTD=(a8);
// пишем "8" в порт B
173
DDRB=B10;
174
175
pusk();
176
}
177
void
A09()
178
{
179
delay(70);
180
PORTD=(a0);
// пишем "0" в порт D
181
DDRB=B1;
182
delay(70);
183
PORTD=(a9);
// пишем "9" в порт B
184
DDRB=B10;
185
186
pusk();
187
}
188
void
A10()
189
{
190
delay(70);
191
PORTD=(a1);
// пишем "1" в порт D
192
DDRB=B1;
193
delay(70);
194
PORTD=(a0);
// пишем "0" в порт B
195
DDRB=B10;
196
197
pusk();
198
}
199
void
A11()
200
{
201
delay(70);
202
PORTD=(a1);
// пишем "1" в порт D
203
DDRB=B1;
204
delay(70);
205
PORTD=(a1);
// пишем "1" в порт B
206
DDRB=B10;
207
208
pusk();
209
}
210
void
A12()
211
{
212
delay(70);
213
PORTD=(a1);
// пишем "1" в порт D
214
DDRB=B1;
215
delay(70);
216
PORTD=(a2);
// пишем "2" в порт B
217
DDRB=B10;
218
219
pusk();
220
}
221
void
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
}
и не пойму почему выход с 10 пина всего лишь 0.05мА? когда на остальных 250мА?
http://arduino.ru/forum/programmirovanie/semisegmentnyi-dvukhrazryadnyi-...
и не пойму почему выход с 10 пина всего лишь 0.05мА? когда на остальных 250мА?
Да, Вы как-то странно ток измеряете. Амперметр встраивается в цепь последовательно, а Вы как его к 6-му пину присобачили? Вы просто закоротили пин на землю и что-то там измеряете.
Значит, начнём с того, что эту схему выбрасываем.
Нагрузка на 8-ой и 9-пины здесь у Вас будет доходить до 160 ма, при предельно допустимой - 40.
В цепи пинов 0-7 необходимо вставлять токоограничивающие резисторы (в каждую свой), чтобы ток не превышал 20мА на каждом пине. Какие резисторы - зависит от Вашего семисегментника (какого цвета и т.п.). Если красный - я бы начал со 150 ом, а там померял бы ток и подобрал бы поточнее.
Программу тоже выбрасываем.
Вы не ответили, что у Вас делают 70мс задержки во всех функциях? Полагаю, чтобы успеть полюбоваться на светящуюся цифру? Это очень большие задержки, дисплей будет замето на глаз переключаться. Да и нужны они только когда цифра светится, а не когда погашена.
Запомните, задержка переключения цифр в семисегментике равна 20/<количество разрядов>, т.е. у Вас она равна 10мс. Кроме того, задержка здесь делается не делэями, я таймером иначе экран по-любому будет дёргаться, т.к. задержка у Вас будет зависеть от скорости loop.
Но, всё сразу - слишком много, давайте со схемы начнём. нарисуйте нормальную схему, а потом можно будет и о программе поговорить.
Кстати, что у Вас там на 10 пине? Светодиод? Тоже токоограничивающий резистор вставляйте.
спасибо большое!
Кстати, кнопки на пинах А1 и 12 притянуты к питанию, а на пине 11 почему-то нет. За что её так обидели? Притягивать надо все.
В принципе резисторы у кнопок можно и выкинуть, а пользоваться встроенными в контроллер. Для этого вместо INPUT соответсвующему пину надо говорить INPUT_PULLUP
на 10-ом светодиод, не светится... задержку 70 ставлю пока в протеусе гоняю, когда буду ставить на макетке, сделаю и резисторы и задержку меньше. но конечно думал вообще от нее избавиться - это не проблемма. без delay а с millis(). все будет работать, нашел библиотеку #include <SevSeg.h> не совсем могу разобраться с ней. в общем передумал такую большую программу строить строил для того что бы понять как все работает. с библиотекой все конечно проще. но где интерес. на счет библиотеки знаете что нибудь?
01
/*
02
testWholeDisplay.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
08
By Gabriel Staples
09
Website: <a href="http://www.ElectricRCAircraftGuy.com" title="http://www.ElectricRCAircraftGuy.com" rel="nofollow">http://www.ElectricRCAircraftGuy.com</a>
10
My contact info is available by clicking the "Contact Me" tab at the top of my website.
11
Written: 1 Oct. 2015
12
Last Updated: 1 Oct. 2015
13
*/
14
15
/*
16
LICENSING:
17
-this *example file* only is modified from Dean Reading's original example, and is in the public domain.
18
19
Dean Reading's SevSeg library is as follows:
20
Copyright 2014 Dean Reading
21
22
Licensed under the Apache License, Version 2.0 (the "License");
23
you may not use this file except in compliance with the License.
24
You may obtain a copy of the License at
25
<a href="http://www.apache.org/licenses/LICENSE-2.0" title="http://www.apache.org/licenses/LICENSE-2.0" rel="nofollow">http://www.apache.org/licenses/LICENSE-2.0</a>
26
27
Unless required by applicable law or agreed to in writing, software
28
distributed under the License is distributed on an "AS IS" BASIS,
29
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30
See the License for the specific language governing permissions and
31
limitations under the License.
32
*/
33
34
#include <SevSeg.h>
35
36
SevSeg sevseg;
//Instantiate a seven segment controller object
37
int
schet = 1;
38
unsigned
long
start = 0;
39
void
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
53
void
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"
может это просто глюк протеуса?
Нет, там надо не с миллис, а именно с таймером - так точнее и точно не будет дёргаться.
Библиотекой никогда не интересовался - это настолько простая операция. что тянуть сюда ещё чужие ошибки совсем не хочется - мне своих хватает.
Про цифру, думаю замените в 66 строке 1 на 2 и всё образуется, но, повторяю, библиотеку никогда не смотрел и смотреть не имею желания.
Это очень простая программа, давайте её напишем, только по-возможности не с протеусом с номальным живым железом. Вы нарисовали нормальную схему?
в 66 строке меняю- ничего не происходит. железа нормального нет пока. завтра будет, пойду куплю.
переписал немного код. но delay еще оставил
001
int
a0=B11111101;
002
int
a1=B01100001;
003
int
a2=B11011010;
004
int
a3=B11110010;
005
int
a4=B01100110;
006
int
a5=B10110110;
007
int
a6=B10111110;
008
int
a7=B11100000;
009
int
a8=B11111110;
010
int
a9=B11110110;
011
012
long
kolichestvo_sekund = 100;
013
unsigned
long
startstop = 0;
014
unsigned
long
currentMillis = 0;
015
int
schet = 1;
016
const
int
vihod = 10;
// номер выхода, подключенного к светодиоду
017
018
int
vihodState = LOW;
019
long
previousMillis = 0;
020
unsigned
long
dlya_sekund = 0;
021
022
void
setup
() {
023
DDRD=B11111111;
// пины порта D и B обозначаем выходными
024
pinMode(10, OUTPUT);
025
pinMode(11, INPUT);
026
digitalWrite(11, HIGH);
027
pinMode(12, INPUT);
028
digitalWrite(12, HIGH);
029
030
}
031
void
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
087
void
A01()
088
{
089
090
PORTD=(a0);
// пишем "0" в порт D
091
DDRB=B10;
// первая цифра
092
delay(70);
093
PORTD=(a1);
// пишем "1" в порт B
094
DDRB=B01;
//вторая цифра
095
delay(70);
096
097
pusk();
098
}
099
void
A02()
100
{
101
delay(70);
102
PORTD=(a0);
// пишем "0" в порт D
103
DDRB=B10;
104
delay(70);
105
PORTD=(a2);
// пишем "2" в порт В
106
DDRB=B01;
107
108
pusk();
109
}
110
void
A03()
111
{
112
delay(70);
113
PORTD=(a0);
// пишем "0" в порт D
114
DDRB=B10;
115
delay(70);
116
PORTD=(a3);
// пишем "3" в порт B
117
DDRB=B01;
118
119
pusk();
120
}
121
void
A04()
122
{
123
delay(70);
124
PORTD=(a0);
// пишем "0" в порт D
125
DDRB=B10;
126
delay(70);
127
PORTD=(a4);
// пишем "4" в порт B
128
DDRB=B01;
129
130
pusk();
131
}
132
void
A05()
133
{
134
delay(70);
135
PORTD=(a0);
// пишем "0" в порт D
136
DDRB=B10;
137
delay(70);
138
PORTD=(a5);
// пишем "5" в порт B
139
DDRB=B01;
140
141
pusk();
142
}
143
void
A06()
144
{
145
delay(70);
146
PORTD=(a0);
// пишем "0" в порт D
147
DDRB=B10;
148
delay(70);
149
PORTD=(a6);
// пишем "6" в порт B
150
DDRB=B01;
151
152
pusk();
153
}
154
void
A07()
155
{
156
delay(70);
157
PORTD=(a0);
// пишем "0" в порт D
158
DDRB=B10;
159
delay(70);
160
PORTD=(a7);
// пишем "7" в порт B
161
DDRB=B01;
162
163
pusk();
164
}
165
void
A08()
166
{
167
delay(70);
168
PORTD=(a0);
// пишем "0" в порт D
169
DDRB=B10;
170
delay(70);
171
PORTD=(a8);
// пишем "8" в порт B
172
DDRB=B01;
173
174
pusk();
175
}
176
void
A09()
177
{
178
delay(70);
179
PORTD=(a0);
// пишем "0" в порт D
180
DDRB=B10;
181
delay(70);
182
PORTD=(a9);
// пишем "9" в порт B
183
DDRB=B01;
184
185
pusk();
186
}
187
void
A10()
188
{
189
delay(70);
190
PORTD=(a1);
// пишем "1" в порт D
191
DDRB=B10;
192
delay(70);
193
PORTD=(a0);
// пишем "0" в порт B
194
DDRB=B01;
195
196
pusk();
197
}
198
void
A11()
199
{
200
delay(70);
201
PORTD=(a1);
// пишем "1" в порт D
202
DDRB=B10;
203
delay(70);
204
PORTD=(a1);
// пишем "1" в порт B
205
DDRB=B01;
206
207
pusk();
208
}
209
void
A12()
210
{
211
delay(70);
212
PORTD=(a1);
// пишем "1" в порт D
213
DDRB=B10;
214
delay(70);
215
PORTD=(a2);
// пишем "2" в порт B
216
DDRB=B01;
217
218
pusk();
219
}
220
void
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
}
а на счет таймеров. я не могу понять... я пробовал понять - почитать, но без успеха... нудно как то)) можете сказать в чем смысл таймера? и когда он лучше? и чем.
Где резисторы в цепях пинов с 0 по 7? В каждой цепи должен быть свой резистор.
Зачем резисторы R4-R7? Они не нужны. Там транзисторы надо ставить. Иначе у Вас через эти два пина ток пойдёт в 4 раза больше предельно допустимого.
"Живого индикатора" у Вас пока нет или уже есть? Если есть, кто какой? Они бывают с общим анодом (ОА) и общим катодом (ОК). Пока не знаем какой у Вас, не понимаем как ставить транзисторы. ОА не лучше и не хуже, чем ОК, но схема делается по-разному.
а на счет таймеров. я не могу понять... я пробовал понять - почитать, но без успеха... нудно как то)) можете сказать в чем смысл таймера? и когда он лучше? и чем.
заводишь таймер, чтобы он тикал например, каждый 10мс. И он тикает именно каждые 10мс и ему глубоко плевать что у Вас делается в программе, какие там делэи и сколько времени занимает счёт - его дело тикать, он и тикает.
Т.е. с таймером мы гарантируем срабатывание через равные, правильные промежутки независимо от того, что делается в остальное программе.
Если же делать с миллис, то ничего этого не гарантируется, т.к. реально всё зависит от скорости выполнения loop. Если loop выполняется очень быстро, то с миллис можно сделать приемлемо, но если loop чуть тормознёт - всё поплывёт.
про индикаторы уже знаю, но планирую с обшим катодом. на схеме с общим катодом. покупать буду. пока определяюсь с элементами.
R4-R5 токоограничивающие,зачем на все пины ставить с 0 по 7 ставить. когда можно на 2 поставить? не упрек, просто думал так тоже нормально будет. просто из электротехники знаю, если через нагрузку идет ток, то не важно перед нагрузкой или после ставить резистор для уменьшения потребления нагрузки
R6-R7 думал для более четкого плюса на катоде. поэтому 470кОм думаю не помешают, а помехи уберут. в реальной схеме стять не будут. а вот в протеусе просто индикаторы "идиальные" и у них нет сопротивления. т.е. диоды без потребления. если поставить в разрыв с катодом "МИКРО"амперметр, то он даже показывает 000.
заводишь таймер, чтобы он тикал например, каждый 10мс. И он тикает именно каждые 10мс и ему глубоко плевать что у Вас делается в программе, какие там делэи и сколько времени занимает счёт - его дело тикать, он и тикает.
Т.е. с таймером мы гарантируем срабатывание через равные, правильные промежутки независимо от того, что делается в остальное программе.
Если же делать с миллис, то ничего этого не гарантируется, т.к. реально всё зависит от скорости выполнения loop. Если loop выполняется очень быстро, то с миллис можно сделать приемлемо, но если loop чуть тормознёт - всё поплывёт.
ааааа, крутая штука. т.е. светодиоды будут более равномерно переключаться. крутяк) а есть какой нибудь готовый шаблон, что бы на нем потренироваться?
R4-R5 токоограничивающие,зачем на все пины ставить с 0 по 7 ставить. когда можно на 2 поставить? не упрек, просто думал так тоже нормально будет. просто из электротехники знаю, если через нагрузку идет ток, то не важно перед нагрузкой или после ставить резистор для уменьшения потребления нагрузки
Так нельзя. Вот смотрите, какой именно ток они должны ограничивать? Очевидно, что ток всех сегментов (т.е. цифра 8 и точка). Нормальный ток светодиода - 20мА, стало быть, здесь Вам надо иметь ограничение 8х20 = 160мА. Отлично. Теперь представим себе, что у нас там цифра 1 без точки, т.е. горят 2 светодиода. А ток мы ограничиваем на 160мА. Стало быть эти два диода сожрут не по 20, как им положено, а по 80! Может быть сгорят, а может и нет, но если и не сгорят, то во-первых будут меньше служить, а во-вторых, цифра 1 будет светиться существенно ярче, чем 8-ка (т.к. там каждому меньше тока досталось). Понимаете?
Не нужны они там. Там нужен нормальный транзистор. Если у Вас общий катод, то транзистор (NPN) ставится так:
От пина ардуино через токоограничивающий резистор R1, подаём сигнал на базу. Отдельно от базы стоит поставить резистор R2 = примерно 10хR1 на GND. Эмиттер транзистора - на GND. Коллектор - на пин цифры индикатора. Никакого токоограничивающего резистора в цепи коллектора не надо, т.к. ток в этой цепи уже ограничен резисторами, который Вы поставите в цепь 0-7 пинов.
----------
Теперь скажите, а какая у Вас ардуина (uno, mega, nano)? Это важно.
а есть какой нибудь готовый шаблон, что бы на нем потренироваться?
там ровно три строки кода. Доберёмся. Давайте со схемой разгребём.
Скачайте книгу https://dl.dropboxusercontent.com/u/32245429/arduinoBasicConnections.pdf
Там на странице 9 есть схема подключения семисегментника (правда четырёхразрядного). Там, правда, лбщий анод, но разниуа только в том, как транзисторы соединять. Как надо для общего катода я Вам написал. Ещё там нет резисторов от базы к земле. Можно и без них, но очень рекомvендую. Это как раз защита от ЭМИ. У меня внук недавно собрал по той схеме (без резисторов), а потом прибежал ко мне: "дед, а чё у меня цифры на экране дёргаются, когда я настольную лампу включаю?" :)
Не нужны они там. Там нужен нормальный транзистор. Если у Вас общий катод, то транзистор (NPN) ставится так:
От пина ардуино через токоограничивающий резистор R1, подаём сигнал на базу. Отдельно от базы стоит поставить резистор R2 = примерно 10хR1 на GND. Эмиттер транзистора - на GND. Коллектор - на пин цифры индикатора. Никакого токоограничивающего резистора в цепи коллектора не надо, т.к. ток в этой цепи уже ограничен резисторами, который Вы поставите в цепь 0-7 пинов.
так транзисторы все таки надо ставить на эмиторы светодиодов? т.е. 8шт.?
Теперь скажите, а какая у Вас ардуина (uno, mega, nano)? Это важно.
Nano
Скачайте книгу https://dl.dropboxusercontent.com/u/32245429/arduinoBasicConnections.pdf
Там на странице 9 есть схема подключения семисегментника (правда четырёхразрядного). Там, правда, лбщий анод, но разниуа только в том, как транзисторы соединять. Как надо для общего катода я Вам написал. Ещё там нет резисторов от базы к земле. Можно и без них, но очень рекомvендую. Это как раз защита от ЭМИ. У меня внук недавно собрал по той схеме (без резисторов), а потом прибежал ко мне: "дед, а чё у меня цифры на экране дёргаются, когда я настольную лампу включаю?" :)
скачал книгу и понял)))
так транзисторы все таки надо ставить на эмиторы светодиодов? т.е. 8шт.?
Тогда я бы не стал использовать порт D целиком для подключения сегментов, т.к. 0 и 1 биты этого порта - это Rx и Tx соответсвенно. Формально их можно как-то использовать, но лучше не надо. CH340 может такого не пережить.
так?
Тогда я бы не стал использовать порт D целиком для подключения сегментов, т.к. 0 и 1 биты этого порта - это Rx и Tx соответсвенно. Формально их можно как-то использовать, но лучше не надо. CH340 может такого не пережить.
эх... тогда всю программу перепысывать))) CH340 мне и не нужен будет потом))) один раз залью, и будет агрегат работать) но для надежности конечно я бы переделал. т.е. я все кнопки перенесу на аналоговые входы. и у меня как раз освободятся 11 и 12. перенесу 10-й т.е. что бы на цифры шли с 2 по 12, а по коду то что?) и значально был вопрос как упростить код. или мы к этому перейдем еще?)
Нет. Вы эмиттер с коллектором, похоже, перепутали. Стрелочку у транзистора видите? Это эмиттер. Так вот теперь проведите пальцем по схеме от + к GND. (В данном случае, это от 0-7 пина ардуины, через экран и транзистор, к Gnd). Видите, у Вас ток против стрелки пошёл? Подключать надо наоборот эмиттером (со стрелкой) к земле, а коллектором к экрану. (А если бы был общий анод, то коллектором к питанию, а эмиттером к экрану - как в той книге, что я Вам дал). Тогда при прохождении от + к - ток будет идти по стрелке.
прошу прощения, вот так?
эх... тогда всю программу перепысывать)))
А её и так переписывать. И короче она станет раз в пять. дожмём схему, потом займёмся программой
симулятор включаю - вообще ничего не работает))) показывает 00
прошу прощения, вот так?
Примерно так. От R1-R3 можно избавиться, если в программе INPUT на INPUT_PULLUP заменить.
R4-R11 лучше подобрать на железе поточнее.
R12-R13 зависят от используемых транзисторов. Вы какие собираетесь ставить? Если собираетесь только покупать, то у Вас полная свобода - подойдёт любой NPN транзистор с током коллектора от 200mA. Например, копеечные 2N2222 - только в путь. Как выберете тип транзистора, прикинем какие там резисторы нужны.
симулятор включаю - вообще ничего не работает))) показывает 00
Мы ещё до программы не добрались. Вы торопитесь.
Сейчас я исчезаю. Появлюсь часов около восьми вечера.
в конечном итоге схема будет выглядеть так
и сразу забегу вперед, вместо светодиода D1 будет стоять схема управления нагрузкой 220В, как еще она будет реализована - я не знаю
вверх
Мы ещё до программы не добрались. Вы торопитесь.
Сейчас я исчезаю. Появлюсь часов около восьми вечера.
Что то вы пропали..
Простите, дейстаительно пропал. Вот вернулся.
У Вас эта схема собрана?
Теперь давайте сделаем программу, которая просто засветит одну цифру. Пока не будем париться про универсальность.
Для того, чтобы засветить одну цифру, надо:
1. подать HIGH на пин 10 (первая цифра) или 11 (вторая цифра).
2. подать HIGH на те пины из 0-7, которые отвечают за сегменты, которые должны светиться. Например, если подать HIGH на все сразу, то это будет восьмёрка с точкой.
Сделайет пока функцию, которая зажигает одну цифру (любую конкретную, мы следующим шпгом присаобачим универсальность).
Простите, дейстаительно пропал. Вот вернулся.
У Вас эта схема собрана?
Теперь давайте сделаем программу, которая просто засветит одну цифру. Пока не будем париться про универсальность.
Для того, чтобы засветить одну цифру, надо:
1. подать HIGH на пин 10 (первая цифра) или 11 (вторая цифра).
2. подать HIGH на те пины из 0-7, которые отвечают за сегменты, которые должны светиться. Например, если подать HIGH на все сразу, то это будет восьмёрка с точкой.
Сделайет пока функцию, которая зажигает одну цифру (любую конкретную, мы следующим шпгом присаобачим универсальность).
схема только в протеусе собрана. она тоже хорошо тестируется. пока не определился с управление мощностью, поэтому не собираю схему. тестирую в протеусе. потом на печатную плату перевожу сразу. если все токи устраивают.
01
void
setup
() {
02
// put your setup code here, to run once:
03
04
}
05
06
void
loop
() {
07
// put your main code here, to run repeatedly:
08
PORTD=B11111000;
09
PORTB=B000110;
10
11
}
Примерно так. От R1-R3 можно избавиться, если в программе INPUT на INPUT_PULLUP заменить.
R4-R11 лучше подобрать на железе поточнее.
R12-R13 зависят от используемых транзисторов. Вы какие собираетесь ставить? Если собираетесь только покупать, то у Вас полная свобода - подойдёт любой NPN транзистор с током коллектора от 200mA. Например, копеечные 2N2222 - только в путь. Как выберете тип транзистора, прикинем какие там резисторы нужны.
этот пост почему-то не видел.... транзисторы 2n3904 есть в наличии
светятся сразу 2 цифры. на оба катода почему-то приходит по (-) хотя посылаю на 10 pin -HIGH
Во-первых, явно сконфигурите пины на OUTPUT.
Во-вторых, если это можно в протеусе, не могли бы Вы писать не через порты, а через пины (потом поменяем, но пока отлаживаемся, так виднее, а то я на вскидку номера портов не помню и приходится смотреть). Давайте, перепишем, попробуем и выложим скетч
немного разобрался. но до конца не понял. переделал скетч
01
void
setup
() {
02
// put your setup code here, to run once:
03
pinMode(2, OUTPUT);
04
pinMode(3, OUTPUT);
05
pinMode(4, OUTPUT);
06
pinMode(5, OUTPUT);
07
pinMode(6, OUTPUT);
08
pinMode(7, OUTPUT);
09
pinMode(8, OUTPUT);
10
pinMode(9, OUTPUT);
11
pinMode(10, OUTPUT);
12
pinMode(11, OUTPUT);
13
14
}
15
16
void
loop
() {
17
// put your main code here, to run repeatedly:
18
digitalWrite(2, LOW);
19
digitalWrite(3, HIGH);
20
digitalWrite(4, HIGH);
21
digitalWrite(5, HIGH);
22
digitalWrite(6, HIGH);
23
digitalWrite(7, HIGH);
24
digitalWrite(8, LOW);
25
digitalWrite(9, HIGH);
26
digitalWrite(10, HIGH);
27
digitalWrite(11, LOW);
28
}
на контроллере если замкнуть на землю ногу и померить ток, то получаеться 0.25А, в предыдущей версии скетча почему-то было 0.05мА.
вот почему? потому что надо как-то объявить пины выходом? если да то как их группой объявить?
и переделал схему, на эмитор подал плюс вместо минуса. все заработало, загорелась одна цифра
этот пост почему-то не видел.... транзисторы 2n3904 есть в наличии
Ага, коффициент усиления очень низкий (от 30).
Светодиоды какого цвета (на экранчике)? Да, впрочем, ладно R12-R13 ставьте на 68 ом, если нет, то можно даже 62 - не умрёт, но меньше уже не стоит.
вот почему? потому что надо как-то объявить пины выходом? если да то как их группой объявить?
Про группы, давайте вернёмся, кргда всё заработает. Несложно, но вот когда всё будет работать - сделаем группами.
и переделал схему, на эмитор подал плюс вместо минуса. все заработало, загорелась одна цифра
Как хотите, можно и так. Я бы переделал программу, а не схему. Смотрите в чём разница.
Сейчас для того, чтобы зажечь цифру, Вам надо подать на пин базы тразнизстора LOW. А чтобы погасить - HIGH При включении МК (пока Ваша программа не успела туда ничего подать) там быдет LOW, и и цифра может мигнуть/дёрнуться.
А если Вы сделаете, как было раньше, то чтобы зажечь, подавать надо HIGH, а погасить - LOW. Поэспериментируйте и определитесь как Вы будете делать.
Как только убедитесь, что Вы можете уверено зажечь и погасить нужную цифру, перейдём с ледующему шагу - универсальной функции для любой цифры.
при подключении эмитора на минус у меня в коде было прописанно что 10 в HIGH а 11 в LOW но почему-то все равно горели 2 цифры... подключил эмитор на плюс и все заработало. вообщем передумал я немного, транзисторы буду ставить pnp т.к. с общим анодом буду применять индикатор и он будет 3-ех сегментный. вместо кнопок поставлю энкодер. т.к. буду регулировать сварочный импульс от 0.01 секунды. для споттера очень важно. думаю 0.1 будет много. на кузове остаються точки прожженые. а этого мне не нужно. но это уже другая тема. транзисторы 2n5551. но суть схемы понял. и еще рассчитать резисторы для индикатора как? потому что даташида не нашел на него.сколько вольт и ампер каждый сегмент сможет выдержить продолжительное время
Извините, что вмешиваюсь в ваш диалог. d13lider, вы как будете это собирать - делать печатную плату или навесным монтажом?
Извините, что вмешиваюсь в ваш диалог. d13lider, вы как будете это собирать - делать печатную плату или навесным монтажом?
Сразу на печатку
Извините, что вмешиваюсь в ваш диалог. d13lider, вы как будете это собирать - делать печатную плату или навесным монтажом?
До этого делал проект на автозапуск авто по Gsm все заработало, тоже разработал все в протеусе почти, кроме команд gsm модуля.
Тогда подумайте о том, чтобы используемые пины назначать не явно (2, 3, 4...), а через #define. Например,
1
#define A_SEG 2
2
#define B_SEG 3 // и т.д.
Будете разводить плату, поймете почему.