Вывод информации на 4 разрядный 7сегментный индикатор при помощи двух 74hc595

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

mag155 пишет:
Подключил резистор через беременную вывожу значения все клас. Подключил библиотеку тензодатчика чтоб выводить вес индикатор вес выводит но цифры мерцают не успеваю разогрется. Может контроллер не успевает подсчитывает информацию с датчика усреднять ее и при этом сегменты зажигать ??

а по ТЗ надо проверять датчик каждый loop? конечно будет мерцать, и вообще по правилам хорошо тона на форуме, чтоб получить адекватный ответ, надо свой код выложить

mag155
Offline
Зарегистрирован: 21.12.2017

??? Не засну

mag155
Offline
Зарегистрирован: 21.12.2017

Код выложу завтра. Он у меня на работе а я дома . Датчик осчитывается через lop . Я думаю если использовать две ардуино одну для индикатора вторую для датчика как считаете ?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

mag155 пишет:
Код выложу завтра. Он у меня на работе а я дома . Датчик осчитывается через lop . Я думаю если использовать две ардуино одну для индикатора вторую для датчика как считаете ?

я же выше задал вопрос: насколько часто надо опрашивать датчик?

mag155
Offline
Зарегистрирован: 21.12.2017

Датчик опрашивается каждый цикл lop.

mag155
Offline
Зарегистрирован: 21.12.2017

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

mag155 пишет:
То есть он лайн измерение веса должно получатся.

онлайн понятие относительное есть секунда, есть минута, но несколько миллисекунд - это перебор :) не реактивный же самолет

mag155
Offline
Зарегистрирован: 21.12.2017

Согласен. Предлагаете условия типа счетчик мерить через какое-то количество циклов ? Или через промежуток времени.?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

mag155 пишет:
Согласен. Предлагаете условия типа счетчик мерить через какое-то количество циклов ? Или через промежуток времени.?

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

mag155
Offline
Зарегистрирован: 21.12.2017

Раз в пол секунды

mag155
Offline
Зарегистрирован: 21.12.2017

Максимум раз в секунду

mag155
Offline
Зарегистрирован: 21.12.2017
Вот такой код все работает но сегменты моргают ??? Не судите строго только учусь.

int anodPins[] = {A1, A2, A3, A4}; // Задаем пины для кажого разряда
int segmentsPins[] = {5, 6, 7, 8, 9, 10, 11, 12}; //Задаем пины для каждого сегмента (из 7 + 1(точка))
#define potent_pin 5 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2); 
#include "HX711.h"
HX711 scale(A5, A0);                          
float calibration_factor = -4.65;          // калибровка!
float units;
float ounces;
void setup() {

scale.tare(); 
scale.set_scale(0.1);
scale.set_scale(calibration_factor); 
 for (int i = 0; i < 4; i++) pinMode(anodPins[i], OUTPUT);
  for (int i = 0; i < 8; i++) pinMode(segmentsPins[i], OUTPUT);
  Serial.begin(9600);
}//{A, B, C, D, E, F, G,DP}
int seg[12][8] = {
  {1, 1, 1, 1, 1, 1, 0, 0}, //Цифра 0
  {0, 1, 1, 0, 0, 0, 0, 0}, //Цифра 1
  {1, 1, 0, 1, 1, 0, 1, 0}, //Цифра 2
  {1, 1, 1, 1, 0, 0, 1, 0}, //Цифра 3
  {0, 1, 1, 0, 0, 1, 1, 0}, //Цифра 4
  {1, 0, 1, 1, 0, 1, 1, 0}, //Цифра 5
  {1, 0, 1, 1, 1, 1, 1, 0}, //Цифра 6
  {1, 1, 1, 0, 0, 0, 0, 0}, //Цифра 7
  {1, 1, 1, 1, 1, 1, 1, 0}, //Цифра 8
  {1, 1, 1, 1, 0, 1, 1, 0}, //Цифра 9
  {0, 0, 0, 0, 0, 0, 1, 0}, //Знак -
  {0, 0, 0, 0, 0, 0, 0, 0}  //Пустой разряд
};
int err[4][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0}, //Пусто
  {1, 0, 0, 1, 1, 1, 1, 0}, //E
  {0, 0, 0, 0, 1, 0, 1, 0}, //r
   {0, 0, 0, 0, 1, 0, 1, 0} //r
};
float numbers[] = {}; // По очереди будем показывать числа - на 100000 на дисплее будет отображена ошибка Err
static int arr[4][8]; // Переменная-массив для хранения данных, которые не нужно каждый раз пересчитывать
int numindex = 0;
float value = 0.0;
int counter = -1;

