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

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

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

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

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



​



void loop() {
  if (millis()>dlya_sekund + 150){
 if (digitalRead(12) == 0){
 dlya_sekund = millis();
 schet = schet +1;
 if (schet > 12){
  schet = 1;
 }
 }
 else if (digitalRead(11) == 0){
 dlya_sekund = millis();
 schet = schet -1;
 if (schet < 0){
  schet = 12;
 }
 }
  }
 if (schet == 1){
  A01();
 }
 else if (schet == 2){
  A02();
 }
  else if (schet == 3){
  A03();
 }
 else if (schet == 4){
  A04();
 }
 else if (schet == 5){
  A05();
 }
 else if (schet == 6){
  A06();
 }
 else if (schet == 7){
  A07();
 }
 else if (schet == 8){
  A08();
 }
 else if (schet == 9){
  A09();
 }
 else if (schet == 10){
  A10();
 }
 else if (schet == 11){
  A11();
 }
 else if (schet == 12){
  A12();
 }
 
 }

void A01()
{
  
PORTD=(a0);// пишем "0" в порт D
DDRB=B1; // первая цифра
delay(70);
PORTD=(a1);// пишем "1" в порт B
DDRB=B10; //вторая цифра
delay(70);

pusk();
}
void A02()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a2);// пишем "2" в порт В
DDRB=B10;

pusk();
}
void A03()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a3);// пишем "3" в порт B
DDRB=B10;

pusk();
}
void A04()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a4);// пишем "4" в порт B
DDRB=B10;

pusk();
}
void A05()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a5);// пишем "5" в порт B
DDRB=B10;

pusk();
}
void A06()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a6);// пишем "6" в порт B
DDRB=B10;

pusk();
}
void A07()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a7);// пишем "7" в порт B
DDRB=B10;

pusk();
}
void A08()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a8);// пишем "8" в порт B
DDRB=B10;

pusk();
}
void A09()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a9);// пишем "9" в порт B
DDRB=B10;

pusk();
}
void A10()
{
delay(70);
PORTD=(a1);// пишем "1" в порт D
DDRB=B1;
delay(70);
PORTD=(a0);// пишем "0" в порт B
DDRB=B10;

pusk();
}
void A11()
{
delay(70);
PORTD=(a1);// пишем "1" в порт D
DDRB=B1;
delay(70);
PORTD=(a1);// пишем "1" в порт B
DDRB=B10;

pusk();
}
void A12()
{
delay(70);
PORTD=(a1);// пишем "1" в порт D
DDRB=B1;
delay(70);
PORTD=(a2);// пишем "2" в порт B
DDRB=B10;

pusk();
}

 

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

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

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

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

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

 

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

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

int a0=B11111101;
int a1=B01100001;
int a2=B11011010;
int a3=B11110010;
int a4=B01100110;
int a5=B10110110;
int a6=B10111110;
int a7=B11100000;
int a8=B11111110;
int a9=B11110110;

long kolichestvo_sekund = 100;
unsigned long startstop = 0;
unsigned long currentMillis = 0;
int schet = 1;
const int vihod =  10;      // номер выхода, подключенного к светодиоду

int vihodState = LOW;             // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения светодиода
 
unsigned long dlya_sekund = 0;

void setup() {
DDRD=B11111111; // пины порта D и B обозначаем выходными
pinMode(10, OUTPUT);
pinMode(11, INPUT);
digitalWrite(11, HIGH);
pinMode(12, INPUT);
digitalWrite(12, HIGH);

}
void loop() {
  if (millis()>dlya_sekund + 150){
 if (digitalRead(12) == 0){
 dlya_sekund = millis();
 schet = schet +1;
 if (schet > 12){
  schet = 1;
 }
 }
 else if (digitalRead(11) == 0){
 dlya_sekund = millis();
 schet = schet -1;
 if (schet < 0){
  schet = 12;
 }
 }
  }
 if (schet == 1){
  A01();
 }
 else if (schet == 2){
  A02();
 }
  else if (schet == 3){
  A03();
 }
 else if (schet == 4){
  A04();
 }
 else if (schet == 5){
  A05();
 }
 else if (schet == 6){
  A06();
 }
 else if (schet == 7){
  A07();
 }
 else if (schet == 8){
  A08();
 }
 else if (schet == 9){
  A09();
 }
 else if (schet == 10){
  A10();
 }
 else if (schet == 11){
  A11();
 }
 else if (schet == 12){
  A12();
 }
 
 }

