Как ускорить ардуину при питании 3.3 вольта напрямую к ноге ардуины ???

alexey3
Offline
Зарегистрирован: 25.11.2017

В общем есть скетчь весов но работает он с задержкой в 5 - 10 секунд а ето очень долго

#include <HX711.h>
HX711 scale(A0, A1);                      // Указываем в какие пины подключен АЦП hx711 (DT(DOUT)  - pin A1, SCK - pin A0)
int latchPin = 8;                         //Пин 8 пиодключен к ST_CP вход 74HC595
int clockPin = 12;                        //Пин 12 подключен к SH_CP входу 74HC595
int dataPin = 11;                         //Пин 2 подключен к DS входу 74HC595
int ves = 0;
int button = 4;
float myScale;                            // Инициализируем переменную в которой будем хранить текущий вес
              
//Задаем индекс                 
 
int a; //Переменные регистров
int b;
int c;
int d;
int i;


void setup() {
       // Выводим надпись

  scale.set_scale(2850);                  // Устанавливаем калибровочный коэффициент 
  scale.tare();                           // Сбрасываем весы на 0
  myScale = round(scale.get_units(10));   // Запоминаем среднее значение без груза, но с учетом тары 
 
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);               // Обнуляем значение веса на мониторе порта
  pinMode(button, INPUT_PULLUP);
}
//Это закодированные цифры в 8 битах, которые пришлось подбирать методом перебора  
byte cifra[]={0b00000101, 0b11001111, 0b00100110, 0b10000110, 0b11001100,
              0b10010100, 0b00010100, 0b11000111, 0b00000100, 0b10000100, 0b11111111,
              0b01110100, 0b00001101, 0b00111101};
//int number_cifra=0;

 
//Устанавливаем пины на вывод данных в 74HC595 

 void loop()
{

//  scale.power_up();                                 // Отключаем энергосберегающий режим hx711
  if (round(scale.get_units(10)) != myScale) {      // Условие выполняется, если округленный до граммов вес отличается от последнего
    myScale = scale.get_units(20);                  // Запоминаем текущий вес
//    if (myScale > 0.5)                              // Если вес не ничтожно мал
//      Serial.println(myScale);                      // то выводим его
//    else                                            // иначе
//      Serial.println(0.00);                         // выводим нули
    myScale = round(myScale);                       // Запоминаем округленный текущий вес (для сравнения)
  }
//  scale.power_down();                               // Включаем энергосберегающий режим hx711
//  delay(50);

int i = (int)(myScale + 0.5);
if (i < 0) {i = -i;}
int a = (i/1000);//округляем до тысячь
//if (a < 0) {a * a;}
int b = (i%1000)/100;//округляем до сотен
//if (b < 0) {b * b;}
int c = (i%100)/10;//округляем до десятков
//if (c < 0) {c * c;}
int d = (i%10);//округляем до едениц
//if (d < 0) {d * c;}

  if ((digitalRead(4)) == 0)
    {
     scale.tare();
    } 

if (i > 1000) 
  {
  a = 11;
  b = 12;
  c = 13;
  d = 13;
  }
  
    digitalWrite(latchPin, HIGH); // открываем на "защелку" 74HC595
    shiftOut(dataPin, clockPin, MSBFIRST, cifra[d]); // передаем байт в 74HC595---0
    shiftOut(dataPin, clockPin, MSBFIRST, cifra[c]); // передаем байт в 74HC595---1
    shiftOut(dataPin, clockPin, MSBFIRST, cifra[b]); // передаем байт в 74HC595---2
    shiftOut(dataPin, clockPin, MSBFIRST, cifra[a]); // передаем байт в 74HC595---потушен
    shiftOut(dataPin, clockPin, MSBFIRST, cifra[10]); ///                       ---4
    digitalWrite(latchPin, LOW);

}


 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Измерение веса - процедура длительная. 

Значит, не следует ее делать лишний раз. А у Вас в строках 44 и 45 она повторяется. Измерьте один раз и результат измерения используйте как в строке 44, так и в строке 45, длительность цикла уменьшится втрое.

Если этого недостаточно, остается только увеличивать скорость измерения за счет снижения точности, т.е. уменьшении количества итераций на одно измерение.

b707
Offline
Зарегистрирован: 26.05.2017

alexey3 - Во-первых, как уже сказал andriano, у вас в скетче куча лишних действий. Например, после scale.tare();в строке 23 нет смысла считывать вес в строке 24 - он должен быть равен нулю, если весы оттарировались.

Во-вторых, вот вы дважды считываете вес - в строках 44 и 45. Вы в курсе, что означает цифра 20 в параметрах scale.get_units(20); ? - это вы делаете измерение ДВАДЦАТЬ раз! - оно вам надо? Каждое измерение занимает около 100мс - так что в одной этой строке вы теряете 2 секунды.

Кроме того, хочу отметить, что библиотека HX711 - довольно глючная (см ссылку глюки hx711h) и явно не для real-time скетчей.  Взвешивание занимает приличное время- и что еще хуже - этот процесс блокирующий, то есть ваш скетч в эти моменты ничего другого делать не может. Если для вас это критично - советую отказаться от библиотеки и работать с весами напрямую. Мне для моего проекта пришлось писать свою версию либы HX711

alexey3
Offline
Зарегистрирован: 25.11.2017

А не могли бы вы поделится собственной библиотекой или обьяснить что и как исправить, 20 заменил на 1 как вы сказали ускорилось. Но очень хочется ещё ускорить