void loop() {
scale.set_scale(calibration_factor);
 units = scale.get_units(), 10;
   ounces = units * 0.035274;
   if ((counter % 10000) == 0) { // П
    counter = 0;
    getDigits(value);
  }
   
   
   float numbers[] = {ounces};
    // отправляем в монитор порта
 
  counter += 1;
  if ((counter % 20) == 2) { // Пауза между сменами 200 мс
    counter = 0;
    getDigits(numbers[numindex]);
    numindex += 1;
    if (numindex >= sizeof(numbers)/sizeof(float)) numindex = 0;
  }
  displayMessage(arr);
}
void getDigits (float value) {
  Serial.println("");

  // Выдаем ошибку на те значения, которые не можем показать
  if ((value >= 10000) ||
      (value <= -1000) ||
      (value > -0.01 && value < 0.001)) {
    for (int i = 0; i < 4; i++) { // Каждый разряд по очереди
      for (int k = 0; k < 8; k++) {// Каждый сегмент по очереди - исходя из заданной карты
        arr[i][k] = err[i][k];
      }
    }
    return; // Выходим
  }
  int digits = 4; // У нас 4 разряда
  if (value < 0) digits = 3; // Из-за минуса один символ убирается*/
  // Делим число на 2 группы - отдельно целую часть и дробную.
  int intPart = (int)abs(value);
  int intLength = ((String)intPart).length(); // Смотрим, сколько разрядов занимает целая часть
  // На дробную часть у нас остается разрядов: digits-intLength
  int fracPart = (int)((abs(value) - abs(intPart)) * 100); // Мы можем показать максимум 3 знака после запятой - 0,000
  int fracDigits = digits - intLength;
  fracPart = (((String)fracPart).substring(0, fracDigits)).toInt();
  // Собираем строку для отображения
  String output = (value < 0) ? "-" : "";
  output += (String)intPart;
  String outputFrac = ((digits - intLength <= 0) || (fracPart == 0)) ? "" : ((String)"." + ((String)fracPart).substring(0, digits - intLength));
  output += (String)outputFrac;
   // Дополняем символы спереди, если цифр слишком мало, например для "-1" делаем "  -1"
  String spaces = "     ";
  digits = 4;
  if (~output.indexOf(".")) digits += 1;
  if (output.length() < digits) output = spaces.substring(0, digits - output.length()) + output;
  // Формирум данные для показа:
  int dig = -1;
  for (int i = 0; i < output.length(); i++) {
    String _char = output.substring(i, i + 1);
    if (_char != ".") dig += 1; // Точка не занимает сегмент - увеличиваем на 1
    int actualdigit = 11; // По умолчанию пустой символ
    if ((_char == "-")) {
      actualdigit = 10;
    }
    else if (_char == " " || _char == ".") {
    }
    else {
      actualdigit = _char.toInt();
    }

    if (_char == ".") {
      arr[dig][7] = 1; // Если нужно - ставим точку
    }
    else  {
      for (int n = 0; n <= 7; n++) {
        arr[dig][n] = seg[actualdigit][n];
      }
    }
  }
}

void displayMessage(int dig[4][8]) {
  for (int i = 0; i < 4; i++) { // Каждый разряд по очереди
   for (int k = 0; k < 8; k++) {// Каждый сегмент по очереди - исходя из заданной карты
   digitalWrite(segmentsPins[k], ((dig[i][k] == 1) ? 1 : 0));
 }
digitalWrite(anodPins[i], 0);
delay(1);
digitalWrite(anodPins[i], 1);

  }
  }

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

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

digitalWrite в разы замедляет вывод в дисплей, переходите на прямой вывод в порт

