Получил таки голосовой модуль вот такого вида:
Пробую сделать его под модуль для УНО, подпаявшись двумя проводками по 1,2 и гребёнкой.
Получил таки голосовой модуль вот такого вида:
Пробую сделать его под модуль для УНО, подпаявшись двумя проводками по 1,2 и гребёнкой.
Данных производитель не даёт, схем тоже, пробуем методом тыка. Цель сделать много командный модуль типа нольнольодин, одинодинноль и т.д.
int inf_1 = 4;// информационные выводы на Ардуино
int inf_2 = 5;//
bool data_n;//переменные для обработки импульсов
bool data_k;//
bool urov_n;//переменные для обработки состояния светодиодов
bool urov_k;//
int st = 0; //
long Y = 0; //
void setup() {
pinMode(inf_1, INPUT);
pinMode(inf_2, INPUT);
Serial.begin(9600);
delay(1000);//
data_n = digitalRead(inf_1);// начальное считывание уровней с информационных входов
urov_n = digitalRead(inf_2);//
}
void loop() {
data_k = digitalRead(inf_1); //постоянный мониторинг первого входа
if (millis() - Y > 200) {// каждые 200мс проверяем произношение кодовых слов
Y = millis(); //
if (st != 0) {// если было кодовое слово...
st = 0;
urov_k = !digitalRead(inf_2);//отслеживаем уровень на светодиодах
if (urov_n != urov_k) {
urov_n = urov_k;
} if (urov_n) {
Serial.println("один");
} else {
Serial.println("ноль");
}
}
}
if (data_n != data_k) {//идёт счёт импульсов если прозвучало кодовое слово
data_n = data_k;
st++; Y = millis();
}
}
Вот такой вариант скетча позволяет различать Ардуино пару кодовых слов.
А на кой там ардуина?
как накой, считывать состояние светика и “нажимать” кнопку для записи голоса)
Нет. Модуль по задумке изготовителя автономен, голосовой ночник на два, как оказалось в реальности, состояния вкл.-выкл. Я преобразовал в модуль на произвольное число команд, сочетание двоичных нольодинодинодинноль…В принципе трёхсловные в голове должны держаться, несмотря на возраст, т.е. 8 команд. Можно усложнить анализ фразы, типа ноль это 000, а один это 100. Ну и далее по усложняющейся ![]()
Это иллюзия, как я не изголялся турн он лигт. Ничего. Пока не перезаписал пары своих слов. Другие команды читал вайт лайт, йоллов лай. Тоже пусто.
Можно попробовать с озвучкой по заданному тексту.
…может в красном модуле будет по другому, но он ещё не дошёл.
Как-то странно. На 1 и 2 (судя по таблице из #7) выводах pwm должен быть, а просто включен/выключен на 5. Или я чего-то не понял?
Это для модуля в другом форм-факторе, но с той-же микросхемой.
Таблица для другого модуля. На этом, зелёном, только вот такая инструкция нашлась ![]()
Описание
Описание операции:
Нажмите на кнопку, когда свет мигает один раз, чтобы сказать « освещенное» содержимое, а затем свет мигает три раза, запись прошла успешно.
Двойной щелчок кнопки, когда лампа мерцает дважды, произносит содержимое "выключить свет", затем свет мигает три раза, запись успешно.
Если вы хотите удалить записанные команды "зажечь" и "погасить", нажмите эту кнопку не менее 6 секунд.
Обратите внимание, что функция записи поддерживает только команды записи "ярких" и "выключенных".
Кроме того, вы можете использовать некоторые базовые команды управления, которые поставляются с заводом, но эти команды доступны только на русском языке:
Включи-свет
Выключи-свет
Белый-свет
Желтый-свет
Теплый-свет
Таймер-на-10-минут
Таймер-на-45-минут
Отключи-таймер
Это то и странно.
Найдите все три вывода, подключите светодиоды, запишите сами все 25 команд и смотрите реакцию.
И, кстати, интересно, - а если писать не голос, а конкретную частоту(с телефона/компа/генератора), то опознавание более гарантированное?
Не имея схем модулей? Не имея красного модуля? Про зелёный пишут продавцы только две команды перезаписываются. Кнопку жмут раз и потом два раза.
…но есть и положительный момент. На команды из таблицы другого модуля этот модуль отзывается. В общем, без схем, наугад по моей схеме подключения к ардуино, можно отличить 3 слова, два своих и третье из таблицы. Вывод который 1 из первой фотки темы выдаёт импульсы количеством в двух интервалах 80-120 штук или около 40 на кодовые слова. Плюс вывод со светодиода. Вот и отличаем три слова, точнее три типа кодовых слов.
int inf_1 = 4;// информационные выводы на Ардуино
int inf_2 = 5;//
bool data_n;//переменные для обработки импульсов
bool data_k;//
bool urov_n;//переменные для обработки состояния светодиодов
bool urov_k;//
int st = 0; //
long Y = 0; //
void setup() {
pinMode(inf_1, INPUT);
pinMode(inf_2, INPUT);
Serial.begin(9600);
delay(1000);//
data_n = digitalRead(inf_1);// начальное считывание уровней с информационных входов
urov_n = digitalRead(inf_2);//
}
void loop() {
data_k = digitalRead(inf_1); //постоянный мониторинг первого входа
if (millis() - Y > 200) {// каждые 200мс проверяем произношение кодовых слов
Y = millis(); //
if (st > 70) { // если было кодовое слово "один" или "ноль"...
st = 0;
urov_k = !digitalRead(inf_2);//отслеживаем уровень на светодиодах
if (urov_n != urov_k) {
urov_n = urov_k;
} if (urov_n) {
Serial.println("один");
} else {
Serial.println("ноль");
}
}
if (st > 30 && st < 70) { //
st = 0;
Serial.println("даркен");
}
}
if (data_n != data_k) {//идёт счёт импульсов если прозвучало кодовое слово
data_n = data_k;
st++; Y = millis();
}
}
Нда… Походу это не микросхема, а цельный контроллер. Там разные прошивки, а, соответственно, и схемы могут отличаться.
Какая то чехарда с математикой получается на цифре 3. Не понятно где.
int inf_1 = 4;// информационные выводы на Ардуино
int inf_2 = 5;//
bool data_n;//переменные для обработки импульсов
bool data_k;//
bool urov_n;//переменные для обработки состояния светодиодов
bool urov_k;//
int st = 0; //
long Y = 0; //
int st_k = -1; //
long Y_ = 0; //
int KOMANDA = 0;//
bool FL = true; //
void setup() {
pinMode(inf_1, INPUT);
pinMode(inf_2, INPUT);
Serial.begin(9600);
delay(1000);//
data_n = digitalRead(inf_1);// начальное считывание уровней с информационных входов
urov_n = digitalRead(inf_2);//
}
void loop() {
golos();
}
////////////////////////////////////////////////////////////////////////
void golos() {
//
data_k = digitalRead(inf_1); //постоянный мониторинг первого входа
//
if (millis() - Y_ > 2500) {// проверяем числовое значение команды
if (KOMANDA > 0) {
Serial.print("КОМАНДА "); Serial.println(KOMANDA);
}
else {
if (FL) {
Serial.println("/////////");
FL = false;
}
}
Y_ = millis(); st_k = -1; KOMANDA = 0;
}
//
if (millis() - Y > 200) {// каждые 200мс проверяем произношение кодовых слов
Y = millis(); //
if (st > 70) { // если было кодовое слово "один" или "ноль"...
FL = true;
st = 0; st_k++;// Serial.print("st_k "); Serial.println(st_k);
urov_k = !digitalRead(inf_2);//отслеживаем уровень на светодиодах
if (urov_n != urov_k) {
urov_n = urov_k;
} if (urov_n) {
Serial.println("один");
KOMANDA = KOMANDA + pow(2, st_k);
} else {
Serial.println("ноль");
KOMANDA = KOMANDA + 0;
}
}
}
//
if (data_n != data_k) {//идёт счёт импульсов если прозвучало кодовое слово
data_n = data_k;
st++; Y = millis(); Y_ = millis();
}
//
}
////////////////////////////////////////////////////////////////////////
У вас изначально кривая логика: - если комманда 1 это единица, то она же должна быть и на 01, и на 001, ина 0001, а у вас это разные комманды ![]()
Но даже на этом скетче может стоить уменьшить проверку if (st > 70)? Начать с единицы(на кой там 70?)
Таких конструкций быть не должно.
И, кроме того, в выдаче, зачем-то оформленной картинкой вместо текста, не прослеживается логики.
Вы хоть напишите, чего хотите достичь.
Нет, она прямая. 1 это сокращение от 1000…, 01 сокращение от 0100… и т.д.
Это порог, отделяющий один тип команд от других в этом модуле. Что делает вывод к которому я подключился - ХЗ, нет ни описания, ни схем.
Да, именно в нём и проблема. Просто думал, что без проблем будет счёт 2 в нулевой степени, 2 в первой, а 2 во второй уже вместо 4 даёт 3.
Переделал скетч:
int inf_1 = 4;// информационные выводы на Ардуино
int inf_2 = 5;//
bool data_n;//переменные для обработки импульсов
bool data_k;//
bool urov_n;//переменные для обработки состояния светодиодов
bool urov_k;//
int st = 0; //
long Y = 0; //
int st_k = -1; //
long Y_ = 0; //
int KOMANDA = 0;//
bool FL = false; //
void setup() {
pinMode(inf_1, INPUT);
pinMode(inf_2, INPUT);
Serial.begin(9600);
delay(1000);//
data_n = digitalRead(inf_1);// начальное считывание уровней с информационных входов
urov_n = digitalRead(inf_2);//
}
void loop() {
golos();
}
////////////////////////////////////////////////////////////////////////
void golos() {
//
data_k = digitalRead(inf_1); //постоянный мониторинг первого входа
//
if (millis() - Y_ > 2500) {// проверяем числовое значение команды
if (KOMANDA > 0) {
Serial.print("КОМАНДА "); Serial.println(KOMANDA);
}
else {
if (FL) {
Serial.println("/////////");
FL = false;
}
}
Y_ = millis(); st_k = -1; KOMANDA = 0;
}
//
if (millis() - Y > 200) {// каждые 200мс проверяем произношение кодовых слов
Y = millis(); //
if (st > 70) { // если было кодовое слово "один" или "ноль"...
FL = true;
st = 0; st_k++;// Serial.print("st_k "); Serial.println(st_k);
urov_k = !digitalRead(inf_2);//отслеживаем уровень на светодиодах
if (urov_n != urov_k) {
urov_n = urov_k;
} if (urov_n) {
Serial.println("один");
byte SL = 0;
if (st_k == 0) {
SL = 1;
}
if (st_k == 1) {
SL = 2;
}
if (st_k == 2) {
SL = 4;
}
if (st_k == 3) {
SL = 8;
}
// KOMANDA = KOMANDA + pow(2, st_k);
KOMANDA = KOMANDA + SL;
} else {
Serial.println("ноль");
KOMANDA = KOMANDA + 0;
}
}
}
//
if (data_n != data_k) {//идёт счёт импульсов если прозвучало кодовое слово
data_n = data_k;
st++; Y = millis(); Y_ = millis();
}
//
}
////////////////////////////////////////////////////////////////////////
А можно опубликовать полный список таких “сокращений”? Ибо без этого логика все равно не прослеживается.
А заодно объяснить почему, если 1 это сокращение от 1000, на экран выдается “один”, а не “тысяча”.
Забудьте про степени - работайте с разрядами.
И все-таки напишите, что Вы хотите получить. Неверный код в принципе не способен прояснить замысел. Поэтому мы не знаем, чего именно Вы хотите.