Подключил резистор через беременную вывожу значения все клас. Подключил библиотеку тензодатчика чтоб выводить вес индикатор вес выводит но цифры мерцают не успеваю разогрется. Может контроллер не успевает подсчитывает информацию с датчика усреднять ее и при этом сегменты зажигать ??
а по ТЗ надо проверять датчик каждый loop? конечно будет мерцать, и вообще по правилам хорошо тона на форуме, чтоб получить адекватный ответ, надо свой код выложить
Код выложу завтра. Он у меня на работе а я дома . Датчик осчитывается через lop . Я думаю если использовать две ардуино одну для индикатора вторую для датчика как считаете ?
Код выложу завтра. Он у меня на работе а я дома . Датчик осчитывается через lop . Я думаю если использовать две ардуино одну для индикатора вторую для датчика как считаете ?
я же выше задал вопрос: насколько часто надо опрашивать датчик?
не работает что? тут хрустальные шары запрещены :) как мне догадаться? и что вы поменяли? ну вот совсем лень искать разницу.
ЗЫ. Вот нафига брать мой скетч переделывать если ваш проект в принципе уже работает, надо просто немного мозг напряч и дописать, или вы думаете час посидели над задачей, не получилось, на форуме написал, подсказали, все хорошо, можно отдыхать :)
Полностью Согласен. На то он и программист, что строит свои алгоритмы, и подсмотрит у других. Коль взялся писать сам, mag155 , пусть и пишет. А то сопли тут развели. Есть последовательность действий, вот и пусть реализует.
Да фиг его знает мозги уже ..... К стати пробовал лсд дисплей подключать тоже Моргает. По ходу программа самого тензодатчика работает по принципу есть значение потом нет. Думаю нужно как то запоминать значение и если оно изменилось менять потом опять запоминать?
Да фиг его знает мозги уже ..... К стати пробовал лсд дисплей подключать тоже Моргает. По ходу программа самого тензодатчика работает по принципу есть значение потом нет. Думаю нужно как то запоминать значение и если оно изменилось менять потом опять запоминать?
Вам ведь уже сто раз говорили, используйте Сериал для отладки, а не думу думайте.((((
Сериал смотрел показания миняются с интервалом в пол секунду соответственно и индикатор моргает также. Такое впечатление что код просто замирает на пол секунды.
Всем привет!!! Вопрос машинка на блютуз с регулировкой скорости проблема в том что команды перебивают друг друга. Как можно разделять полученные данные по своим переменным ? Или как лучше это реализовать ?
Делаем условие: IF ( если пришло - > пишем в строку (один символ) -> плюсуем второй символ и т.д. Тут же if( если пришел символ закрытия "типа !" то плюсуем к строке и закрываем цикл) ) и так по кругу.
ДАЛЕЕ: если прилетевшее слово == "вперед", тогда переменная в перед - str i12asdf = ЗНАЧЕНИЕ
12asdf - это прямо? а значение 3 - тогда вид будет -> 12asdf /3!
или проше, прями - 123! если прилитело 123 - тогда 12asdf =1;Ну или как у Вас.
Не могу найти кода своего. на С++ найдите как собрать строку "работа со строками", а в конце, типа "!". что будет указывать , что новая переменная прилитела
Не так. Команда в перед с устройства, что управляет. Это просто команда. Можно дать и "1" - "9","0". 10 команд. Я же не знаю, какая команда и можите ли Вы ее назначить, указывает условие. По русски, команда в перед как "***" слово из мата.
Пусть при нажатии на кнопку "вперед", у вас по передается "1" и при постоянной передаче "1", алгоритм выставляет выходной пин = HI (логической 1) и так длится скажем 5с, если кнопка отпущена -> в порт дается "" - ничего, то таймер отсчитав 5с, сбросит последнее условие в =LO (логический 0)
Всем привет с блютузом разобрался разбиваем данные по ячейкам массива и потом работаем отдельно с каждой. Решил вернутся к теме дисплея . И пришла мне идея подключить ардуино в качестве контроллера 4 разрядного индикатора без здвигового регистра. И по rx передавать данные с другой ардуины ну или с того же блютуз. Как писал выше проблемка в том что сигменты мерцают и не горят стабильно если выводим данные на них с переменной . В выводе информации индикатор только пытаюсь разобратся так что прошу помощи?
а по ТЗ надо проверять датчик каждый loop? конечно будет мерцать, и вообще по правилам хорошо тона на форуме, чтоб получить адекватный ответ, надо свой код выложить
??? Не засну
Код выложу завтра. Он у меня на работе а я дома . Датчик осчитывается через lop . Я думаю если использовать две ардуино одну для индикатора вторую для датчика как считаете ?
я же выше задал вопрос: насколько часто надо опрашивать датчик?
Датчик опрашивается каждый цикл lop.
То есть он лайн измерение веса должно получатся.
онлайн понятие относительное есть секунда, есть минута, но несколько миллисекунд - это перебор :) не реактивный же самолет
Согласен. Предлагаете условия типа счетчик мерить через какое-то количество циклов ? Или через промежуток времени.?
я ничего не предлагаю, я спрашиваю - какое адекватное (реально нужное) минимальное время необходимо для опроса датчика?
Раз в пол секунды
Максимум раз в секунду
Вот такой код все работает но сегменты моргают ??? Не судите строго только учусь. 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); } }подсчет пауз в loop методом остатка от деления медленно и ненадежно - могут быть пропуски - переходите на миллис
digitalWrite в разы замедляет вывод в дисплей, переходите на прямой вывод в порт
http://codius.ru/articles/%D0%A2%D1%8E%D0%BD%D0%B8%D0%BD%D0%B3_Arduino_%...
Можно примерчик а то как- то мне пока сложновато ?
я же выкладывал в сообщении #169
а по таймерам millis примеров очень много
http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis#com...
Изменил ваш скетч под общий катод
#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 }Не работает
Не работает
бывает.......
не работает что? тут хрустальные шары запрещены :) как мне догадаться? и что вы поменяли? ну вот совсем лень искать разницу.
ЗЫ. Вот нафига брать мой скетч переделывать если ваш проект в принципе уже работает, надо просто немного мозг напряч и дописать, или вы думаете час посидели над задачей, не получилось, на форуме написал, подсказали, все хорошо, можно отдыхать :)
Вот нафига брать мой скетч
Полностью Согласен. На то он и программист, что строит свои алгоритмы, и подсмотрит у других. Коль взялся писать сам, mag155 , пусть и пишет. А то сопли тут развели. Есть последовательность действий, вот и пусть реализует.
Да фиг его знает мозги уже ..... К стати пробовал лсд дисплей подключать тоже Моргает. По ходу программа самого тензодатчика работает по принципу есть значение потом нет. Думаю нужно как то запоминать значение и если оно изменилось менять потом опять запоминать?
Вам ведь уже сто раз говорили, используйте Сериал для отладки, а не думу думайте.((((
Сериал смотрел показания миняются с интервалом в пол секунду соответственно и индикатор моргает также. Такое впечатление что код просто замирает на пол секунды.
#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(); }Всем привет!!! Вопрос машинка на блютуз с регулировкой скорости проблема в том что команды перебивают друг друга. Как можно разделять полученные данные по своим переменным ? Или как лучше это реализовать ?
блютуз - поочередная (последовательная) перередача даных. Сделайте свой протокол.
Принимаем данные и складываем в строку. Где в начале TEG, потом разделитель "/" или любой знак, данные, разделитель, указатель конца команды.
Я так себе делал управление по блютуз.
Ого а примерчик строки если не сложно ?
https://www.youtube.com/watch?v=Ci-5jLGZj3A Подсмотрел тут и немного допилил. Принцип как и СЕРИАЛ RS232 портом, только блютуз. А так все одинаково
Не пойму как записывать в масив
Есть переменная Через сериал приходят цыфры как их сложить в масив ? Напишите пример если не сложно ?
Делаем условие: IF ( если пришло - > пишем в строку (один символ) -> плюсуем второй символ и т.д. Тут же if( если пришел символ закрытия "типа !" то плюсуем к строке и закрываем цикл) ) и так по кругу.
ДАЛЕЕ: если прилетевшее слово == "вперед", тогда переменная в перед - str i12asdf = ЗНАЧЕНИЕ
12asdf - это прямо? а значение 3 - тогда вид будет -> 12asdf /3!
или проше, прями - 123! если прилитело 123 - тогда 12asdf =1;Ну или как у Вас.
Не могу найти кода своего. на С++ найдите как собрать строку "работа со строками", а в конце, типа "!". что будет указывать , что новая переменная прилитела
Если 123 к примеру вперед то когда Шим будет равен 123 она ж поедет вперед?
Не так. Команда в перед с устройства, что управляет. Это просто команда. Можно дать и "1" - "9","0". 10 команд. Я же не знаю, какая команда и можите ли Вы ее назначить, указывает условие. По русски, команда в перед как "***" слово из мата.
Пусть при нажатии на кнопку "вперед", у вас по передается "1" и при постоянной передаче "1", алгоритм выставляет выходной пин = HI (логической 1) и так длится скажем 5с, если кнопка отпущена -> в порт дается "" - ничего, то таймер отсчитав 5с, сбросит последнее условие в =LO (логический 0)
Тему поменяйте, тут динамическую индикацию.
Всем привет с блютузом разобрался разбиваем данные по ячейкам массива и потом работаем отдельно с каждой. Решил вернутся к теме дисплея . И пришла мне идея подключить ардуино в качестве контроллера 4 разрядного индикатора без здвигового регистра. И по rx передавать данные с другой ардуины ну или с того же блютуз. Как писал выше проблемка в том что сигменты мерцают и не горят стабильно если выводим данные на них с переменной . В выводе информации индикатор только пытаюсь разобратся так что прошу помощи?
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); } }строка 37 вывод на индикатор
такое ощущение что вы так и не прочитали статью
http://arduino.ru/forum/proekty/vyvod-informatsii-na-4-razryadnyi-7segme...
ну и выше уже писал и ссылки давал как делать периодически запускаемый код через millis
прочитаете - реализуете и будет вам счастье
если уж совсем ленитесь, вот я вам скопировал кусок кода с комментарием из ссылки которая выше
Иначе говоря правильно будет так
01unsignedlongcurrentMillis = 1UL;02unsignedlongpreviousMillis = 1UL;0304voidsetup() {0506}0708voidloop() {09currentMillis = millis();1011if( currentMillis - previousMillis >= 500UL ){12previousMillis = currentMillis;1314//этот код повторяться каждые 500 мсек1516}171819}Что просто миллис в место делей? И все ? Нет я знаю как работает миллис просто видать не правильно вас понял. Благодарю за подсказку сделаю напишу.
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); } } }Зделал вот так моргают все сигменты сразу даже если задаю цифру 1 ??? Моргает все сигменты цифрой один получается что счетчик не работает почему ???
не.... вы совсем не то делаете :(
и имел в виду исправить в цикле loop запуск каждые 200 мсек ваши на миллисс и проверку датчиков сделать каждую секунду
процедуру отображения пока не трогайте
Ок буду пробовать.
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) в чем может быть причина ?
Вот так работает но значение в сериал выводит с пробелом вот так
125
125
125
Если через сериал подаю значение с другой ардуины работает четко . Вопрос как все таки избавится от delay в 116 строке?
Если через сериал подаю значение с другой ардуины работает четко . Вопрос как все таки избавится от delay в 116 строке?
а где весь код? val где берется?
если смотреть по коду из 233 сообщения,
то торможение в loop цикле еще в строках 37...41, их надо завернуть в условие if serial.available while serilal.available
а то получается есть байт или нет он все равно в монитор порта печатается каждые несколько миллисекунд
и получается при скорости порта 9600 это сильно тормозит
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); } }???
Я с
Не совсем понял ??
Э