Ви не увійшли.
Сторінки 1
Спасибо за ответ. Но можно было и в простой форме написать. Если бы я знал о существовании этой вещи, не спрашивал бы)
Доброго времени суток. Есть файл, содержащий строки в виде 0х0с 0ха5а5ffca. Файл весит примерно 98кБайт и записан на SD карточку. При чтении ардуина видит эти строки как набор символов. Как сделать, что бы она распознавала именно как числа в шеснадцатиричном виде? А выражение а5а5ffca разбивала на 4 отдельных числа : 0xa5, 0xa5, 0xff и 0xca?
Делаю своего рода загрузчик из ардуино и этот кодо надо потом по I2C отправлять в другой контроллер
PS. Было бы там 100-200 строк, я бы вручную поправил. Но там больше 10к строк.
Добрый день. Была такая задача, есть исходник, который надо доделывать. Идея потеряла актуальность и была оставлена
Всем привет, задумал я один проект: модернизировать свой древний усилитель. На нем куча регулировок, которые хочется сохранить да и панель мне нравится. По этому решил переделать это все на цыфру и в место вечно хрипящих переменников поставить энкодеры.
Как ядро буду использовать ардуино нано. А 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 энкодера.
Теперь суть вопроса: этот код надо преобразовать в библиотеку которую я смогу потом сам корректировать. Кто может с этим помочь?
Привет всем. С ардуино дружу давно, а вот с полноценным програмированием, как таковым, не сложилось. По этому решил спросить у знающих.
Есть один проект, в котором в Main работает ШИМ, а в фоне надо мерять частоту (в пределах1-2кГц). При том точно. Тут все понятно, мне прямая дорога к таймерам, которых в мега328 аж 3шт. Хватает с головой, первый оставляем как есть для analogWrite(), а на 2х других хочу собрать собственно частотомер. Идея следующая: один надо настроить на подсчет импульсов на пине, а вторым задавать интервал, в течении которого первый щитает импульсы.
Теперь сам вопрос: как для этих целей настроить оба таймера и будут ли они вообще так работать?
Другой вариант, как настроить следующее: в Main вызываем макрос в котором 2 преривания: первое устанавливает интервал счета; второе- щитает n++ по импульсу на ноге в течении этого интервала?
Пробовал игратся с TimerOne- он работает, а вот внешнее преривание в макросе не хочет запускатся.
Какой вариант будет более точен и практичен?
Сторінки 1