void A01()
{
  
PORTD=(a0);// пишем "0" в порт D
DDRB=B1; // первая цифра
delay(70);
PORTD=(a1);// пишем "1" в порт B
DDRB=B10; //вторая цифра
delay(70);

pusk();
}
void A02()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a2);// пишем "2" в порт В
DDRB=B10;

pusk();
}
void A03()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a3);// пишем "3" в порт B
DDRB=B10;

pusk();
}
void A04()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a4);// пишем "4" в порт B
DDRB=B10;

pusk();
}
void A05()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a5);// пишем "5" в порт B
DDRB=B10;

pusk();
}
void A06()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a6);// пишем "6" в порт B
DDRB=B10;

pusk();
}
void A07()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a7);// пишем "7" в порт B
DDRB=B10;

pusk();
}
void A08()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a8);// пишем "8" в порт B
DDRB=B10;

pusk();
}
void A09()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B1;
delay(70);
PORTD=(a9);// пишем "9" в порт B
DDRB=B10;

pusk();
}
void A10()
{
delay(70);
PORTD=(a1);// пишем "1" в порт D
DDRB=B1;
delay(70);
PORTD=(a0);// пишем "0" в порт B
DDRB=B10;

pusk();
}
void A11()
{
delay(70);
PORTD=(a1);// пишем "1" в порт D
DDRB=B1;
delay(70);
PORTD=(a1);// пишем "1" в порт B
DDRB=B10;

pusk();
}
void A12()
{
delay(70);
PORTD=(a1);// пишем "1" в порт D
DDRB=B1;
delay(70);
PORTD=(a2);// пишем "2" в порт B
DDRB=B10;

pusk();
}
void pusk()
{
 if (millis()>startstop+2000){
 if (analogRead(A1) == 0)
 {
  
 startstop = millis();
  currentMillis = millis();
  }
 }
  if(millis()<currentMillis+(kolichestvo_sekund*schet))
  {
  vihodState = 1;
  }
  else{
    vihodState = 0;
  }
   digitalWrite(vihod, vihodState);
}

 

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> не совсем могу разобраться с ней. в общем передумал такую большую программу строить строил для того что бы понять как все работает. с библиотекой все конечно проще. но где интерес. на счет библиотеки знаете что нибудь?

/*
testWholeDisplay.ino
-test each segment in the display
-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
-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
 to ensure *every* segment and period lights up

By Gabriel Staples 
Website: http://www.ElectricRCAircraftGuy.com
My contact info is available by clicking the "Contact Me" tab at the top of my website.
Written: 1 Oct. 2015
Last Updated: 1 Oct. 2015
*/

