Библиотека голосового вывода. Плата Ардуино Уно R3. Библа может использовать пины 3 и 11. По дефолту - вывод на пин3 (PD3 прямой сигнал) и пин11 (PB3 инверсный сигнал). Погонял в Протеусе программки примеров. Вывод только на пин11, а он нужен для других дел. Задействовать пин3 не удается ни при каких аргументах функции voice(). Что нужно изменить в библиотеке, чтобы можно было выбирать режимы и выходы ?. Нашим гуру исправить библу наверняка будет как два пальца... С уважением. ПС. Проверить сейчас не на чем, но вряд ли затык в Протеусе. ППС. В оригинале код ввода АЦП - int voltage = analogRead(0) * 5.000 / 1.023; - дает завышенное значение. Вроде бы правильно - int voltage = analogRead(0) * 5.000 / 1.024; Код (C++): // Voltmeter.cpp #include <Arduino.h> #include "Talkie.h" #include "Vocab_US_Large.h" #include "Vocab_Special.h" // This enables pin 3 AND pin 11 to increase volume if speaker is attached between 3 and 11. // use Talkie voice(true, false); if you only need pin 3 or if you want to use SPI which needs pin 11. Talkie voice; void sayNumber(long n); void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(57600); #if defined(__AVR_ATmega32U4__) || defined(SERIAL_USB) || defined(SERIAL_PORT_USBVIRTUAL) || defined(ARDUINO_attiny3217) delay(4000); // To be able to connect Serial monitor after reset or power up and before first print out. Do not wait for an attached Serial Monitor! #endif // Just to know which program is running on my Arduino Serial.println(F("START " __FILE__ " from " __DATE__ "\r\nUsing library version " VERSION_TALKIE)); } void loop() { int voltage = analogRead(0) * 5.000 / 1.024; // В оригинале - ... * 5.000 / 1.023; Serial.println(voltage); sayNumber(voltage); voice.say(sp2_MILLI); voice.say(sp2_VOLTS); digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); } /* Say any number between -999,999 and 999,999 */ void sayNumber(long n) { if (n < 0) { voice.say(sp2_MINUS); sayNumber(-n); } else if (n == 0) { voice.say(sp2_ZERO); } else { if (n >= 1000) { int thousands = n / 1000; sayNumber(thousands); voice.say(sp2_THOUSAND); n %= 1000; if ((n > 0) && (n < 100)) voice.say(sp2_AND); } if (n >= 100) { int hundreds = n / 100; sayNumber(hundreds); voice.say(sp2_HUNDRED); n %= 100; if (n > 0) voice.say(sp2_AND); } if (n > 19) { int tens = n / 10; switch (tens) { case 2: voice.say(sp2_TWENTY); break; case 3: voice.say(sp2_THIR_); voice.say(sp2_T); break; case 4: voice.say(sp2_FOUR); voice.say(sp2_T); break; case 5: voice.say(sp2_FIF_); voice.say(sp2_T); break; case 6: voice.say(sp2_SIX); voice.say(sp2_T); break; case 7: voice.say(sp2_SEVEN); voice.say(sp2_T); break; case 8: voice.say(sp2_EIGHT); voice.say(sp2_T); break; case 9: voice.say(sp2_NINE); voice.say(sp2_T); break; } n %= 10; } switch (n) { case 1: voice.say(sp2_ONE); break; case 2: voice.say(sp2_TWO); break; case 3: voice.say(sp2_THREE); break; case 4: voice.say(sp2_FOUR); break; case 5: voice.say(sp2_FIVE); break; case 6: voice.say(sp2_SIX); break; case 7: voice.say(sp2_SEVEN); break; case 8: voice.say(sp2_EIGHT); break; case 9: voice.say(sp2_NINE); break; case 10: voice.say(sp2_TEN); break; case 11: voice.say(sp2_ELEVEN); break; case 12: voice.say(sp2_TWELVE); break; case 13: voice.say(sp2_THIR_); voice.say(sp2__TEEN); break; case 14: voice.say(sp2_FOUR); voice.say(sp2__TEEN); break; case 15: voice.say(sp2_FIF_); voice.say(sp2__TEEN); break; case 16: voice.say(sp2_SIX); voice.say(sp2__TEEN); break; case 17: voice.say(sp2_SEVEN); voice.say(sp2__TEEN); break; case 18: voice.say(sp2_EIGHT); voice.say(sp2__TEEN); break; case 19: voice.say(sp2_NINE); voice.say(sp2__TEEN); break; } } }
Может кому пригодится - С легкой душой сообщаю, что проблема оказалась не в коде и не в Протеусе, а в модели Ардуины Уно R3. Модель, которая появляется в списке Emulator - (библа Arduino, без кнопки ресета на плате) - глючит с данным кодом. Модель, которая появляется в списке Arduino - (библиотека Arduino TEP, кнопка ресет на плате) - ОК. Тему можно удалить. ПС. Библиотека Arduino TEP была скачана и установлена в Протеус вручную.