http://codius.ru/articles/%D0%A2%D1%8E%D0%BD%D0%B8%D0%BD%D0%B3_Arduino_%...

 

mag155
Offline
Зарегистрирован: 21.12.2017

Можно примерчик а то как- то мне пока сложновато ?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

я же выкладывал в сообщении #169

а по таймерам millis примеров очень много

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
mag155
Offline
Зарегистрирован: 21.12.2017

Изменил ваш скетч под общий катод 

#ifndef cbi

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

#endif

#ifndef sbi

#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

#endif

 

#define PB2_HIGH sbi(PORTB,PB2);

#define PB2_LOW cbi(PORTB,PB2);
#define PB3_HIGH sbi(PORTB,PB3);
#define PB3_LOW cbi(PORTB,PB3);
#define PB4_HIGH sbi(PORTB,PB4);
#define PB4_LOW cbi(PORTB,PB4);
#define FOTORES A1 // grey
// GND yellow +5V maroon
#define LED_SCLK 10 // - blue PB2
#define LED_RCLK 11 // - green PB3
#define LED_DIO 12 // - maroon PB4
// GND yellow +5V orange

byte LED_0F[33] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xC2, 0x89, 0xF9, 0xF1, 0xC3, 0xA9, 0xC0, 0x8C, 0x98, 0x92, 0xC1, 0x91, 0xFE, 0xBF, 0xFF, 0x9C, 0xAB};

// 0123456789AbCdEFGHIJLnOPqSUY_- (null) (degree) (mm)

byte LED_NU[8] = {16, 32, 64, 128, 1, 2, 4, 8};

byte LED_BUF[8] = {0, 1, 2, 3, 4, 7, 8, 9};

byte LED_PWM = 3; // level light 7 = MAX 0 = MIN

 

void setup() {

  // put your setup code here, to run once:

  // OFF unused pins


  //--

  pinMode(LED_SCLK, OUTPUT);

  pinMode(LED_RCLK, OUTPUT);

  pinMode(LED_DIO, OUTPUT);

}

 

byte addPoint(byte inByte) {

  byte outByte = (inByte << 1);

  outByte = (outByte >> 1);

  return outByte;

}

 

void showLedBuf() {

  for (byte lp = 0; lp <= LED_PWM; ++lp) {

    for (byte i = 0; i <= 7; i++) {

      PB3_HIGH;

      for (byte j = 0; j <= 7; j++) {

        if (bitRead(LED_BUF[i], (7 - j))) {

          PB4_LOW;

        } else {

          PB4_HIGH;

        }

        PB2_LOW;

        PB2_HIGH;

      }

      for (byte j = 0; j <= 7; j++) {

        if (bitRead(LED_NU[i], (7 - j))) {

          PB4_LOW;

        } else {

          PB4_HIGH;

        }

        PB2_LOW;

        PB2_HIGH;

      }

      PB3_LOW;

    }

  }

  for (byte lp = 0; lp < (7 - LED_PWM); ++lp) {

    PB3_HIGH;

    PB4_LOW;

    for (byte j = 0; j <= 15; j++) {

      PB2_LOW;

      PB2_HIGH;

    }

    PB3_LOW;

    delayMicroseconds(350);

  }

}

 

void loop() {

  // put your main code here, to run repeatedly:

  // set display light

  word ll = analogRead(FOTORES);

  LED_PWM = map(ll, 0, 1023, 0, 7);

  // show info

  showLedBuf();

  //--- end loop

}

Не работает

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

mag155 пишет:

 

Не работает

 

бывает.......

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

ЗЫ. Вот нафига брать мой скетч переделывать если ваш проект в принципе уже работает, надо просто немного мозг напряч и дописать, или вы думаете час посидели над задачей, не получилось, на форуме написал, подсказали, все хорошо, можно отдыхать :)

alexeko
Offline
Зарегистрирован: 03.01.2014

andycat пишет:

Вот нафига брать мой скетч 

Полностью Согласен. На то он и программист, что строит свои алгоритмы, и подсмотрит у других. Коль взялся писать сам, mag155  , пусть и пишет. А то сопли тут развели. Есть последовательность действий, вот и пусть реализует. 