/*
LICENSING:
-this *example file* only is modified from Dean Reading's original example, and is in the public domain.

Dean Reading's SevSeg library is as follows:
Copyright 2014 Dean Reading

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at 
http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include <SevSeg.h>

SevSeg sevseg; //Instantiate a seven segment controller object
int schet = 1;
unsigned long start = 0;
void setup()
{
  byte numDigits = 2;   
  byte digitPins[] = {8, 9}; //Digits: 1,2,3,4 <--put one resistor (ex: 220 Ohms, or 330 Ohms, etc, on each digit pin)
  byte segmentPins[] = {7, 6, 5, 4, 3, 2, 1, 0}; //Segments: A,B,C,D,E,F,G,Period

  sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(99); //Note: 100 brightness simply corresponds to a delay of 2000us after lighting each segment. A brightness of 0 
                            //is a delay of 1us; it doesn't really affect brightness as much as it affects update rate (frequency).
                            //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.
                            //I am choosing a "brightness" of 10 because it increases the max update rate to approx. 1/(200us*8) = 625Hz.
                            //This is preferable, as it decreases aliasing when recording the display with a video camera....I think.
}

void loop()
{
  if(millis()>start+300){
  if (digitalRead(11) == 0){
    schet = schet + 1;
    start = millis();
  }
}
  //local vars
  static byte decPlace = 0;
  
  sevseg.setNumber(schet,decPlace);
  decPlace++;
  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: https://www.arduino.cc/en/Reference/Modulo

  sevseg.refreshDisplay(); // Must run repeatedly; don't use blocking code (ex: delay()) in the loop() function or this won't work right
}





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

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

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

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

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

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

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

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

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

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

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

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

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

int a0=B11111101;
int a1=B01100001;
int a2=B11011010;
int a3=B11110010;
int a4=B01100110;
int a5=B10110110;
int a6=B10111110;
int a7=B11100000;
int a8=B11111110;
int a9=B11110110;

long kolichestvo_sekund = 100;
unsigned long startstop = 0;
unsigned long currentMillis = 0;
int schet = 1;
const int vihod =  10;      // номер выхода, подключенного к светодиоду

int vihodState = LOW;            
long previousMillis = 0;      
unsigned long dlya_sekund = 0;

void setup() {
DDRD=B11111111; // пины порта D и B обозначаем выходными
pinMode(10, OUTPUT);
pinMode(11, INPUT);
digitalWrite(11, HIGH);
pinMode(12, INPUT);
digitalWrite(12, HIGH);

}
void loop() {
  if (millis()>dlya_sekund + 150){
 if (digitalRead(12) == 0){
 dlya_sekund = millis();
 schet = schet +1;
 if (schet > 12){
  schet = 1;
 }
 }
 else if (digitalRead(11) == 0){
 dlya_sekund = millis();
 schet = schet -1;
 if (schet < 0){
  schet = 12;
 }
 }
  }
 if (schet == 1){
  A01();
 }
 else if (schet == 2){
  A02();
 }
  else if (schet == 3){
  A03();
 }
 else if (schet == 4){
  A04();
 }
 else if (schet == 5){
  A05();
 }
 else if (schet == 6){
  A06();
 }
 else if (schet == 7){
  A07();
 }
 else if (schet == 8){
  A08();
 }
 else if (schet == 9){
  A09();
 }
 else if (schet == 10){
  A10();
 }
 else if (schet == 11){
  A11();
 }
 else if (schet == 12){
  A12();
 }
 
 }

void A01()
{
  
PORTD=(a0);// пишем "0" в порт D
DDRB=B10; // первая цифра
delay(70);
PORTD=(a1);// пишем "1" в порт B
DDRB=B01; //вторая цифра
delay(70);

pusk();
}
void A02()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B10;
delay(70);
PORTD=(a2);// пишем "2" в порт В
DDRB=B01;

pusk();
}
void A03()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B10;
delay(70);
PORTD=(a3);// пишем "3" в порт B
DDRB=B01;

pusk();
}
void A04()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B10;
delay(70);
PORTD=(a4);// пишем "4" в порт B
DDRB=B01;

pusk();
}
void A05()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B10;
delay(70);
PORTD=(a5);// пишем "5" в порт B
DDRB=B01;

pusk();
}
void A06()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B10;
delay(70);
PORTD=(a6);// пишем "6" в порт B
DDRB=B01;

pusk();
}
void A07()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B10;
delay(70);
PORTD=(a7);// пишем "7" в порт B
DDRB=B01;

pusk();
}
void A08()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B10;
delay(70);
PORTD=(a8);// пишем "8" в порт B
DDRB=B01;

pusk();
}
void A09()
{
delay(70);
PORTD=(a0);// пишем "0" в порт D
DDRB=B10;
delay(70);
PORTD=(a9);// пишем "9" в порт B
DDRB=B01;

pusk();
}
void A10()
{
delay(70);
PORTD=(a1);// пишем "1" в порт D
DDRB=B10;
delay(70);
PORTD=(a0);// пишем "0" в порт B
DDRB=B01;

pusk();
}
void A11()
{
delay(70);
PORTD=(a1);// пишем "1" в порт D
DDRB=B10;
delay(70);
PORTD=(a1);// пишем "1" в порт B
DDRB=B01;

pusk();
}
void A12()
{
delay(70);
PORTD=(a1);// пишем "1" в порт D
DDRB=B10;
delay(70);
PORTD=(a2);// пишем "2" в порт B
DDRB=B01;

pusk();
}
void pusk()
{
 if (millis()>startstop+2000){
 if (analogRead(A1) == 0)
 {
  
 startstop = millis();
  currentMillis = millis();
  }
 }
  if(millis()<currentMillis+(kolichestvo_sekund*schet))
  {
  vihodState = 1;
  }
  else{
    vihodState = 0;
  }
   digitalWrite(vihod, vihodState);
}

 

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 на все сразу, то это будет восьмёрка с точкой.

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

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

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
PORTD=B11111000;
PORTB=B000110;

}

 

светятся сразу 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

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

void setup() {
  // put your setup code here, to run once:
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
}

на контроллере если замкнуть на землю ногу и померить ток, то получаеться 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. Например,

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

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