Ви не увійшли.
Датчики ніяк ініціалізувати не потрібно. А ви все точно скопіювали зі старої: і схему, і прошивку, і EEPROM? (раптом ідентифікатори датчиків в EEPROM зберігались)
В avr-gcc можна об'явити глобальну змінну:
register uint8_t myregvar asm("r16");
вона гарантовано буде в r16, але код на C не буде з нею працювати оптимально.
На asm (або вставками на asm) з нею можна працювати як завгодно оптимально і одночасно мати доступ з C, це зручно, коли частина проекту на asm, а частина на C.
upd:
якщо потрібна двобайтова змінна, то:
register uint16_t myregvar asm("r16");
в коді на asm r16 буде молодшим, r17 - старшим
Забув пояснити: w1-uart реалізований через serdev.
Доречі, вам не вдавалось піднімати w1-uart на x86? У мене з наскоку не вийшло, схоже, потрібно патчити таблицю ACPI. Поки що не розібрався, як це правильно зробити.
В мене колись також з наскоку не вийшло розібратися як приєднати serdev до пристрою без використання DT, так щоб з командного рядка за бажанням, тому забив на нього і написав драйвер через ldisc. Через ldisc у драйвера нажаль відсутня можливість керувати baudrate, так би я до пари написав би і w1-uart )) , бо добре розібрався з нутрощами W1.
Драйвер для CH341A я тільки підтримую, щоб компілювався для сучасних ядер.
А що там не так з ch341, що він працює максимум на 250000 BAUD, а далі таке враження, що в нього там буфер на читання лише 32 байти? Пробував ось цей, 500000 BAUD тягне.
Тільки для SPI-дисплеїв все одно доведеться задіяти GPIO, бо як мінімум ще DATA/COMM треба смикати.
Якщо хочеться ще GPIO, наприклад, для RST, то треба поправити таблицю в коді та перезібрати драйвер. Все руки не дійдуть реалізувати цю конфігурацію у вигляді параметра.
Подивіться ось тут ідею, як використовуючи другий CS керувати DATA/COMM та отримати додаткові бонуси від двох SPI.
Може і необхідність правити відпаде)
Honey пише:А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам
Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.
Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;
А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам:
if (millis() - TimeStart > RoadTime * 1024) {
digitalWrite(outMotorOil, HIGH);
...if (millis() - TimeStart > RainTime * 1024) {
digitalWrite(outMotorOil, HIGH);
...та
if (TriMin < 7000) {
...
} else {
digitalWrite(outMotorOil, LOW);
...Якщо ще розбираєтесь, звідки вилазить ШИМ, то це результат конкуренції кількох незалежних "мигалок":
// Мигаем с частотой 2 и более Гц
if ((timeAfterStartVeryLong % 500) < 250)
digitalWrite(LEDMode, HIGH);
else
digitalWrite(LEDMode, LOW); // Мигаем с частотой 1 Гц пока не отпустят кнопку
if ((timeAfterStartVeryLong % 1000) < 500)
digitalWrite(LEDMode, HIGH);
else
digitalWrite(LEDMode, LOW); // мигаем светодиодом с частотой 3 Гц
if ((TriMin % 500) < 250)
digitalWrite(LEDMode, HIGH);
else
digitalWrite(LEDMode, LOW);і є ще одна в DisplayOilMode()
Спробуйте без sscanf, якось так:
#include <stdio.h>
#define TOKEN_COUNT 11
#define TOKEN_SIZE 88
char token[TOKEN_COUNT][TOKEN_SIZE];
void process() {
int i;
for (i = 0; i < TOKEN_COUNT; i++)
printf("token[%i]='%s'\n", i, token[i]);
}
int main() {
int i = 0, j = 0;
for (;;) {
char c = getchar();
if (c == EOF) {
break;
} else if (c == '\n') {
while (i < TOKEN_COUNT) {
token[i++][j] = 0;
j = 0;
}
i = 0;
process();
} else if (c == ',') {
if (i < TOKEN_COUNT)
token[i++][j] = 0;
j = 0;
} else {
if (i < TOKEN_COUNT && j < TOKEN_SIZE - 1)
token[i][j++] = c;
}
}
}Спробуйте зробити за допомогою avrdude з командного рядка по цій інструкції https://forum.arduino.ua/viewtopic.php?id=2904
Також подивіться, що за ArduinoISP.ino ви компілюєте, його потрібно брати з arduino-examples, бо в інеті валяється купа його непрацюючих модифікацій.
float floatval = 26.4212;
int intval = floatval * 100 + 0.5;
Send_ar[6] = intval >> 8;
Send_ar[7] = intval & 0xff;
Доброго всем здоровья!
Просветите пожалуйста строчка в коде что означает 4000000.0F#define resistorValue 4000000.0F // change this to whatever resistor value you are using
F - суфікс для константи типу float
https://en.wikipedia.org/wiki/C_data_types
Основною фішкою рінгбуфера (якщо не псувати "оптимізаціями" стандартну реалізацію) є можливість виконувати запис і читання в двох окремих потоках без будь-яких синхронізацій між ними.
Зробіь масив int random_index[16]; спочатку заповніть його числами від 0 до 15, а потім їх перетасуйте (google: shuffle), з масиву послідовно берете індекс і заповнюєте цей стовпчик
Вилазите за межі масива
i=4 замінити на i=3
i<=4 замінити на i<4
Как не крути переменный резистор, на выходе всегда 11.2.
У Вас входи підсилювача закорочені між собою.
І був ще такий just for fun проект з USB інтерфейсом: https://forum.arduino.ua/viewtopic.php?pid=35748
З езернет інтерфейсом https://github.com/honechko/snmpvm
Ще поки руки не дійшли замовити в китаї платки та оформити в пристойному вигляді
Вставив картинкою бо форумний двіжок зʼїдає бекслеші в тексті
Ставте два бекслеша підряд. При використанні "попередній перегляд" один бекслеш зникає в вікні вводу тексту, тому доводиться ще раз розставляти дублі.
Оффтоп: може кому пригодиться така ідея конвертера логічних рівнів для ESP-01 на основі цієї платки, використовував її при розробці прошивки, також можна використати для отримання 5-вольтового 1-wire.


Зарезервований коментар, якщо тема розростеться, щоб робити тут посилання по темі.
Для тих, хто працює з 1-wire під Linux, доступні два способи роботи з адаптером (майстром шини 1-wire): з простору користувача (найпопулярнішим ПЗ є OWFS) і через драйвер в ядрі. В OWFS реалізована робота майже з усіма існуючими адаптерами, а от в ядрі не густо, є драйвери GPIO-адаптера (w1-gpio), USB-адаптера (ds2490), I2C-адаптера (ds2482), але чомусь не було UART-адаптера (ds2480b).
Коли я вибирав, на якій мікросхемі зробити готовий пристрій, то, незважаючи на це, вибрав UART-інтерфейс, оскільки для моїх задач була необхідна гальванічна розв'язка і зробити її значно простіше на однонаправлених лініях, а з драйвером вирішив "розібратися" пізніше. Є ще й друга причина вибору саме послідовного інтерфейсу, але про це згодом.
Отже, Linux-драйвер для ось такого готового майстра шини 1-wire на мікросхемі ds2480b вже є і його можна взяти звідси. В цій темі намагатимусь допомагати з компіляцією драйвера.
Якщо адаптер підключено до комп'ютера з Linux через USB-UART або до пінів Raspberry Pi ось так:

Тоді "приєднати" драйвер до відповідного послідовного порта (/dev/ttyUSB0 або /dev/ttyAMA0) можна командою:
ser1wm_attach /dev/ttyUSB0
Виконувати цю команду можна доручити udevd, щоб він її виконував щоразу, коли до USB підключається USB-UART, до якого підключено майстер шини 1-wire. Наприклад так:
ACTION=="add", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb",\
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A50285BI",\
RUN+="/usr/local/bin/ser1wm_attach /dev/%k"В Linux є така утиліта socat, за допомогою якої послідовний порт по TCP можна "передати" на інший хост:
1) на боці реального послідовного порта піднімаєм сервер на TCP-порту:
socat tcp-l:4232,bind=10.0.0.4,reuseaddr /dev/ttyUSB0,raw,echo=0,b9600,cs8
2) на іншому боці підключаємось і утворюєм віртуальний послідовний порт:
socat tcp:10.0.0.4:4232 pty,raw,echo=0,link=/dev/ttyvirt0
До такого віртуального послідовного порта також можна приєднати даний драйвер:
ser1wm_attach /dev/ttyvirt0
Але в ser1wm_attach реалізована можливість робити це напряму без другої команди socat (її функціонал вбудовано), ось так:
ser1wm_attach 10.0.0.4:4232
Кмітливі вже здогадалися, що і першу команду socat також можна в щось вбудувати, наприклад реалізувати її на мікроконтролері з мережевим інтейфейсом, до якого підключено майстер шини 1-wire (або навіть і майстер шини реалізувати програмно). Це і є та друга причина, по якій вибрано послідовний інтерфейс, оскільки його без будь-яких алгоритмів і overhead можна передавати по TCP.
В якості proof-of-concept викладаю прошивку, яка перетворить ESP-01 на майстер шини 1-wire (на піні RX), а по TCP дозволяє приєднати даний драйвер за допомогою останньої наведеної команди ser1wm_attach.

Для переведення прошивки в режим конфігурування потрібно при подачі живлення закоротити між собою (але не на землю) піни IO0 та IO2. В режимі конфігурування (на це вказує блимання світлодіодом) підключитися до точки доступу ser1wm_setup, зайти браузером на http://192.168.1.1/ і виконати налаштування.
В планах є також реалізація "Ethernet to 1-wire", тому драйвер назвав не ds2480b а більш загально - ser1wm (скорочення від serial 1-wire master).
Добре, "приєднали" драйвер до послідовного порта чи ESP, а що далі?
В dmesg маємо побачити щось подібне:
serio: Serial port pts9
ser1wm serio3: attaching 1-wire bus master
w1_master_driver w1_bus_master1: Attaching one wire slave 28.0000023ccaeb crc 45Ядро саме буде періодично (раз на 10 сек) опитувати шину 1-wire і писати в dmesg про знайдені слейви. Кожен слейв, поки він присутній на шині, буде мати свій каталог в /sys/bus/w1/devices в якому будуть файли для роботи з слейвом, які саме файли - залежить від сімейства слейва. Наприклад, для DS18B20:
cat /sys/bus/w1/devices/28-0000023ccaeb/w1_slave
78 01 1e 00 7f ff 08 10 e1 : crc=e1 YES
78 01 1e 00 7f ff 08 10 e1 t=23500
Можу зробити те, що ви хочете, на m8a або m328p, звертайтесь в пошту.
датчик з газ.лічильника - геркон
Можна використати SS49E (аналоговий датчик Холла), але він потребує налаштування threshold-ів, це робиться записом в пам'ять лічильника і я для цієї процедури написав веб-інтерфейс (інструкція), що вже вимагає щоб лічильник був підключений до лінукса на якому має бути запущений owhttpd. Тут один користувач викладав урізану лише для ds2423 "емуляцію" owhttpd на мікроконтролері.