// Klop 2017 Говорящие часы
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <TM1637Display.h>
#include <SoftwareSerial.h>
#include <mp3TF.h>
#define BusyState 9 // пин BUSY плеера
#define touch 10 // пин сенсора
// TM1637 пины
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
byte cyfra[]={63,6,91,79,102,109,125,7,127,111};
byte data[] = {0,0,0,0}, prikol, pm;
bool fldv;
tmElements_t tm;
unsigned long interval=0;
mp3TF mp3tf = mp3TF ();
//------------------------------------------------------------
void setup()
{ display.setBrightness(10);
SoftwareSerial mySerial(8, 7); // RX, TX
mySerial.begin (9600);
mp3tf.init (&mySerial);
delay(200);
mp3tf.volumeSet(20);
delay(200);
pinMode(BusyState,INPUT);
pinMode(touch,INPUT);
}
//------------------------------------------------------------
void ozv(int myfile)
{ mp3tf.playFolder2(2,myfile);
delay(300);
while(!digitalRead(BusyState));
}
//------------------------------------------------------------
void golos()
{ ozv(tm.Hour+61);
ozv(tm.Minute+1);
}
//------------------------------------------------------------
void mydelay(long md)
{unsigned long starttime=millis();
while (millis()-starttime<md)
if (digitalRead(touch)) golos();
}
//------------------------------------------------------------
void hh()
{ getdt();
if (fldv) data[1]= data[1]|0x80;
display.setSegments(data);
}
//------------------------------------------------------------
void getdt()
{ if (RTC.read(tm))
{if (tm.Hour<10) data[0]=0;
else data[0]=cyfra[tm.Hour/10];
data[1]=cyfra[tm.Hour%10];
data[2]=cyfra[tm.Minute/10];
data[3]=cyfra[tm.Minute%10];
} else data[0]=8;
}
//------------------------------------------------------------
void loop()
{
hh();
mydelay(500);
fldv=!fldv;
}
// Klop 2017 Говорящие часы - ворчуны )
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <TM1637Display.h>
#include <SoftwareSerial.h>
#include <mp3TF.h>
#define BusyState 9 // пин BUSY плеера
#define touch 10 // пин сенсора
// TM1637 пины
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
byte cyfra[]={63,6,91,79,102,109,125,7,127,111};
byte data[] = {0,0,0,0}, prikol, pm;
bool fldv;
tmElements_t tm;
unsigned long interval=0;
mp3TF mp3tf = mp3TF ();
//------------------------------------------------------------
void setup()
{ display.setBrightness(10);
SoftwareSerial mySerial(8, 7); // RX, TX
mySerial.begin (9600);
mp3tf.init (&mySerial);
delay(200);
mp3tf.volumeSet(20);
delay(200);
pinMode(BusyState,INPUT);
pinMode(touch,INPUT);
}
//------------------------------------------------------------
void ozv(int myfile)
{ mp3tf.playFolder2(2,myfile);
delay(300);
while(!digitalRead(BusyState));
}
//------------------------------------------------------------
void golos()
{ unsigned long i; // начало кода ворчалок
i=millis()-interval;
interval=millis();
if (i<5000 && pm==tm.Minute)
{prikol++;
if (prikol==1) ozv(85); else
if (prikol==2) ozv(86); else
if (prikol==3) ozv(87);
delay(200);
} else prikol=0;
if (prikol==0) pm=tm.Minute;
if (prikol<3) // конец кода ворчалок
{ozv(tm.Hour+61);
ozv(tm.Minute+1);
}
}
//------------------------------------------------------------
void mydelay(long md)
{unsigned long starttime=millis();
while (millis()-starttime<md)
if (digitalRead(touch)) golos();
}
//------------------------------------------------------------
void hh()
{ getdt();
if (fldv) data[1]= data[1]|0x80;
display.setSegments(data);
}
//------------------------------------------------------------
void getdt()
{ if (RTC.read(tm))
{if (tm.Hour<10) data[0]=0;
else data[0]=cyfra[tm.Hour/10];
data[1]=cyfra[tm.Hour%10];
data[2]=cyfra[tm.Minute/10];
data[3]=cyfra[tm.Minute%10];
} else data[0]=8;
}
//------------------------------------------------------------
void loop()
{
hh();
mydelay(500);
fldv=!fldv;
}
//Klop 2017 говорилка чисел
#include <SoftwareSerial.h>
#include <mp3TF.h>
#define BusyState 9 // пин BUSY плеера
#define c19 19
#define c100 29
#define c1000 38
#define odna 76
#define dve 77
bool fl;
mp3TF mp3tf = mp3TF ();
char ccc[3];
byte troyka [3];
//------------------------------------------------------------
void setup()
{ SoftwareSerial mySerial(8, 7); // RX, TX
mySerial.begin (9600);
mp3tf.init (&mySerial);
delay(200);
pinMode(BusyState,INPUT);
mp3tf.volumeSet(22);
delay(200);
}
//------------------------------------------------------------
void ozv(int myfile)
{ mp3tf.playFolder2(1,myfile);
delay(200);
while(!digitalRead(BusyState));
}
//------------------------------------------------------------
void voicedig(char cc[])
{ int a,b,c,d,jj,sme,dp;
a=strlen(cc);
if (atoi(cc)==0) ozv(1); else
{
for (byte i=0;i<3;i++) ccc[i]=0;
b=a%3;c=a/3;jj=0;
for (byte i=0;i<c+1;i++)
{strncpy(ccc,cc+jj,b);
d=atoi(ccc); a=d;
for (byte i=0;i<3;i++)
{ troyka[2-i]=a%10;
a=a/10;
}
if (d>0)
{ dp=troyka[2];
if (c-i==1)
if (troyka[2]==1) dp=odna;
else if(troyka[2]==2) dp=dve;
if (troyka[0]>0) ozv(c100+troyka[0]-1);
if (troyka[1]>1) ozv(c19+troyka[1]);
else if (troyka[1]==1)
{ozv(troyka[1]*10+troyka[2]+1);
goto m1;
}
if (troyka[2]>0) ozv(dp+1);
m1: a=d%100;
if (a>19) a=d%10;
if (a==1) sme=0; else
if (a>1 && a<5) sme=1; else sme=2;
if (c-i>0) ozv(c1000+(c-i-1)*3+sme);
};
jj=jj+b;b=3;
delay(100);
}
}
}
//------------------------------------------------------------
void loop()
{
voicedig("91352412028529003471097014534460011762920");
while(true);
}
// Klop 2017 говорящий люксметр
#include <Wire.h>
#include <BH1750.h>
#include <TM1637Display.h>
#include <SoftwareSerial.h>
#include <mp3TF.h>
#define BusyState 9 // пин BUSY плеера
#define touch 10 // пин сенсора
#define c19 19
#define c100 29
#define c1000 38
#define odna 76
#define dve 77
#define f1 1 // папка с числами
#define f4 4 // папка с приветствием
// TM1637 пины
#define CLK 2
#define DIO 3
#define f3 3 // папка с файлами люксов
TM1637Display display(CLK, DIO);
byte cyfra[]={63,6,91,79,102,109,125,7,127,111};
byte data[] = {0,0,0,0}, prikol, pm;
mp3TF mp3tf = mp3TF ();
char str[100];
int lp=0;
uint16_t lux;
BH1750 lightMeter;
char ccc[3]; byte troyka [3];
//------------------------------------------------------------
void setup()
{ Serial.begin(9600);
lightMeter.begin();
display.setBrightness(10);
SoftwareSerial mySerial(8, 7); // RX, TX
mySerial.begin (9600);
mp3tf.init (&mySerial);
delay(200);
mp3tf.volumeSet(20);
delay(200);
pinMode(BusyState,INPUT);
pinMode(touch,INPUT);
ozv(f4,1);
}
//------------------------------------------------------------
void ozv(int papka, int myfile)
{ mp3tf.playFolder2(papka,myfile);
delay(300);
while(!digitalRead(BusyState));
}
//------------------------------------------------------------
void voicedig(char cc[])
{ int a,b,c,d,jj,sme,dp;
a=strlen(cc);
for (byte i=0;i<3;i++) ccc[i]=0;
b=a%3;c=a/3;jj=0;
for (byte i=0;i<c+1;i++)
{strncpy(ccc,cc+jj,b);
d=atoi(ccc); a=d;
for (byte i=0;i<3;i++)
{ troyka[2-i]=a%10;
a=a/10;
}
if (d>0)
{ dp=troyka[2];
if (c-i==1)
if (troyka[2]==1) dp=odna;
else if(troyka[2]==2) dp=dve;
if (troyka[0]>0) ozv(f1,c100+troyka[0]-1);
if (troyka[1]>1) ozv(f1,c19+troyka[1]);
else if (troyka[1]==1)
{ozv(f1,troyka[1]*10+troyka[2]+1);
goto m1;
}
if (troyka[2]>0) ozv(f1,dp+1);
m1: a=d%100;
if (a>19) a=d%10;
if (a==1) sme=0; else
if (a>0 && a<5) sme=1; else sme=2;
if (c-i>0) ozv(f1,c1000+(c-i-1)*3+sme);
}
jj=jj+b;b=3;
delay(100);
}
}
//------------------------------------------------------------
void mydelay(long md)
{unsigned long starttime=millis();
while (millis()-starttime<md)
if (digitalRead(touch) && lux>0)
{sprintf(str, "%u", lux );
voicedig(str);
byte a=lux%100;
if (a>19) a=lux%10;
if (a==1) ozv(f3,1); else
if (a>0 && a<5) ozv(f3,2); else
ozv(f3,3);
}
}
//------------------------------------------------------------
void hh()
{ getdt();
display.setSegments(data);
}
//------------------------------------------------------------
void getdt()
{ int a=lux;
for (byte i=0;i<4;i++)
{ data[3-i]=cyfra[a%10];
a=a/10;
}
}
//------------------------------------------------------------
void loop()
{ lux = lightMeter.readLightLevel();
hh();
mydelay(2000);
}
// Klop 2017
#include <TM1637Display.h>
#include <SoftwareSerial.h>
#include <mp3TF.h>
#define BusyState 9 // пин BUSY плеера
#define touch 10 // пин сенсора
#define c19 19
#define c100 29
#define c1000 38
#define odna 76
#define dve 77
#define f1 1 // папка с числами
#define f5 5 // папка с милиметрами
#define trigPin 11 // пины
#define echoPin 12 // дальномера
// TM1637 пины
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);
byte cyfra[]={63,6,91,79,102,109,125,7,127,111};
byte data[] = {0,0,0,0}, prikol, pm;
mp3TF mp3tf = mp3TF ();
char str[100];
int lp=0;
char ccc[3]; byte troyka [3];
int mm;
//------------------------------------------------------------
void setup()
{ Serial.begin(9600);
display.setBrightness(10);
SoftwareSerial mySerial(8, 7); // RX, TX
mySerial.begin (9600);
mp3tf.init (&mySerial);
delay(200);
mp3tf.volumeSet(20);
delay(200);
pinMode(BusyState,INPUT);
pinMode(touch,INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
//------------------------------------------------------------
void ozv(int papka, int myfile)
{ mp3tf.playFolder2(papka,myfile);
delay(300);
while(!digitalRead(BusyState));
}
//------------------------------------------------------------
void voicedig(char cc[])
{ int a,b,c,d,jj,sme,dp;
a=strlen(cc);
for (byte i=0;i<3;i++) ccc[i]=0;
b=a%3;c=a/3;jj=0;
for (byte i=0;i<c+1;i++)
{strncpy(ccc,cc+jj,b);
d=atoi(ccc); a=d;
for (byte i=0;i<3;i++)
{ troyka[2-i]=a%10;
a=a/10;
}
if (d>0)
{ dp=troyka[2];
if (c-i==1)
if (troyka[2]==1) dp=odna;
else if(troyka[2]==2) dp=dve;
if (troyka[0]>0) ozv(f1,c100+troyka[0]-1);
if (troyka[1]>1) ozv(f1,c19+troyka[1]);
else if (troyka[1]==1)
{ozv(f1,troyka[1]*10+troyka[2]+1);
goto m1;
}
if (troyka[2]>0) ozv(f1,dp+1);
m1: a=d%100;
if (a>19) a=d%10;
if (a==1) sme=0; else
if (a>0 && a<5) sme=1; else sme=2;
if (c-i>0) ozv(f1,c1000+(c-i-1)*3+sme);
}
jj=jj+b;b=3;
delay(100);
}
}
//------------------------------------------------------------
void mydelay(long md)
{unsigned long starttime=millis();
while (millis()-starttime<md)
if (digitalRead(touch) && mm>0)
{sprintf(str, "%u", mm );
voicedig(str);
byte a=mm%100;
if (a>19) a=mm%10;
if (a==1) ozv(f5,1); else
if (a>0 && a<5) ozv(f5,2); else
ozv(f5,3);
}
}
//------------------------------------------------------------
void hh()
{ getdt();
display.setSegments(data);
}
//------------------------------------------------------------
void getdt()
{ int a=mm;
for (byte i=0;i<4;i++)
{ data[3-i]=cyfra[a%10];
a=a/10;
}
}
//------------------------------------------------------------
void loop()
{ int duration;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
mm = duration / 5.8;
hh();
mydelay(2000);
}
//// © Klop 2017
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <IRremote.h>
#include <EEPROM2.h>
#include <SoftwareSerial.h>
#include <mp3TF.h>
#define BusyState 12 // пин BUSY плеера
#define rk 4 // ширина квадратика
#define rz 5 // ширина места
#define smeX 1
#define smeY 1
#define MaxX 10 // стакан кол-во мест по гориз
#define speaker 9
#define RECV_PIN 8 // нога на IRDA приемник
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 6 - LCD chip select (CS)
// pin 7 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
IRrecv irrecv(RECV_PIN);
decode_results results;
byte mstacan[MaxX][30];
byte Lst,SmeH, center, NumNext;
byte MaxY; // стакан кол-во мест по вертик
int dxx, dyy, FigX, FigY, Victory, myspeed,tempspeed;
unsigned long ok, levo, pravo, vniz, myrecord;
unsigned long flfirst=12345; // метка первого запуска
mp3TF mp3tf = mp3TF ();
byte fig[][4][4]=
{
{{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,0,0},
{0,1,0,0},
{0,1,0,0}},
{{0,0,0,0},
{0,1,1,0},
{0,1,1,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,1,0},
{0,0,1,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,0,0},
{0,1,1,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,1,0},
{0,1,0,0},
{0,0,0,0}},
{{0,0,1,0},
{0,1,1,0},
{0,1,0,0},
{0,0,0,0}},
{{0,0,1,0},
{0,0,1,0},
{0,1,1,0},
{0,0,0,0}},
{{0,0,0,0}, //8
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}}
};
//==============================================
void mybeep() // звук
{ mp3tf.setInterCut(2);
delay(800);
}
//==============================================
void figmove(byte a, byte b)
{
for (byte i=0;i<4;i++)
for (byte j=0;j<4;j++)
fig[a][i][j]=fig[b][i][j];
}
//==============================================
void figinit(byte a)
{
for (byte i=0;i<4;i++)
for (byte j=0;j<4;j++)
{
fig[0][i][j]=fig[NumNext][i][j];
if (fig[a][j][i]==1) // покажем след фигуру
display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, BLACK);
else display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, WHITE);
}
display.display();
NumNext=a;
tempspeed=myspeed-(Victory/30)*50; // через каждые 30 линий увеличим скорость падения;
dxx=0;
for (byte i=0;i<MaxX;i++)
if (mstacan[i][3]==2) {mp3tf.stop();
delay(200);
newgame();}
}
//==============================================
void viewstacan()
{
display.drawLine(0,0,0,display.height()-1, BLACK);
display.drawLine(0,display.height()-1,Lst, display.height()-1, BLACK);
display.drawLine(Lst,display.height()-1,Lst,0, BLACK);
for (byte j=4;j<MaxY;j++)
for (byte i=0;i<MaxX;i++)
if (mstacan[i][j]>0)
display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, BLACK);
else display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, WHITE);
ds(Victory,1);
display.display();
}
//================================================
void ds(int aa, int b)
{
display.fillRect(55, 10, 29, 10, WHITE);
display.setCursor(55,b*10);
display.println(aa);
}
//================================================
bool iffig(int dx, int dy)
{int i,j;
bool flag=true; bool pov=false;
for (i=0;i<MaxX;i++)
for (j=0;j<MaxY;j++)
if (mstacan[i][j]==1)
mstacan[i][j]=0; // убрали временно фигуру
if (dx==2) // поворот
{ dx=0; pov=true;
figmove(8,0);
for (i=0;i<4;i++)
for (j=0;j<4;j++)
{ fig[0][i][j]=fig[8][3-j][i];
if (fig[0][j][i]==1)
{ if (i+FigX+dx<0) dx=1; // пробуем отодвинуть от стенки слева на 1
if (i+FigX+dx>MaxX-1) dx=-1;// пробуем отодвинуть от стенки справа на 1
}
}
}
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (fig[0][j][i]==1)
if (i+FigX+dx<0 || i+FigX+dx>MaxX-1 || FigY+j+dy>MaxY-1 || mstacan[i+FigX+dx][FigY+j+dy]>0)
{flag=false; break;} // проверили на новые координаты
if (flag)
{FigX=FigX+dx; FigY=FigY+dy;byte k=0;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (fig[0][j][i]==1)
{mstacan[i+FigX][j+FigY]=1;
dxx=0;
}
} // переместили фигуру на новые координаты
else
{ if (pov) figmove(0,8);
for (i=0;i<4;i++) // восстановили фигуру
for (j=0;j<4;j++)
if (fig[0][j][i]==1)
mstacan[i+FigX][j+FigY]=1;
}
return(flag);
}
//================================================
void clearstacan()
{
for (byte i=0;i<MaxX;i++)
for (byte j=0;j<MaxY;j++)
mstacan[i][j]=0;
}
//================================================
unsigned long getbutton(char s[])
{unsigned long tt;
display.fillRect(5, 30, 40, 10, WHITE);
display.setCursor(5,30);
display.print(s);
display.display();
while (true)
if (irrecv.decode(&results)) // ловим код кнопки пульта
{ tt=results.value;
delay(400);
irrecv.resume();
break;
}
return(tt);
}
//================================================
void newgame()
{ unsigned long tb;
dxx=0; dyy=1;
display.setCursor(0,0);
clearstacan();
NumNext=random(7)+1;
figinit(random(7)+1);
center=MaxX/2-2;
FigX=center;FigY=0;
display.setCursor(52,0);
display.println("Линий");
viewstacan();
display.setCursor(5,0);
display.print("Рекорд");
display.setCursor(5,10);
display.print(myrecord);
display.display();
if (Victory>myrecord)
{ myrecord=Victory;
EEPROM_write(16, myrecord);
mp3tf.playFolder2(6,4);
delay(200);
while(!digitalRead(BusyState));
}
display.setCursor(5,20);
delay(2000);irrecv.resume();
display.println("Нажмите");
tb=getbutton(" OK");
if (tb!=ok)
{ ok=tb;
levo=getbutton("Влево");
pravo=getbutton("Вправо");
vniz=getbutton("Вниз");
EEPROM_write(0, ok);
EEPROM_write(4, levo);
EEPROM_write(8, pravo);
EEPROM_write(12, vniz);
}
display.fillRect(5, 0, (MaxX-1)*rz, 40, WHITE);
myspeed=800; tempspeed=myspeed;
Victory=0;
mp3tf.playFolder2(6,3);
}
//================================================
void setup()
{ unsigned long tr; word gg=0;
SoftwareSerial mySerial(10, 11); // RX, TX
mySerial.begin (9600);
mp3tf.init (&mySerial);
delay(200);
pinMode(BusyState,INPUT);
mp3tf.volumeSet(22);
delay(200);
mp3tf.setEQ(MP3_EQ_BASS );
randomSeed(analogRead(0));
irrecv.enableIRIn(); // Старт ресивера IRDA
display.begin();
display.setContrast(55);
display.setTextSize(1);
display.setTextColor(BLACK); // установка цвета текста
display.clearDisplay();
Lst=rz*MaxX; // ширина стакана в пикселях
MaxY=display.height()/rz+4; // Высота стакана в кубиках
SmeH=display.height()%rz; // смещение сверху в пикселях для отображения
random(7);
EEPROM_read(0, ok);
EEPROM_read(4, levo);
EEPROM_read(8, pravo);
EEPROM_read(12, vniz);
EEPROM_read(20, tr);
if (tr==flfirst) EEPROM_read(16, myrecord);
else { myrecord=0;
EEPROM_write(16, myrecord);
EEPROM_write(20, flfirst);
}
newgame();
}
//================================================
void dvoiki()
{
for (byte i=0;i<MaxX;i++)
for (byte j=0;j<MaxY;j++)
if (mstacan[i][j]==1)
mstacan[i][j]=2;
}
//================================================
void mydelay(int md)
{
unsigned long starttime=millis();
while (millis()-starttime<md)
{
if (irrecv.decode(&results)) // ловим код кнопки пульта
{
if (results.value==levo) dxx=-1; else
if (results.value==pravo) dxx=1; else
if (results.value==ok) dxx=2; else
if (results.value==vniz) {tempspeed=100; md=0;}
if (dxx!=0) {iffig(dxx,0); viewstacan(); }
delay(40); // убираем дребезг
irrecv.resume();
mp3tf.repeatCurrent(false);
}
}
}
//================================================
bool iffs() // есть ли полные строки?
{bool res=false;
for (byte j=0;j<MaxY;j++)
{ bool fl=true;
for (byte i=0;i<MaxX;i++)
if (mstacan[i][MaxY-1-j]==0) fl=false;
if (fl)
{Victory++;
if (myspeed<0) myspeed=0;
res=true; mybeep();
for (byte k=0;k<MaxX;k++)
for (byte n=j;n<MaxY-2;n++)
mstacan[k][MaxY-n-1]=mstacan[k][MaxY-n-2];
viewstacan();
}
}
return(res);
}
//================================================
void loop()
{ if (!iffig(dxx,dyy))
if (!iffig(0,dyy))
{ dvoiki();
while (iffs()) ;
figinit(random(7)+1);
FigX=center;FigY=0;
}
viewstacan();
mydelay(tempspeed);
}
+21 |
1847
37
|
+34 |
2389
132
|
А провал линии — «Money» «Pink Floyd»
У вас же компьютер!
Программ-переименовщиков предостаточно. Например, лёгонький ReNamer в полтора мегабайта. Да любой другой — стоит загуглить. А уж тупо пронумеровать по порядку — это даже батник наваять может начинающий програмер.
Мне периодически пригождаются.
UART Port
Standard Serial; TTL Level; Baud rate adjustable(default baud rate is 9600)
Однако нужной команды найти не удалось ни в мануале, ни в Гугле…
Кто-нить смог изменить битрейт UARTa в этом модуле?
С меня говорящий Вам +
Плюсанул и пошел заказывать.
P.s по вашей ссылке товар уже не доступен.
просто оставлю.
Как USB DAC. У меня заработал как картридер.
Можно не диктовать числа, а использовать программный синтезатор на ПК, скормив ему текстовый файл. Очень легко и быстро это было проделано на Mac. Даже голос можно выбрать. Уверен что таких программ полно.
total commander умеет переименовывать + ещё 1000 фукнкий
https://aliexpress.com/item/item/voice-playback-module-MP3-voice-prompts-voice-broadcast-device/32493850856.html
и просто ставил параллельно для каждой кнопки специальное реле 24В (9 штук) и оно замыкало контакты звуковой платы. Конечно, такой способ довольно затратный.
Хотелось бы пойти дальше.
Привинтить как то с распознанием голоса и команд, типа:
Приходишь с улицы — зажигается свет и на фоне легкой музыки мягкий голос:
— Приветствую (имя), какие будут пожелания?
-Кузя люстра ярко
-Кузя погода?
-Кузя музыка тихо
-Кузя закажи пицу :))))
Не уверен, что получится по-русски, но на английском примеров полно в сети.
Должно получится как-то так: «Kuzya, one bottle of vodka and talk to me now».
Типа, небольшая коробочка\брелок (со спичечную) с батарейкой, динамиком и кнопкой.
Жмёшь кнопку — играет закинутый файл, пусть в районе 30 секунд.
Типа продвинутый блок от музыкальной открытки или говорящей куклы.
2 мегабайта памяти на борту, для озвучки большинства проектов должно хватить
Подправил, добавил строку else ozv(f1,1);:
void voicedig(char cc[])
{ int a,b,c,d,jj,sme,dp;
a=strlen(cc);
for (byte i=0;i<3;i++) ccc[i]=0;
b=a%3;c=a/3;jj=0;
for (byte i=0;i<c+1;i++)
{strncpy(ccc,cc+jj,b);
d=atoi(ccc); a=d;
for (byte i=0;i<3;i++)
{ troyka[2-i]=a%10;
a=a/10;
}
if (d>0)
{ dp=troyka[2];
if (c-i==1)
if (troyka[2]==1) dp=odna;
else if(troyka[2]==2) dp=dve;
if (troyka[0]>0) ozv(f1,c100+troyka[0]-1);
if (troyka[1]>1) ozv(f1,c19+troyka[1]);
else if (troyka[1]==1)
{ozv(f1,troyka[1]*10+troyka[2]+1);
goto m1;
}
if (troyka[2]>=0) ozv(f1,dp+1);
m1: a=d%100;
if (a>19) a=d%10;
if (a==1) sme=0; else
if (a>1 && a<5) sme=1; else sme=2;
if (c-i>0) ozv(f1, c1000+(c-i-1)*3+sme);
}
else ozv(f1,1);
jj=jj+b;b=3;
delay(100);
}
Но проблема скетч синтезатора чисел выдаёт ошибку на этой строке: else ozv(f1,1); Говорит, что 'f1' was not declared in this scope
Как вылечить?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.