#1 Re: Програмування Arduino » Нужна помощь с конвертацией данных » 2020-02-05 15:32:09

Спасибо за ответ. Но можно было и в простой форме написать. Если бы я знал о существовании этой вещи, не спрашивал бы)

#2 Програмування Arduino » Нужна помощь с конвертацией данных » 2020-02-05 01:21:42

Rosental
відповідей: 2

Доброго времени суток. Есть файл, содержащий строки в виде 0х0с 0ха5а5ffca. Файл весит примерно 98кБайт и записан на SD карточку. При чтении ардуина видит эти строки как набор символов. Как сделать, что бы она распознавала именно как числа в шеснадцатиричном виде? А выражение а5а5ffca разбивала на 4 отдельных числа : 0xa5, 0xa5, 0xff и 0xca?

Делаю своего рода загрузчик из ардуино и этот кодо надо потом по I2C отправлять в другой контроллер
PS. Было бы там 100-200 строк, я бы вручную поправил. Но там больше 10к строк.

#3 Re: Програмування Arduino » PCF8574/PCF8575 та багато енкодерів » 2019-10-30 12:03:16

Добрый день. Была такая задача, есть исходник, который надо доделывать. Идея потеряла актуальность и была оставлена

#4 Програмування Arduino » Помогите с библиотекой » 2018-12-09 14:03:36

Rosental
відповідей: 1

Всем привет, задумал я один проект: модернизировать свой древний усилитель. На нем куча регулировок, которые хочется сохранить да и панель мне нравится. По этому решил переделать это все на цыфру и в место вечно хрипящих переменников поставить энкодеры.
Как ядро буду использовать ардуино нано. А 4 энкодера хочу подключить по шине I2C.

#include <Wire.h>

byte But1;
byte But2;
boolean x;
boolean n;
byte c;
byte c0;
byte c1;
byte c_old;
byte c_old0;
byte c_old1;
int Count0;
int Count1;

void setup() {
  Wire.begin(27);
  Wire.requestFrom(0x27, 1);              // чтение из адаптера
  if (Wire.available())                        //
    c_old = Wire.read();                     //
  c_old0 = c_old << 4;
  c_old1 = c_old >> 5;
  Serial.begin(9600);                         // отладка по уарт
  Serial.println("START OK");              //
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode (2, INPUT_PULLUP);
  attachInterrupt(0, Read, CHANGE);
}
void loop() {
  if (x == 1) {                                   //условие прерывания
    Wire.requestFrom(0x27, 1);             // чтение из адаптера в переменную
    if (Wire.available())                        //
      c = Wire.read();                          //
    //
    c0 = c;                                         // разбиваем для считывания 2х енкодеров
    c1 = c;                                         //
    c0 = c0 << 4;                               //сдвиг переменной для получения кода первого энкодера
    c1 = c1 >> 4;                               //сдвиг переменной для получения кода второго энкодера
    //Serial.println(c1);


    if (bitRead(c0, 6) == 0) {                //считывание кнопки первого энкодера
      But1++;
      if (But1 >= 4) {
        But1 = 0;
      }
      Serial.print("But1=");                    //ОТЛАДКА
      Serial.println(But1);                      //
    }


    if (bitRead(c1, 3) == 0) {                 //считывание кнопки второго энкодера
      But2++;
      if (But2 >= 4) {
        But2 = 0;
      }
      //Serial.println(c1, BIN);
      Serial.print("But2=");                    //ОТЛАДКА
      Serial.println(But2);                      //
    }

    if (c1 == 11 & c_old1 == 9) {          // счет значения щелчков энкодера
      Count1++;
    }

    if (c1 == 13 & c_old1 == 15) {
      Count1++;
    }

    if (c1 == 15 & c_old1 == 13) {
      Count1--;
    }

    if (c1 == 9 & c_old1 == 11) {
      Count1--;
    }

    if (c0 == 64 & c_old0 == 96) {         // счет значения щелчков энкодера
      Count0++;
    }

    if (c0 == 112 & c_old0 == 80) {
      Count0++;
    }

    if (c0 == 80 & c_old0 == 112) {
      Count0--;
    }

    if (c0 == 96 & c_old0 == 64) {
      Count0--;
    }
    if (n == 1) {
      Serial.print("Count1=");//ОТЛАДКА
      Serial.println(Count1);//
      Serial.print("Count0=");//ОТЛАДКА
      Serial.println(Count0);//
    }
    //Serial.println(c1);
    //Serial.println(c0);
    n = !n;
    c_old0 = c0;
    c_old1 = c1;
  }
  digitalWrite(5, x);

}

void Read() {                                     // обработчик прерывания для счета энкодеров
  x = !x;

}

Для тестов использовал плату расширения от ЛСД экрана, чистой платы на PCF8574 к сожалению не нашел.
Суть в следующем, при изменении в порту расширителя, он генерирует прерывание по которому ардуино считывает маску порта, разбивает на два и вычисляет какой из энкодеров и что сделал: или поворот, или нажатие кнопки. Остаются еще несколько пинов, которые хочу задействовать для каскадирования прерывания. В иоге можно будет на 3 провода навесить до 254 энкодера.

Теперь суть вопроса: этот код надо преобразовать в библиотеку которую я смогу потом сам корректировать. Кто может с этим помочь?

#5 Програмування Arduino » Преривания » 2018-03-28 23:50:07

Rosental
відповідей: 2

Привет всем. С ардуино дружу давно, а вот с полноценным програмированием, как таковым, не сложилось. По этому решил спросить у знающих.

Есть один проект, в котором в Main работает ШИМ, а в фоне надо мерять частоту (в пределах1-2кГц). При том точно. Тут все понятно, мне прямая дорога к таймерам, которых в мега328 аж 3шт. Хватает с головой, первый оставляем как есть для analogWrite(),  а на 2х других хочу собрать собственно частотомер.  Идея следующая: один надо настроить на подсчет импульсов на пине, а вторым задавать интервал, в течении которого первый щитает импульсы.

Теперь сам вопрос: как для этих целей настроить оба таймера и будут ли они вообще так работать?

Другой вариант, как настроить следующее: в Main вызываем макрос в котором 2 преривания: первое устанавливает интервал счета; второе- щитает n++  по импульсу на ноге в течении этого интервала?
Пробовал игратся с TimerOne- он работает, а вот внешнее преривание в макросе не хочет запускатся.

Какой вариант будет более точен и практичен?

Підвал форуму