You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
294 lines
18 KiB
294 lines
18 KiB
# ഒരു ടൈമർ സജ്ജീകരിക്കുക - Wio ടെർമിനൽ
|
|
|
|
ഈ ഭാഗത്തിൽ, നിങ്ങൾക്ക് നിങ്ങളുടെ സർവർലെസ്സ് കോഡ് വിളിച്ച് സംസാരത്തെ മനസ്സിലാക്കുകയും, ഫലങ്ങളെ അടിസ്ഥാനമാക്കി നിങ്ങളുടെ Wio ടെർമിനലിൽ ഒരു ടൈമർ സജ്ജമാക്കുകയും ചെയ്യാം.
|
|
|
|
## ഒരു ടൈമർ സജ്ജീകരിക്കുക
|
|
|
|
സ്പീച്ച് ടു ടെക്സ്റ്റ് കോൾ നിന്ന് മടങ്ങിയെത്തുന്ന വാചകം LUIS ഉപയോഗിച്ച് പ്രാസസ്സ് ചെയ്യുന്നതിനായി നിങ്ങളുടെ സർവർലെസ്സ് കോഡിലേക്കു അയയ്ക്കേണ്ടതുണ്ട്, ടൈമറിനുള്ള സെക്കൻഡ് എണ്ണം തിരിച്ചറിയാൻ. ഈ സെക്കൻഡ് എണ്ണം ഒരു ടൈമർ സജ്ജീകരിക്കാൻ ഉപയോഗിക്കാം.
|
|
|
|
മൈക്രോകൺട്രോളറുകൾക്ക് അടിസ്ഥാനമായി എറ്ഡും ലോത്ത് ഒപ്പ് ശ്രേണി പിന്തുണ ഇല്ല, അതുകൊണ്ട് Python പോലുള്ള ഉയർന്ന നിരക്കിലുള്ള ഭാഷകളിൽ കാണാവുന്ന സ്റ്റാൻഡേർഡ് ടൈമർ ക്ലാസുകൾ ഇവയിൽ ലഭ്യമല്ല. പകരം, `loop` ഫംക്ഷനിൽ കഴിഞ്ഞ സമയം അളക്കുകയും സമയമെത്തുമ്പോൾ ഫംക്ഷനുകൾ വിളിക്കുകയും ചെയ്യുന്ന ടൈമർ ലൈബ്രറികൾ നിങ്ങൾക്ക് ഉപയോഗിക്കാം.
|
|
|
|
### ടാസ്ക് - വാചകം സർവർലെസ്സ് ഫംക്ഷനിലേക്ക് അയയ്ക്കുക
|
|
|
|
1. `smart-timer` പ്രോജക്ട് VS Code-ൽ തുറക്കുക, ഇതിനകം തുറന്നിട്ടില്ലെങ്കിൽ.
|
|
|
|
1. `config.h` ഹെഡർ ഫയൽ തുറന്ന് നിങ്ങളുടെ ഫംക്ഷൻ ആപിന്റെ URL ചേർക്കുക:
|
|
|
|
```cpp
|
|
const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
|
|
```
|
|
|
|
`<URL>`-നെ പകരം മുൻപത്തെ അധ്യായത്തിലെ അവസാന ഘട്ടത്തിൽ നിങ്ങൾക്ക് ലഭിച്ച നിങ്ങളുടെ ഫംക്ഷൻ ആപിന്റെ URL ഉപയോഗിക്കുക, നിങ്ങളുടെ ഫംക്ഷൻ ആപ് ഓടുന്ന നിങ്ങളുടെ ലൊക്കൽ മെഷീനിന്റെ IP വിലാസത്തിലേക്ക് സൂചിപ്പിക്കുന്നു.
|
|
|
|
1. `src` ഫോൾഡറിൽ `language_understanding.h` എന്ന പുതിയ ഫയൽ സൃഷ്ടിക്കുക. ഇത് LUIS ഉപയോഗിച്ച് സെക്കൻഡുകളായി മാറ്റുന്നതിനായി തിരിച്ചറിയപ്പെട്ട സ്പീച് നിങ്ങളുടെ ഫംക്ഷൻ ആപിലേക്ക് അയയ്ക്കാൻ ക്ലാസ് നിർവചിക്കാൻ ഉപയോഗിക്കും.
|
|
|
|
1. താഴെ കാണുന്ന കോഡ് ഈ ഫയലിന്റെ മുകളിലുള്ളത് ചേർക്കുക:
|
|
|
|
```cpp
|
|
#pragma once
|
|
|
|
#include <Arduino.h>
|
|
#include <ArduinoJson.h>
|
|
#include <HTTPClient.h>
|
|
#include <WiFiClient.h>
|
|
|
|
#include "config.h"
|
|
```
|
|
|
|
ഇതും ചില ആവശ്യമായ ഹെഡർ ഫയലുകൾ ഉൾക്കൊള്ളിക്കുന്നു.
|
|
|
|
1. `LanguageUnderstanding` എന്ന ക്ലാസ് നിർവചിച്ച്, ഈ ക്ലാസിന്റെ ഒരു ഇൻസ്റ്റൻസ് പ്രഖ്യാപിക്കുക:
|
|
|
|
```cpp
|
|
class LanguageUnderstanding
|
|
{
|
|
public:
|
|
private:
|
|
};
|
|
|
|
LanguageUnderstanding languageUnderstanding;
|
|
```
|
|
|
|
1. നിങ്ങളുടെ ഫംക്ഷൻ ആപ് വിളിക്കാനായി WiFi ക്ലയന്റ് പ്രഖ്യാപിക്കണം. ക്ലാസിന്റെ `private` വിഭാഗത്തിൽ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
WiFiClient _client;
|
|
```
|
|
|
|
1. `public` വിഭാഗത്തിൽ, functions ആപ് വിളിക്കാൻ `GetTimerDuration` എന്ന മെത്തഡ് പ്രഖ്യാപിക്കുക:
|
|
|
|
```cpp
|
|
int GetTimerDuration(String text)
|
|
{
|
|
}
|
|
```
|
|
|
|
1. `GetTimerDuration` മെത്തഡിൽ, functions ആപ്പിലേക്ക് അയയ്ക്കുന്ന JSON നിർമ്മിക്കാൻ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
DynamicJsonDocument doc(1024);
|
|
doc["text"] = text;
|
|
|
|
String body;
|
|
serializeJson(doc, body);
|
|
```
|
|
|
|
ഇതുവഴി `GetTimerDuration`-ന് നൽകുന്ന വാചകം താഴെ കാണുന്ന JSON-ലേക്ക് മാറ്റം വരുത്തുന്നു:
|
|
|
|
```json
|
|
{
|
|
"text" : "<text>"
|
|
}
|
|
```
|
|
|
|
ഇവിടെ `<text>` എന്നത് ഫംക്ഷനിലേക്ക് നൽകിയ വാചകമാണ്.
|
|
|
|
1. ഈ ഭാഗത്തിനു കീഴിൽ functions ആപ് കോൾ നിർമ്മിക്കാൻ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
HTTPClient httpClient;
|
|
httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL);
|
|
|
|
int httpResponseCode = httpClient.POST(body);
|
|
```
|
|
|
|
JSON ബോഡി പാസ്സുചെയ്തുകൊണ്ട് functions ആപ്പിന് POST അഭ്യർത്ഥന അയക്കുന്നും, പ്രതികരണ കോഡ് ലഭിക്കുന്നും ഇത് ചെയ്യുന്നു.
|
|
|
|
1. ഈ ഭാഗത്തിനു കീഴിൽ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
int seconds = 0;
|
|
if (httpResponseCode == 200)
|
|
{
|
|
String result = httpClient.getString();
|
|
Serial.println(result);
|
|
|
|
DynamicJsonDocument doc(1024);
|
|
deserializeJson(doc, result.c_str());
|
|
|
|
JsonObject obj = doc.as<JsonObject>();
|
|
seconds = obj["seconds"].as<int>();
|
|
}
|
|
else
|
|
{
|
|
Serial.print("Failed to understand text - error ");
|
|
Serial.println(httpResponseCode);
|
|
}
|
|
```
|
|
|
|
ഈ കോഡ് പ്രതികരണ കോഡ് പരിശോധിക്കുന്നു. 200 (വിജയം) ആണെങ്കിൽ, ടൈമറിനുള്ള സെക്കൻഡ് എണ്ണം പ്രതികരണ ബോഡിയിൽ നിന്ന് പുറപ്പെടുന്നു. അല്ലെങ്കിൽ, സീരിയൽ മൊണിറ്ററിൽ പിഴവ് അറിയിപ്പും 0 സെക്കൻഡുകൾ സെറ്റ് ചെയ്യുന്നതും നടക്കുന്നു.
|
|
|
|
1. ഈ മെത്തഡിന്റെ അവസാനം HTTP ബന്ധം അടയ്ക്കുകയും സെക്കൻഡ് എണ്ണം റിട്ടേൺ ചെയ്യുകയും ചെയ്യുന്നതിന് താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
httpClient.end();
|
|
|
|
return seconds;
|
|
```
|
|
|
|
1. `main.cpp` ഫയലിൽ, ഈ പുതിയ ഹെഡർ ഉൾപ്പെടുത്തുക:
|
|
|
|
```cpp
|
|
#include "speech_to_text.h"
|
|
```
|
|
|
|
1. `processAudio` ഫംക്ഷന്റെ അവസാനത്തിൽ, ടൈമർ ദൈർഘ്യം ലഭിക്കുന്നതിന് `GetTimerDuration` മെത്തഡ് വിളിക്കുക:
|
|
|
|
```cpp
|
|
int total_seconds = languageUnderstanding.GetTimerDuration(text);
|
|
```
|
|
|
|
ഇത് `SpeechToText` ക്ലാസിന്റെ കോൾ നിന്നുള്ള വാചകത്തെ ടൈമറിന് വേണ്ട സെക്കൻഡുകളായി മാറ്റുന്നു.
|
|
|
|
### ടാസ്ക് - ടൈമർ സജ്ജീകരിക്കുക
|
|
|
|
സെക്കൻഡ് എണ്ണം ഉപയോഗിച്ച് ടൈമർ സജ്ജീകരിക്കാം.
|
|
|
|
1. `platformio.ini` ഫയലിൽ ടൈമർ സജ്ജീകരിക്കാൻ ലൈബ്രറി dependency ചേർക്കുക:
|
|
|
|
```ini
|
|
contrem/arduino-timer @ 2.3.0
|
|
```
|
|
|
|
1. `main.cpp` ഫയലിൽ ഈ ലൈബ്രറിയുടെ include നിർദേശമിടുക:
|
|
|
|
```cpp
|
|
#include <arduino-timer.h>
|
|
```
|
|
|
|
1. `processAudio` ഫംക്ഷനു മുകളിൽ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
auto timer = timer_create_default();
|
|
```
|
|
|
|
ഈ കോഡ് `timer` എന്ന പേരിൽ ഒരു ടൈമർ പ്രഖ്യാപിക്കുന്നു.
|
|
|
|
1. ഇതിനു താഴെ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
void say(String text)
|
|
{
|
|
Serial.print("Saying ");
|
|
Serial.println(text);
|
|
}
|
|
```
|
|
|
|
ഈ `say` ഫംക്ഷൻ പിന്നീട് വാചകത്തെയാണ് സംസാരത്തിലേക്ക് മാറ്റാൻ ഉപയോഗിക്കുന്നത്, പക്ഷേ ഇപ്പോള് വാചകം സീരിയൽ മോണിറ്ററിലേക്ക് എഴുതുന്നതുമാത്രമാണ്.
|
|
|
|
1. `say` ഫംക്ഷനിനു താഴെ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
bool timerExpired(void *announcement)
|
|
{
|
|
say((char *)announcement);
|
|
return false;
|
|
}
|
|
```
|
|
|
|
ടൈമർ കാലഹരണപ്പെട്ടപ്പോള് വിളിക്കേണ്ട callback ഫംക്ഷൻ ഇത് ആണ്. ടൈമർ കാലഹരണപ്പെട്ടപ്പോള് പറയാനുള്ള സന്ദേശം ഈ ഫംക്ഷനിലേക്ക് geçirിക്കുന്നു. ടൈമറുകൾ ആവർത്തിക്കാം, അതിന് ഈ callbackയുടെ റിട്ടേൺ മൂല്യം നിയന്ത്രണം നൽകും - ഇത് `false` റിട്ടേൺ ചെയ്ത് ടൈമറെ വീണ്ടും നടത്താൻ അനുവദിക്കില്ല.
|
|
|
|
1. `processAudio` ഫംക്ഷന്റെ അന്ത്യംത്യിൽ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
if (total_seconds == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
int minutes = total_seconds / 60;
|
|
int seconds = total_seconds % 60;
|
|
```
|
|
|
|
മൊത്തം സെക്കൻഡ് എണ്ണം പരിശോധിച്ച് 0 ആണെങ്കിൽ, യാതൊരു ടൈമറുകളും സജ്ജമാക്കാതെ ഫംക്ഷൻ പിന്മാറും. പിന്നീട് മൊത്തം സെക്കൻഡിനെ മിനിറ്റുകളിലേക്കും സെക്കൻഡുകളിലേക്കും മാറ്റും.
|
|
|
|
1. ഈ കോഡിനു താഴെ ടൈമർ തുടങ്ങുമ്പോൾ പറയാനുള്ള സന്ദേശം സൃഷ്ടിക്കുന്നതിന് താഴെ കണ്ടെത്തൂ:
|
|
|
|
```cpp
|
|
String begin_message;
|
|
if (minutes > 0)
|
|
{
|
|
begin_message += minutes;
|
|
begin_message += " minute ";
|
|
}
|
|
if (seconds > 0)
|
|
{
|
|
begin_message += seconds;
|
|
begin_message += " second ";
|
|
}
|
|
|
|
begin_message += "timer started.";
|
|
```
|
|
|
|
1. ഇതിനു താഴെ ടൈമർ കാലഹരണപ്പെട്ടപ്പോൾ പറയാനുള്ള സന്ദേശം സൃഷ്ടിക്കുന്നതിന് സമാനമായ കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
String end_message("Times up on your ");
|
|
if (minutes > 0)
|
|
{
|
|
end_message += minutes;
|
|
end_message += " minute ";
|
|
}
|
|
if (seconds > 0)
|
|
{
|
|
end_message += seconds;
|
|
end_message += " second ";
|
|
}
|
|
|
|
end_message += "timer.";
|
|
```
|
|
|
|
1. ഇതിനു ശേഷം ടൈമർ തുടങ്ങിയ സന്ദേശം പറയുക:
|
|
|
|
```cpp
|
|
say(begin_message);
|
|
```
|
|
|
|
1. ഈ ഫംക്ഷന്റെ അവസാനം ടൈമർ തുടങ്ങുക:
|
|
|
|
```cpp
|
|
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
|
|
```
|
|
|
|
ഇത് ടൈമർ അകറ്റുന്നു. ടൈമർ മില്ലിസെക്കൻഡുകളായി സജ്ജീകരിക്കപ്പെടുന്നു, അതിനാല് മൊത്തം സെക്കൻഡ് 1,000-നെ ഗുണിച്ച് മില്ലിസെക്കൻഡുകളായി മാറ്റപ്പെടുന്നു. `timerExpired` ഫംക്ഷൻ callback ആയി പാസ്സാക്കുന്നു, `end_message` callback-ന് പാരാമീറ്റർ ആയി. ഈ callbackക്ക് വെറും `void *` പാരാമീറ്ററുകൾ മാത്രമേ എടുക്കൂ, അതുകൊണ്ട് സ്ട്രിംഗ് അനുയോജ്യമായി മാറ്റപ്പെടുന്നു.
|
|
|
|
1. അവസാനം, ടൈമർ *ടിക്ക്* ചെയ്യണം, ഇത് `loop` ഫംക്ഷനിൽ നടന്നു പോകുന്നു. `loop` ഫംക്ഷന്റെ അവസാനത്തിൽ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
|
|
|
|
```cpp
|
|
timer.tick();
|
|
```
|
|
|
|
1. ഈ കോഡ് બિલഡ് ചെയ്ത്, നിങ്ങളുടെ Wio ടെർമിനലിലേക്ക് അപ്ലോഡ് ചെയ്ത് സീരിയൽ മൊണിറ്ററിൽ പരീക്ഷിക്കുക. സീരിയൽ മൊണിറ്ററിൽ `Ready` കാണുമ്പോൾ, C ബട്ടൺ (ഇടത്തുഭാഗത്തുള്ള, പവർ സ്വിച്ച് സമീപത്ത്) അമർത്തി സംസാരിക്കുക. 4 സെക്കൻഡ് ഓഡിയോ പകര്ത്തുകയും, ടെക്സ്റ്റിലേക്ക് മാറ്റുകയും, തുടർന്ന് functions ആപ്പിലേക്ക് അയയ്ക്കുകയും, ടൈമർ സജ്ജീകരിക്കുകയും ചെയ്യും. functions ആപ്പ് ലോക്കലായി ഓടുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക.
|
|
|
|
ടൈമർ 언제 시작되고 언제 끝나는지도 കാണും.
|
|
|
|
```output
|
|
--- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
|
|
--- More details at http://bit.ly/pio-monitor-filters
|
|
--- Miniterm on /dev/cu.usbmodem1101 9600,8,N,1 ---
|
|
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
|
|
Connecting to WiFi..
|
|
Connected!
|
|
Got access token.
|
|
Ready.
|
|
Starting recording...
|
|
Finished recording
|
|
Sending speech...
|
|
Speech sent!
|
|
{"RecognitionStatus":"Success","DisplayText":"Set a 2 minute and 27 second timer.","Offset":4700000,"Duration":35300000}
|
|
Set a 2 minute and 27 second timer.
|
|
{"seconds": 147}
|
|
2 minute 27 second timer started.
|
|
Times up on your 2 minute 27 second timer.
|
|
```
|
|
|
|
> 💁 ഈ കോഡ് [code-timer/wio-terminal](../../../../../6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal) ഫോൾഡറിലാണ് കണ്ടെത്തുക.
|
|
|
|
😀 നിങ്ങളുടെ ടൈമർ പ്രോഗ്രാം വിജയിച്ചു!
|
|
|
|
---
|
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
|
**ഷലം**:
|
|
ഈ ഡോക്കുമെന്റ് AI ഭാഷാന്തരണ സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് തർജ്ജമ ചെയ്തതാണ്. ഞങ്ങൾ കാര്യക്ഷമതയ്ക്കായി ശ്രമിച്ചെങ്കിലും, ഓട്ടോമാറ്റിക് തർജ്ജമകളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടായിരിക്കാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. ഭാഷയുടെ സ്വന്തം മാതൃഭാഷയിലെ അസൽ ഡോക്കുമെന്റ് തന്നെയാണ് ഔദ്യോഗിക ഉറവിടം എന്ന് കണക്കാക്കേണ്ടതാണ്. നിർണായക വിവരങ്ങൾക്ക് പ്രൊഫഷണൽ മനുഷ്യ ഭാഷാന്തരണം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ തർജ്ജമ ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതൊരു തെറ്റിദ്ധാരണക്കും ഞങ്ങൾക്ക് ഉത്തരവാദിത്തമില്ല.
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER END --> |