mag155
Offline
Зарегистрирован: 21.12.2017

Да фиг его знает мозги уже ..... К стати пробовал лсд дисплей подключать тоже Моргает. По ходу программа самого тензодатчика работает по принципу есть значение потом нет. Думаю нужно как то запоминать значение и если оно изменилось менять потом опять запоминать?

bwn
Offline
Зарегистрирован: 25.08.2014

mag155 пишет:
Да фиг его знает мозги уже ..... К стати пробовал лсд дисплей подключать тоже Моргает. По ходу программа самого тензодатчика работает по принципу есть значение потом нет. Думаю нужно как то запоминать значение и если оно изменилось менять потом опять запоминать?

Вам ведь уже сто раз говорили, используйте Сериал для отладки, а не думу думайте.((((

mag155
Offline
Зарегистрирован: 21.12.2017

Сериал смотрел показания миняются с интервалом в пол секунду соответственно и индикатор моргает также. Такое впечатление что код просто замирает на пол секунды.

mag155
Offline
Зарегистрирован: 21.12.2017
  
#include "HX711.h"

HX711 scale(A1, A0);                          

float calibration_factor = -3.7;          // калибровка!
float units;
float ounces;

void setup() {
  Serial.begin(9600); 
  scale.set_scale();
  scale.tare();                              //Сбрасываем на 0
  scale.set_scale(calibration_factor);       //Применяем калибровку
}

void loop() { 

  Serial.print("Reading: ");
  
  for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10;   // усредняем показания считав 10 раз 
  units / 10;                                                   // делим на 10
   
  ounces = units * 0.035274;                                    // переводим унции в граммы              
  Serial.print(ounces);                                          // отправляем в монитор порта
  Serial.print(" grams");  
  Serial.println();

 
}

 

mag155
Offline
Зарегистрирован: 21.12.2017

Всем привет!!! Вопрос машинка на блютуз с регулировкой скорости проблема в том что команды перебивают друг друга. Как можно разделять полученные данные по своим переменным ? Или как лучше это реализовать ?

alexeko
Offline
Зарегистрирован: 03.01.2014

блютуз  - поочередная (последовательная) перередача даных. Сделайте свой протокол.

Принимаем данные и складываем в строку. Где в начале TEG, потом разделитель "/" или любой знак, данные, разделитель, указатель конца команды.

Я так себе делал управление по блютуз. 

mag155
Offline
Зарегистрирован: 21.12.2017

Ого а примерчик строки если не сложно ?

alexeko
Offline
Зарегистрирован: 03.01.2014

https://www.youtube.com/watch?v=Ci-5jLGZj3A  Подсмотрел тут и немного допилил. Принцип как и СЕРИАЛ RS232 портом, только блютуз. А так все одинаково

mag155
Offline
Зарегистрирован: 21.12.2017

Не пойму как записывать в масив 

 val = Serial.read();

Есть переменная Через сериал приходят цыфры как их сложить в масив ? Напишите пример если не сложно ?

alexeko
Offline
Зарегистрирован: 03.01.2014

Делаем условие: IF ( если пришло - > пишем в строку (один символ) -> плюсуем второй символ и т.д. Тут же if( если пришел символ закрытия "типа !" то плюсуем к строке и закрываем цикл) ) и так по кругу. 

ДАЛЕЕ: если прилетевшее слово == "вперед", тогда переменная в перед - str i12asdf  = ЗНАЧЕНИЕ

12asdf - это прямо? а значение 3 - тогда вид будет -> 12asdf /3!

или проше, прями - 123! если прилитело 123 - тогда 12asdf =1;Ну или как у Вас.

Не могу найти кода своего. на С++ найдите как собрать строку "работа со строками", а в конце, типа "!". что будет указывать , что новая переменная прилитела

 

mag155
Offline
Зарегистрирован: 21.12.2017

Если 123 к примеру вперед то когда Шим будет равен 123 она ж поедет вперед?

alexeko
Offline
Зарегистрирован: 03.01.2014

Не так. Команда в перед с устройства, что управляет. Это просто команда. Можно дать и "1" - "9","0". 10 команд. Я же не знаю, какая команда и можите ли Вы ее назначить, указывает условие. По русски, команда в перед как "***" слово из мата.

Пусть при нажатии на кнопку "вперед", у вас по передается "1" и при постоянной передаче "1", алгоритм выставляет выходной пин = HI (логической 1) и так длится скажем 5с, если кнопка отпущена -> в порт дается "" - ничего, то таймер отсчитав 5с, сбросит последнее условие в =LO (логический  0)

Тему поменяйте, тут динамическую индикацию.

mag155
Offline
Зарегистрирован: 21.12.2017

Всем привет с блютузом разобрался разбиваем данные по ячейкам массива и потом работаем отдельно с каждой. Решил вернутся к теме дисплея . И пришла мне идея подключить ардуино в качестве контроллера 4 разрядного индикатора без здвигового регистра. И по rx передавать данные с другой ардуины ну или с того же блютуз. Как писал выше проблемка в том что сигменты мерцают и не горят стабильно если выводим данные на них с переменной . В выводе информации индикатор только пытаюсь разобратся так что прошу помощи?

mag155
Offline
Зарегистрирован: 21.12.2017
byte val = 0;
int anodPins[] = {A1, A2, A3, A4}; // Задаем пины для кажого разряда
int segmentsPins[] = {5, 6, 7, 8, 9, 10, 11, 12}; //Задаем пины для каждого сегмента (из 7 + 1(точка))


void setup() {
 for (int i = 0; i < 4; i++) pinMode(anodPins[i], OUTPUT);
  for (int i = 0; i < 8; i++) pinMode(segmentsPins[i], OUTPUT);
  Serial.begin(9600);
}//{A, B, C, D, E, F, G,DP}
int seg[12][8] = {
  {1, 1, 1, 1, 1, 1, 0, 0}, //Цифра 0
  {0, 1, 1, 0, 0, 0, 0, 0}, //Цифра 1
  {1, 1, 0, 1, 1, 0, 1, 0}, //Цифра 2
  {1, 1, 1, 1, 0, 0, 1, 0}, //Цифра 3
  {0, 1, 1, 0, 0, 1, 1, 0}, //Цифра 4
  {1, 0, 1, 1, 0, 1, 1, 0}, //Цифра 5
  {1, 0, 1, 1, 1, 1, 1, 0}, //Цифра 6
  {1, 1, 1, 0, 0, 0, 0, 0}, //Цифра 7
  {1, 1, 1, 1, 1, 1, 1, 0}, //Цифра 8
  {1, 1, 1, 1, 0, 1, 1, 0}, //Цифра 9
  {0, 0, 0, 0, 0, 0, 1, 0}, //Знак -
  {0, 0, 0, 0, 0, 0, 0, 0}  //Пустой разряд
};
int err[4][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0}, //Пусто
  {1, 0, 0, 1, 1, 1, 1, 0}, //E
  {0, 0, 0, 0, 1, 0, 1, 0}, //r
   {0, 0, 0, 0, 1, 0, 1, 0} //r
};
float numbers[] = {}; // По очереди будем показывать числа - на 100000 на дисплее будет отображена ошибка Err
static int arr[4][8]; // Переменная-массив для хранения данных, которые не нужно каждый раз пересчитывать
int numindex = 0;
float value = 0.0;
int counter = -1;
void loop() {
 int val = Serial.read();
  val = constrain(val, 1, 250);      
    
   Serial.print (val);
  float numbers[] = {val};
    // отправляем в монитор порта
 counter += 1;
 
  if ((counter % 200) == 2) { // Пауза между сменами 200 мс
    counter = 0;
    getDigits(numbers[numindex]);
    numindex += 1;
    if (numindex >= sizeof(numbers)/sizeof(float)) numindex = 0;
  }
  displayMessage(arr);
}
void getDigits (float value) {
  Serial.println("");

  // Выдаем ошибку на те значения, которые не можем показать
  if ((value >= 10000) ||
      (value <= -1000) ||
      (value > -0.01 && value < 0.001)) {
    for (int i = 0; i < 4; i++) { // Каждый разряд по очереди
      for (int k = 0; k < 8; k++) {// Каждый сегмент по очереди - исходя из заданной карты
        arr[i][k] = err[i][k];
      }
    }
    return; // Выходим
  }
  int digits = 4; // У нас 4 разряда
  if (value < 0) digits = 3; // Из-за минуса один символ убирается*/
  // Делим число на 2 группы - отдельно целую часть и дробную.
  int intPart = (int)abs(value);
  int intLength = ((String)intPart).length(); // Смотрим, сколько разрядов занимает целая часть
  // На дробную часть у нас остается разрядов: digits-intLength
  int fracPart = (int)((abs(value) - abs(intPart)) * 100); // Мы можем показать максимум 3 знака после запятой - 0,000
  int fracDigits = digits - intLength;
  fracPart = (((String)fracPart).substring(0, fracDigits)).toInt();
  // Собираем строку для отображения
  String output = (value < 0) ? "-" : "";
  output += (String)intPart;
  String outputFrac = ((digits - intLength <= 0) || (fracPart == 0)) ? "" : ((String)"." + ((String)fracPart).substring(0, digits - intLength));
  output += (String)outputFrac;
   // Дополняем символы спереди, если цифр слишком мало, например для "-1" делаем "  -1"
  String spaces = "     ";
  digits = 4;
  if (~output.indexOf(".")) digits += 1;
  if (output.length() < digits) output = spaces.substring(0, digits - output.length()) + output;
  // Формирум данные для показа:
  int dig = -1;
  for (int i = 0; i < output.length(); i++) {
    String _char = output.substring(i, i + 1);
    if (_char != ".") dig += 1; // Точка не занимает сегмент - увеличиваем на 1
    int actualdigit = 11; // По умолчанию пустой символ
    if ((_char == "-")) {
      actualdigit = 10;
    }
    else if (_char == " " || _char == ".") {
    }
    else {
      actualdigit = _char.toInt();
    }
    if (_char == ".") {
      arr[dig][7] = 1; // Если нужно - ставим точку
    }
    else  {
      for (int n = 0; n <= 7; n++) {
        arr[dig][n] = seg[actualdigit][n];
      }
    }
  }
}
void displayMessage(int dig[4][8]) {
  for (int i = 0; i < 4; i++) { // Каждый разряд по очереди
   for (int k = 0; k < 8; k++) {// Каждый сегмент по очереди - исходя из заданной карты
   digitalWrite(segmentsPins[k], ((dig[i][k] == 1) ? 1 : 0));
 }
digitalWrite(anodPins[i], 0);
delay(1);
digitalWrite(anodPins[i], 1);
  
  }
  }

 

mag155
Offline
Зарегистрирован: 21.12.2017

строка 37 вывод на индикатор

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

такое ощущение что вы так и не прочитали статью

http://arduino.ru/forum/proekty/vyvod-informatsii-na-4-razryadnyi-7segme...

ну и выше уже писал и ссылки давал как делать периодически запускаемый код через millis

прочитаете - реализуете и будет вам счастье

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

если уж совсем ленитесь, вот я вам скопировал кусок кода с комментарием из ссылки которая выше

Иначе говоря правильно будет так

01 unsigned long currentMillis = 1UL;
02 unsigned long previousMillis = 1UL;
03  
04 void setup() {
05  
06 }
07  
08 void loop() {
09     currentMillis = millis();
10     
11     if ( currentMillis - previousMillis >= 500UL ){
12         previousMillis = currentMillis;
13         
14         //этот код повторяться каждые 500 мсек
15  
16     }
17  
18  
19 }

 

mag155
Offline
Зарегистрирован: 21.12.2017

Что просто миллис в место делей? И все ? Нет я знаю как работает миллис просто видать не правильно вас понял. Благодарю за подсказку сделаю напишу.

mag155
Offline
Зарегистрирован: 21.12.2017
void displayMessage(int dig[4][8]) {
  for (int i = 0; i < 4; i++) { // Каждый разряд по очереди
   for (int k = 0; k < 8; k++) {// Каждый сегмент по очереди - исходя из заданной карты
   digitalWrite(segmentsPins[k], ((dig[i][k] == 1) ? 1 : 0));
 }
digitalWrite(anodPins[i],ledState);
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (ledState == 1)     

// if digitalWrite(anodPins[i], 0);
ledState = 0;
  else
      ledState = 1;
     

//digitalWrite(anodPins[i], 1);

}
 
  }
  }

 

mag155
Offline
Зарегистрирован: 21.12.2017

Зделал вот так моргают все сигменты сразу даже если задаю цифру 1 ??? Моргает все сигменты цифрой один получается что счетчик не работает почему ???

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

не.... вы совсем не то делаете :(

и имел в виду исправить в цикле loop запуск каждые 200 мсек ваши на миллисс и проверку датчиков сделать каждую секунду

процедуру отображения пока не трогайте

mag155
Offline
Зарегистрирован: 21.12.2017

Ок буду пробовать.

mag155
Offline
Зарегистрирован: 21.12.2017
void loop() {
  
  

 
   float numbers[] = {val}; 
   
   
   
     
   Serial.print(val);
 unsigned long currentMillis = millis();
   
 if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
  getDigits(numbers[numindex]);
    numindex += 1;
 
    if (numindex >= sizeof(numbers)/sizeof(float)) numindex = 0;
  }
  displayMessage(arr);
}

Зделал вот так но переменная val работает не адекватно даже если на нее не чего не выводить выводит в сериал три ноля (000) в чем может быть причина ?

mag155
Offline
Зарегистрирован: 21.12.2017

Вот так работает но значение в сериал выводит с  пробелом вот так 

125

125

125 

 

mag155
Offline
Зарегистрирован: 21.12.2017

Если через сериал подаю значение с другой ардуины работает четко . Вопрос как все таки избавится от delay в 116 строке?

mag155
Offline
Зарегистрирован: 21.12.2017

Если через сериал подаю значение с другой ардуины работает четко . Вопрос как все таки избавится от delay в 116 строке?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

а где весь код? val где берется?

если смотреть по коду из 233 сообщения,

то торможение в loop цикле еще в строках 37...41, их надо завернуть в условие if serial.available while serilal.available

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

и получается при скорости порта 9600 это сильно тормозит

mag155
Offline
Зарегистрирован: 21.12.2017
int anodPins[] = {A1, A2, A3, A4}; // Задаем пины для кажого разряда
int segmentsPins[] = {5, 6, 7, 8, 9, 10, 11, 12}; //Задаем пины для каждого сегмента (из 7 + 1(точка))
#include <SoftwareSerial.h>
SoftwareSerial radio(0, 1); // RX, TX
float val=0; 
long previousMillis = 0;
long interval = 1; 


void setup() {
 for (int i = 0; i < 4; i++) pinMode(anodPins[i], OUTPUT);
  for (int i = 0; i < 8; i++) pinMode(segmentsPins[i], OUTPUT);
 radio.begin(9600);
  Serial.begin(9600);
}//{A, B, C, D, E, F, G,DP}
int seg[12][8] = {
  {1, 1, 1, 1, 1, 1, 0, 0}, //Цифра 0
  {0, 1, 1, 0, 0, 0, 0, 0}, //Цифра 1
  {1, 1, 0, 1, 1, 0, 1, 0}, //Цифра 2
  {1, 1, 1, 1, 0, 0, 1, 0}, //Цифра 3
  {0, 1, 1, 0, 0, 1, 1, 0}, //Цифра 4
  {1, 0, 1, 1, 0, 1, 1, 0}, //Цифра 5
  {1, 0, 1, 1, 1, 1, 1, 0}, //Цифра 6
  {1, 1, 1, 0, 0, 0, 0, 0}, //Цифра 7
  {1, 1, 1, 1, 1, 1, 1, 0}, //Цифра 8
  {1, 1, 1, 1, 0, 1, 1, 0}, //Цифра 9
  {0, 0, 0, 0, 0, 0, 1, 0}, //Знак -
  {0, 0, 0, 0, 0, 0, 0, 0}  //Пустой разряд
};
int err[4][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0}, //Пусто
  {1, 0, 0, 1, 1, 1, 1, 0}, //E
  {0, 0, 0, 0, 1, 0, 1, 0}, //r
   {0, 0, 0, 0, 1, 0, 1, 0} //r
};
float numbers[] = {}; // По очереди будем показывать числа - на 100000 на дисплее будет отображена ошибка Err
static int arr[4][8]; // Переменная-массив для хранения данных, которые не нужно каждый раз пересчитывать
int numindex = 0;
float value = 0.0;

void loop() {
  

 
if (radio.available() >= 0 ){
 
  val = radio.read();
   
   float numbers[] = {val}; 
  }     
  // Serial.println(val);
 unsigned long currentMillis = millis();
   
 if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
  getDigits(numbers[numindex]);
    numindex += 1;
 
    if (numindex >= sizeof(numbers)/sizeof(float)) numindex = 0;
  }
  displayMessage(arr);
}
void getDigits (float value) {
  Serial.println("");

  // Выдаем ошибку на те значения, которые не можем показать
  if ((value >= 10000) ||
      (value <= -1000) ||
      (value > -0.01 && value < 0.001)) {
    for (int i = 0; i < 4; i++) { // Каждый разряд по очереди
      for (int k = 0; k < 8; k++) {// Каждый сегмент по очереди - исходя из заданной карты
        arr[i][k] = err[i][k];
      }
    }
    return; // Выходим
  }
  int digits = 4; // У нас 4 разряда
  if (value < 0) digits = 3; // Из-за минуса один символ убирается*/
  // Делим число на 2 группы - отдельно целую часть и дробную.
  int intPart = (int)abs(value);
  int intLength = ((String)intPart).length(); // Смотрим, сколько разрядов занимает целая часть
  // На дробную часть у нас остается разрядов: digits-intLength
  int fracPart = (int)((abs(value) - abs(intPart)) * 10000); // Мы можем показать максимум 3 знака после запятой - 0,000
  int fracDigits = digits - intLength;
  fracPart = (((String)fracPart).substring(0, fracDigits)).toInt();
  // Собираем строку для отображения
  String output = (value < 0) ? "-" : "";
  output += (String)intPart;
  String outputFrac = ((digits - intLength <= 0) || (fracPart == 0)) ? "" : ((String)"." + ((String)fracPart).substring(0, digits - intLength));
  output += (String)outputFrac;
   // Дополняем символы спереди, если цифр слишком мало, например для "-1" делаем "  -1"
  String spaces = "     ";
  digits = 4;
  if (~output.indexOf(".")) digits += 1;
  if (output.length() < digits) output = spaces.substring(0, digits - output.length()) + output;
  // Формирум данные для показа:
  int dig = -1;
  for (int i = 0; i < output.length(); i++) {
    String _char = output.substring(i, i + 1);
    if (_char != ".") dig += 1; // Точка не занимает сегмент - увеличиваем на 1
    int actualdigit = 11; // По умолчанию пустой символ
    if ((_char == "-")) {
      actualdigit = 10;
    }
    else if (_char == " " || _char == ".") {
    }
    else {
      actualdigit = _char.toInt();
    }
    if (_char == ".") {
      arr[dig][7] = 1; // Если нужно - ставим точку
    }
    else  {
      for (int n = 0; n <= 7; n++) {
        arr[dig][n] = seg[actualdigit][n];
      }
    }
  }
}
void displayMessage(int dig[4][8]) {
  for (int i = 0; i < 4; i++) { // Каждый разряд по очереди
   for (int k = 0; k < 8; k++) {// Каждый сегмент по очереди - исходя из заданной карты
   digitalWrite(segmentsPins[k], ((dig[i][k] == 1) ? 1 : 0));
 }
digitalWrite(anodPins[i], 0);
delay(2);
digitalWrite(anodPins[i], 1);

  }
  }

 

mag155
Offline
Зарегистрирован: 21.12.2017

???

mag155
Offline
Зарегистрирован: 21.12.2017

Я с 

while serilal.available

Не совсем понял ??

mag155
Offline
Зарегистрирован: 21.12.2017

Э

serilal.available +++ типа так ?