ГДЕ Я просил что то сделать за МЕНЯ? АУУУ ![]()
Боже, здесь есть адекватные люди?
цитирую:
Либо вы с ним не сильно общались и не в теме, либо я не знаю, что. Ок, тему можно закрывать.
И? Где здесь написано сделать за меня? Дать совет? варианты? простую реализацию? Тысяча ответов не предполагает СДЕЛАТЬ ЗА МЕНЯ.
Любители чесать языком никогда не переведутся.
Задача требует значительно жертво-часов?
А, ну сами справитесь за вечерок, получается.
В таком случае непонятно зачем писать сотни слов в постах.
Привет! Если я правильно понимаю задачу, тебе нужно, чтобы количество импульсов на входе Arduino управляло состояниями 8 аналоговых выходов, которые будут включаться или выключаться в зависимости от количества этих импульсов. В качестве примера ты предоставил таблицу с логикой для выбора нужного файла в зависимости от состояния входов, и я предложу логику для Arduino на основе этого.
Логика для Arduino:
- Подсчет импульсов: Настроить Arduino для отслеживания количества импульсов за определенный период времени (например, через прерывания или цикл). Важно учесть, что импульсы идут с паузой в 5 мс, что позволит надежно их подсчитать.
- Привязка импульсов к выходам:
- Если пришел 1 импульс, включается первый выход (например,
digitalWrite(pin1, LOW)). - Если пришло 2 импульса, включаются первый и второй выходы (
digitalWrite(pin1, LOW); digitalWrite(pin2, LOW)), и так далее. - Если пришло 8 импульсов, включаются все 8 выходов.
- Иная комбинация: Если приходит нечетное количество импульсов, или комбинации от 1 до 8, соответствующие выводы переходят в LOW согласно таблице (см. скриншот). Каждый выход привязан к конкретному количеству импульсов.
Примерный код для Arduino:
cpp
Копировать код
const int outputPins[8] = {2, 3, 4, 5, 6, 7, 8, 9}; // Выводы Arduino для управления
volatile int pulseCount = 0;
unsigned long lastPulseTime = 0;
const int pulseThreshold = 10; // Определяем минимальный промежуток между импульсами в мс
void setup() {
for (int i = 0; i < 8; i++) {
pinMode(outputPins[i], OUTPUT);
digitalWrite(outputPins[i], HIGH); // Все выходы в HIGH (выключены)
}
attachInterrupt(digitalPinToInterrupt(2), countPulse, FALLING); // Подключаем прерывание на импульсах
}
void loop() {
if (millis() - lastPulseTime > pulseThreshold) {
applyOutputLogic(pulseCount); // Применяем логику, когда импульсы закончились
pulseCount = 0; // Сброс счетчика для нового цикла
}
}
void countPulse() {
pulseCount++;
lastPulseTime = millis();
}
void applyOutputLogic(int count) {
for (int i = 0; i < 8; i++) {
if (count > i) {
digitalWrite(outputPins[i], LOW); // Включаем соответствующий выход
} else {
digitalWrite(outputPins[i], HIGH); // Отключаем выходы
}
}
}
Ключевые моменты:
- Прерывания: Мы отслеживаем каждый импульс с помощью прерываний, чтобы точно считать количество импульсов.
- Таймаут: После получения импульсов ждем определенный интервал (например, 10 мс), чтобы считать, что больше импульсов не будет.
- Комбинации выходов: В зависимости от количества импульсов управляем выходами.
Это должно решать задачу управления выводами на основе количества импульсов. Если есть уточнения по требованиям или нужна другая логика, дай знать!
Самое тупое, но рабочее решение (1 секунда) ![]()
В таком случае непонятно зачем писать сотни слов в постах.
Мне непонятно зачем вообще чесать языком, вроде моих тем. Неинтересно, хмырь, неприятно, не готов платить мне много денег, пройду-ка я мимо, но нет)
Тысяча ответов не предполагает СДЕЛАТЬ ЗА МЕНЯ.
Вы всерьез думаете, что Вы здесь такой первый?
Тут каждую неделю появляются халявщики, неправомерно называющие себя новичками, и просят о помощи.
А когда пытаешься выяснить, как именно они представляют себе эту помощь, неизбежно оказывается, что под “помощью” они неизменно подразумевают “сделайте за меня”, - слова каждый раз разные, но смысл всегда один и тот же.
Еще раз, я ни РАЗУ не просил СДЕЛАТЬ ЗА МЕНЯ. Предложить, посоветовать, помочь - это разные по значению слова
Уточняющий промт и одна секунда на ответ. Вечерок посидеть…
Понял, тебе нужно на основе количества импульсов выбирать конкретный трек на голосовом модуле (например, трек 138 при 138 импульсах). Это соответствует управлению комбинацией выходов Arduino, которые подключены к входам модуля. Давай напишем код, который на основе таблицы установит нужные сигналы на выходах Arduino для выбора трека.
Как это будет работать:
- Считаем импульсы: Arduino будет считать количество импульсов от сигнализации.
- Переводим количество импульсов в двоичную систему: Поскольку модуль использует 8 входов (IO7 - IO0), мы должны перевести число импульсов в 8-битное двоичное число, чтобы активировать соответствующие выводы.
- Устанавливаем выходы Arduino: Для каждого выхода Arduino устанавливаем HIGH или LOW в зависимости от двоичного представления количества импульсов.
- Запускаем трек: Как только количество импульсов подсчитано, Arduino устанавливает выходы, и голосовой модуль начинает воспроизводить соответствующий файл.
Пример кода для Arduino:
cpp
Копировать код
const int outputPins[8] = {2, 3, 4, 5, 6, 7, 8, 9}; // Выходы Arduino для голосового модуля
volatile int pulseCount = 0;
unsigned long lastPulseTime = 0;
const int pulseTimeout = 50; // Время ожидания после последнего импульса для фиксации результата
void setup() {
for (int i = 0; i < 8; i++) {
pinMode(outputPins[i], OUTPUT);
digitalWrite(outputPins[i], HIGH); // Выходы в HIGH, что соответствует неактивному состоянию
}
attachInterrupt(digitalPinToInterrupt(2), countPulse, FALLING); // Прерывание на импульсы от сигнализации
}
void loop() {
// Проверяем, завершился ли поток импульсов
if (millis() - lastPulseTime > pulseTimeout && pulseCount > 0) {
playTrack(pulseCount); // Применяем логику на основе количества импульсов
pulseCount = 0; // Сбрасываем счетчик для нового сеанса импульсов
}
}
void countPulse() {
pulseCount++; // Считаем импульсы
lastPulseTime = millis(); // Обновляем время последнего импульса
}
void playTrack(int trackNumber) {
// Ограничиваем количество треков до 255 (так как большее количество не поддерживается)
if (trackNumber > 255) {
trackNumber = 255;
}
// Преобразуем число импульсов в 8-битное двоичное число
for (int i = 0; i < 8; i++) {
int bit = (trackNumber >> i) & 0x01; // Извлекаем i-й бит числа
if (bit == 1) {
digitalWrite(outputPins[i], LOW); // Активируем вывод, если бит = 1
} else {
digitalWrite(outputPins[i], HIGH); // Выключаем вывод, если бит = 0
}
}
}
Объяснение:
- Прерывания для подсчета импульсов: Каждый импульс вызывает прерывание и увеличивает счетчик
pulseCount. - Фиксация количества импульсов: Если после последнего импульса прошло 50 мс, считается, что импульсы закончились, и запускается трек.
- Преобразование количества импульсов в двоичный код: Мы используем побитовый сдвиг для получения двоичных значений (0 или 1) и устанавливаем соответствующие выводы Arduino в состояние
LOWилиHIGH. - Граничное условие: Если количество импульсов больше 255, мы его ограничиваем, так как голосовой модуль поддерживает только 255 треков.
Этот код позволит управлять воспроизведением треков на голосовом модуле на основе количества импульсов от сигнализации.
Бездельники, млять. Можете забанить меня за грубость, но уже совсем потеряли способность к человеческому адекватному общению. Да, это эмоции. Ибо не на первом форуме встречаю подобное отношение, и как правило - все это идет от закостеневших завсегдатаев.
Там аккумулятор или крона?
Переводим количество импульсов в двоичную систему:
Это не нужно. В результате подсчета (на первом этапе) в переменной уже окажется двоичное число.
Для каждого выхода Arduino устанавливаем HIGH или LOW в зависимости
Выводы Ардуино изначально объединены в порты. Достаточно сразу записать полученное двоично число в порт.
Выводы Ардуино изначально объединены в порты. Достаточно сразу записать полученное двоично число в порт
А если эти самые выводы, расбросаны по разным портам?
Опять неправильно помогли, короче.
Я закинул лишь ему эту картинку, на основе ее он выдал оба варианта
Мой промт для второго ответа
Да, это голосовой модуль, который может содержать 255 звуковых файлов, он имеет 8 IO, которые я планирую припаять к 8 out ардуино. Было бы отлично написать код таким образом (согласно) таблице, чтобы я простым количеством импульсов от сигнализации мог включить нужный трек например под номером 138. (138 импульсов)
Питание модуля и дуины скомутирую от еще одного допа (который сниму с одной другой не сильно нужной функции), активация питания будет происходить только при необходимости звука. Так насовсем решается вопрос с потреблением.
Было бы отлично написать код таким образом (согласно) таблице…
я правильно понимаю, что под “помощью форума” вы полагали точно такое же “общение” - вы ставите задачи - мы быстренько накидываем код, верно?
И да, вы же ничего не просите сделать за вас…
А если эти самые выводы, расбросаны по разным портам?
Это называется ошибка проектирования.
Кто “разбросал”? Пусть перепроектирует.
вы ставите задачи - мы быстренько накидываем код, верно
То, что непонятно - спрашиваем. Это непременное условие обычно.
Прямой вопрос - вы сейчас что делаете в этой теме? Одно радует, радует - дал повод помусолить тему БЕЗДЕЛЬНИКАМ. Иначе ведь, коли есть работа и ее много - когда штаны просиживать на форуме? У меня вот так никак не получается. А сегодня, даже в выходной день - я все равно решаю вопрос работы.
Иначе ведь, коли есть работа и ее много
Вы полагаете, я в 22:00 должен быть на работе?
“Мы не рабы - рабы не мы”. А вы…
