duinozone.cz - Arduino a Raspberry fórum

Poslední příspěvky

Stran: [1] 2 3 ... 10
1
Bastlírna / Re:komunikace po RS-485
« Poslední příspěvek od Martin Pihrt kdy Září 18, 2017, 21:20:47 odpoledne »
Zdravím,
ano, lze použít pouze čip max 485 (nebo levnější SN75176) stejné čipy se používají v osvětlovací technice jako DMX512. Není tedy nutná ta destička. Při vhodné komunikační rychlosti může být stíněný kabel až 500m dlouhý. Z praxe zvukaře: kabely pro DMX (Z 120 Ohmů) jsou kolikrát dlouhé až 300m (podium - mixpult) a vše běží bez problémů. U posledního zařízení je vhodné sběrnici zakončit rezistorem 120 Ohm.

15 metrů stíněný kabel tedy s "klidem" :-)

MP
3
Projekty / Ovládanie hlasom pre Arduino, NodeMCU, ESP a ďalšie..
« Poslední příspěvek od martinius96 kdy Září 17, 2017, 20:52:29 odpoledne »
Pojem ovládanie hlasom je dnes jednoznačne spojený s inteligentnou domácnosťou, či riadením procesov, modulov z internetu. Dnes vám prinášam spôsob, ako do vašich projektov priniesť interaktivitu v podobe ovládania hlasom.  Existuje mnoho technológii, ktoré umožňujú prevod hlasu na text.
 
V našom výukovom článku sa zameriame na technológiu Webkit Speech Recognition. Jedná sa o systém, ktorý umožňuje jednoducho a efektívne prevádzať reč na text. Jedným z parametrov technológie je výber jazyka. Plná podpora slovenčiny, češtiny je samozrejmosťou. Webaplikácia, postavená mnou, v ktorej technológia beží je postavená tak, že používateľ má dve varianty vstupu:
    Požiadavka zadaná textom do input poľa stránky.
    Požiadavka zadaná hlasom po kliknutí na obrázok mikrofónu na stránke.
Výsledok oboch variant je identický. Výsledok sa zapíše do .txt súboru, s ktorým vie následne každý mikroprocesor pracovať. Strana mikroprocesora je postavená jednoducho, čo zaručí porozumenie kódu každého programátora. Mikroprocesor si prečíta reťazec v .txt súbore a uloží ho do príslušnej premennej.  Premenná sa dá následne porovnať s reťazcami v kóde, čo umožní následný výber akcie.
 
Je vhodné použiť viacero porovnateľných reťazcov pre jednu akciu, nakoľko preklad je dosť citlivý na vyslovenie jednotlivých hlások. Niekedy Webkit preloží led ako let, alebo zapíše veľkými písmenami LED. Občas sa stane, že medzi led a číslom ledky nie je medzera a reťazec ostane v tvare Zapni led2. Ak porovnávame identickosť reťazca s reťazcami v kóde, tak sa môže stať, že získame výstup: Zapni LED 1, ale v kóde budeme porovnávať reťazec s Zapni led 1. Požiadavka sa nevykoná, nakoľko reťazce nie sú identické, i keď sa v nich vyskytujú tie isté znaky. V prípade, že si veríte viac v PHP časti, môžete tieto reťazce prevádzať už na strane servera a transformovať ich napríklad na reťazec Zapni LED 1, ktorý následne porovnáte v kóde NodeMCU. Pri Webkite je dôležitý a zároveň kľúčový výber jazyka. Pre výber slovenského jazyka nastavte v súbore index.php  recognition.lang = "sk-SK";  v prípade českého jazyka nastavte  recognition.lang = "cs-CZ";, v prípade angličtiny  recognition.lang = "en-US";.

Dobrou vecou je i vyhnúť sa diakritike, nakoľko na strane servera i klienta môže dôjsť k zmiešanému/rozdielnemu kódovaniu. Po uložení slova Čau si ho môže mikroprocesor stiahnuť ako ÄŚau, čo tiež veľmi nepomôže porovnaniu reťazcov, no na strane servera je možné to riešiť transformáciou do správneho tvaru. Toto riešenie je dobré napríklad pre spínanie svetiel, kedy si mikroprocesor raz prečíta požiadavku, vykoná a aj keď si ju stiahne opakovane, tak sa nič nedeje, nakoľko je na výstupe taká istá hodnota.
 
Čo ale použiť v prípade ovládania intenzity svetla, ak ju chceme navýšiť o 20% jeden krát?

Ak si mikroprocesor stiahne takýto reťazec opakovane, bude neustále navyšovať intenzitu do maximálneho možného štádia, ktoré je už limitované výstupom, alebo dôjde k zničeniu daného osvetlenia, diódy. Dobrou praxou je uložiť si predchádzajúci reťazec a porovnať s aktuálnym stiahnutým.
Tento postup umožní nevykonať akciu, pokým prijatý reťazec nebude iný ako terajší, prípadne je ho možné doplniť o podmienku s dodaním 1-krát, 2-krát... Poprípade je možné requestom na PHP stránku obsah súboru vymazať, aby sa už nestiahol reťazec duplicitne.
Projekt je veľmi jednoduché použiť i do projektov inteligentnej domácnosti, ovládania domu, monitoringu veličín.

Prostredníctvom hlasu môžeme ovládať aj vstupy, kedy po hlasovej požiadavke mikroprocesor získa zo vstupu údaj o teplote a vie ho zaslať/vypísať tam, kde používateľ potrebuje. V tomto systéme je veľmi jednoduché nakódovať automatický/manuálny režim.

Čo budem potrebovať na spustenie ovládania hlasom?

    Webserver (lokálny/verejný) s HTTPS protokolom
    PHP súbory
    .txt súbor
    Mikroprocesor (Arduino, NodeMCU, ESP32, Raspberry, Orange Pi.. a iné)
    Pripojenie k internetu
    Prehliadač Chrome

Testovanie prebiehalo s notebookom a smartfónom s prehliadačom Chrome. Prvý krát je potrebné mikrofón potvrdiť. Pri opakovanej návšteve stránky už mikrofón funguje bezproblémovo a nie je nutné ho potvrdiť. Mikrofón ale funguje výlučne na HTTPS (šifrovanej) stránke, nakoľko na nešifrovanej stránke ho blokuje samotný prehliadač.
 
Na strane mikroprocesora som použil dosku NodeMCU v3 Lolin, kde som nenarazil na žiaden problém z pohľadu spracovania a vyhodnotenia stiahnutého obsahu súboru. Riešenie som testoval až pre 8 výstupov.  V prípade použitia pripojenia na HTTPS stránku je nutné do kódu vložiť aj odtlačok HTTPS certifikátu stránky - (fingerprint) v kóde. Riešenie je kompatibilné aj s NodeMCU v2. Stiahnutý reťazec je v kóde pod premennou line. V kóde sa nachádza aj ukážka ovládania 4 led diód za pomoci stiahnutého reťazca, ktorý je možné pozmeniť hlasom. Fingerprint získate po návšteve vašej HTTPS stránky kliknutím pravým tlačidlom myši --> Preskúmať --> Security --> View certificate --> záložka Podrobnosti --> Odtlačok verejného kľúča(SHA1).

httpspripojenie.ino – súbor pre NodeMCU
Kód: [Vybrat]
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
const int led1 = 16;
const int led2 = 5;
const int led3 = 4;
const int led4 = 0;
const char* ssid = "wifimeno";
const char* password = "heslo";
const char* host = "vasastranka.sk"; //bez https a www
const int httpsPort = 443;
const char* fingerprint = "13 9f 87 1d b1 85 be e6 bd 73 c1 8d 04 63 58 99 f0 32 43 92";

void setup() {
  Serial.begin(115200);
  Serial.println();
    pinMode(led1, OUTPUT);
   pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
     pinMode(led4, OUTPUT);
  Serial.print("pripajam na ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi pripojene");
  Serial.println("IP adresa: ");
  Serial.println(WiFi.localIP());

}

void loop() {

   WiFiClientSecure client;
  Serial.print("pripajam sa na ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {
    Serial.println("pripojenie neuspesne");
    return;
  }

  if (client.verify(fingerprint, host)) {
    Serial.println("certifikat zhodny");
  } else {
    Serial.println("certifikat nezhodny");
  }

String url = "/ preklady.txt";
  Serial.print("poziadavka na adresu: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: NodeMCU\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("poziadavka vykonana");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
   
    if (line == "\r") {
      Serial.println("hlavicka obdrzana");
      break;
    }
  }
  String line = client.readStringUntil('\n');
 
  Serial.println("Odpoved bola:");
  Serial.println("==========");
  Serial.println(line);

  if(line=="Zapni LED 1" || line =="Zapni led 1" || line =="Zapni let 1" || line =="Zapni LED jeden" || line =="Zapni LED1" || line =="Zapni led1"){
     digitalWrite(led1, HIGH);
    }
     if(line=="Vypni LED 1" || line =="Vypni led 1" || line =="Vypni let 1" || line =="Vypni LED jeden" || line =="Vypni LED1" || line =="Vypni led1"){
     digitalWrite(led1, LOW);
    }
      if(line=="Zapni LED 2" || line =="Zapni led 2" || line =="Zapni let 2" || line =="Zapni LED dva" || line =="Zapni LED2" || line =="Zapni led2"){
     digitalWrite(led2, HIGH);
    }
     if(line=="Vypni LED 2" || line =="Vypni led 2" || line =="Vypni let 2" || line =="Vypni LED dva" || line =="Vypni LED2" || line =="Vypni led2"){
     digitalWrite(led2, LOW);
    }
      if(line=="Zapni LED 3" || line =="Zapni led 3" || line =="Zapni let 3" || line =="Zapni LED tri" || line =="Zapni LED3" || line =="Zapni led3"){
     digitalWrite(led3, HIGH);
    }
     if(line=="Vypni LED 3" || line =="Vypni led 3" || line =="Vypni let 3" || line =="Vypni LED tri" || line =="Vypni LED3" || line =="Vypni led3"){
     digitalWrite(led3, LOW);
    }
      if(line=="Zapni LED 4" || line =="Zapni led 4" || line =="Zapni let 4" || line =="Zapni LED styri" || line =="Zapni LED4" || line =="Zapni led4"){
     digitalWrite(led4, HIGH);
    }
     if(line=="Vypni LED 4" || line =="Vypni led 4" || line =="Vypni let 4" || line =="Vypni LED styri" || line =="Vypni LED4" || line=="Vypni led4"){
     digitalWrite(led4, LOW);
    }
    if(line=="Vypni"){
     
      digitalWrite(led1, LOW);
       digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
    }
     if(line=="Zapni"){
     
      digitalWrite(led1, HIGH);
       digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
    }
 


   
  Serial.println("==========");
  Serial.println("uzatvaram pripojenie");
}
PHP časť – web-serverová časť pozostáva z dvoch php súborov, css súboru a jedného obrázku.

index.php - -> zadávanie klávesnicou/hlasom - -> hlas sa aktivuje kliknutím na mikrofón na stránke, php kód v súbore spracuje požiadavku zadanú klávesnicou
ajax.php --> spracuje výsledok reči na text a vloží ho do .txt súboru rovnako ako php kód na index.php
Decibel.png – obrázok mikrofónu - Non copyright
stylesheet.css – CSS štýly pre index.php súbor – grafika
preklady.txt --> textový súbor, ktorý sa neustále prepisuje php súbormi, sťahuje ho mikroprocesor
Knižnice k .ino súboru pre NodeMCU: https://ulozto.sk/!RqkW7KJhe6XG/esp8266-https-%20http-rar
PHP súbory: https://ulozto.sk/!h20FDroE7wWx/ovladanie-hlasom-%20svetelektro-rar
Heslo: svetelektro.sk
Video z testu s jednou LED-kou na ukážku funkčnosti:
https://www.youtube.com/watch?v=FwcPEALti4Y
Odporúčania: Skryte si PHP časť za heslo, stránku neindexujte, je to dobré pre zaistenie integrity ovládania práve vami. Nezabudnite na HTTPS protokol a prehliadač Chrome! Ak si po požiadavke hlasom prezeráte .txt súbor a nie je v ňom zmena, stlačte Ctrl+F5! Riešenie je možné použiť pre dosky Arduino, Raspberry, Orange Pi a akékoľvek iné, ktoré je možné napojiť do internetu akoukoľvek technológiou, Ethernet, Wifi, GSM, GPRS, 3G, LTE. Akonáhle certifikát expiruje, alebo je obnovený s novým --> iným odtlačkom, NodeMCU sa nepripojí na stránku! Sledujte preto dátum expirácie vášho HTTPS certifikátu.

V PHP súboroch sa využívajú užitočné funkcie pre uľahčenie práce s reťazcami:
htmlspecialchars --> prevod špeciálnych znakov na bezpečné, chráni pred XSS – spusteniu javascriptov
trim --> Medzery orezané v reťazci napr „Ahoj ako? “ bude transformované na: „Ahoj ako?“
Podporiť ma môžete a nájsť zaujímavé projekty, ktoré som realizoval na: https://arduino.php5.sk

P.S. čoskoro plánujem zverejniť aj projekt inteligentnej domácnosti s ovládaním 8 výstupov so zdrojovými kódmi na platforme klienta NodeMCU
Cieľom článku bolo ukázať novú metódu vstupu, ktorú je možné ľahko integrovať aj do existujúcich projektov. Nejedná sa o profi riešenie!
Podporiť ma môžete na: https://arduino.php5.sk
Projekt na GitHube: https://github.com/martinius96/ovladanie-hlasom-nodemcu-arduino-raspberry-orangepi-php
Prajem veľa šťastia vo vašich interaktívnych projektoch!
4
Poptávka / Re:Vývoj pro Arduino - poptávka
« Poslední příspěvek od Hamisato kdy Září 15, 2017, 06:15:20 dopoledne »
I think your idea is very good.
5
Vědátorna / Re:binarne odstupnované LED a LCD displej
« Poslední příspěvek od Hamisato kdy Září 15, 2017, 06:14:58 dopoledne »
This information is very helpful to me.
6
Služby / Re:Naprogramujem Arduino/NodeMCU
« Poslední příspěvek od martinius96 kdy Září 03, 2017, 11:53:29 dopoledne »
Programujem nové veci, napríklad ovládanie hlasom pre NodeMCU a Arduino dosky!
7
Projekty / Re:Ovládanie floraria
« Poslední příspěvek od Martinko_radi kdy Srpen 29, 2017, 22:20:13 odpoledne »
Ano, je to možné... Použi Relé.
8
Bastlírna / Re:Řízení 12 V DC motorku.
« Poslední příspěvek od seta1J kdy Srpen 15, 2017, 14:57:36 odpoledne »
Ahoj,
uvažuji o podobném (také sekačku) ale až nebude do čeho píchnout.
Bezínovou, nějak odebrat proud pro napájení arduina, ev.pohon kol (asi kombinace-elektro a mechanika). Ale odměřování se mi zdá komplikované. Uvažuji cestu-majáky na koncíi dráhy (asi laser), který by sama po najetí posunula o šířku sekání a aby jela podle paprsku.Maják - paprsek vodorovně a vůči severu stále ve stejné poloze kompasem(takže rovnoběžně s předchozím sekáním).
9
Služby / Naprogramujem Arduino/NodeMCU
« Poslední příspěvek od martinius96 kdy Srpen 12, 2017, 23:49:28 odpoledne »
Naprogramujem Arduino/NodeMCU pre váš účel. Špecializujem sa na automatizácie domácností/akvárii, ovládanie relé z internetu, MQTT na BlueMix, Cayenne a iné služby, záznam teplôt a iných veličín, ukladanie do MySQL databáz, výpis na stránke, prepájanie Websystémov s Arduinom. Mám 3 ročné skúsenosti s Arduinom a ročné s NodeMCU. Ponúkam programovanie oboch tíchto platforiem. Teším sa na vašu objednávku.. Web: https://arduino.php5.sk
10
Vědátorna / binarne odstupnované LED a LCD displej
« Poslední příspěvek od nichicon kdy Srpen 01, 2017, 14:09:14 odpoledne »
Ahoj,
pomocou 2 tlačítok UP a DOWN riadim 8 kusov binarne odstupnovaných LED. To dáva 255 samostatných nastavení. Kedže orientovať sa dvoma tlačítkami v 255 krokoch je dosť potreboval by som doplniť LCD displej. Ako vyzerá môj program posielam nižšie. Hladal som ako sa pracuje s LCD a našiel som toto   https://www.arduino.cc/en/Tutorial/HelloWorld   vyzerá to skutočne jednoducho. Problém je že aj keby som tie programy vedel zlúčiť, ako ku každej nastavenej hodnote tých binarne odstupnovaných LED priradím nejake zobrazenie niečoho na LCD displeji? Potreboval by som pre celých 255 posúvaných tlačítkom UP a DOWN dopísať nejaku hodnotu na displej. Keby niekto vedel proadiť, bol by som rád. Každopadne som uplný začiatočník takže berte na to prosím ohlad. Ďakujem.

// constants won't change. They're used here to
// set pin numbers:
const int buttonPinUp = 13;     // tlacitko up
const int buttonPinDown = 11;     // tlacitko down
const int ledPin1 =  9;      // the number of the LED pin
const int ledPin2 =  10;      // the number of the LED pin
const int ledPin3 =  12;
const int ledPin4 =  8;
const int ledPin5 =  7;
const int ledPin6 =  6;
const int ledPin7 =  5;
const int ledPin8 =  4;

const int ochrana = 100;

// variables will change:
int buttonStateUp;             // the current reading from the input pin
int buttonStateDown;             // the current reading from the input pin
int lastButtonStateUp = LOW;   // the previous reading from the input pin
int lastButtonStateDown = LOW;   // the previous reading from the input pin
int stateLed = 1;        // stav - kolko lediek bude svietit
int maxLed = 255;        // stav - kolko lediek bude svietit
int _step = 0;


// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTimeUp = 0;  // the last time the output pin was toggled
long lastDebounceTimeDown = 0;  // the last time the output pin was toggled
long lastOchrana = 0;  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin1, OUTPUT); 
  pinMode(ledPin2, OUTPUT); 
  pinMode(ledPin3, OUTPUT);   
  pinMode(ledPin4, OUTPUT);   
  pinMode(ledPin5, OUTPUT);   
  pinMode(ledPin6, OUTPUT);   
  pinMode(ledPin7, OUTPUT);   
  pinMode(ledPin8, OUTPUT);   

  // initialize the pushbutton pin as an input:
  pinMode(buttonPinUp, INPUT);
  pinMode(buttonPinDown, INPUT);     
 
 
  int buttonState_1 = HIGH;
  int buttonState_2 = LOW;
 
}

void loop(){

  int readingUp = digitalRead(buttonPinUp);
  int readingDown = digitalRead(buttonPinDown);

// If the switch changed, due to noise or pressing:
  if (readingUp != lastButtonStateUp) {
    // reset the debouncing timer
    lastDebounceTimeUp = millis();
  }

 
  if (readingDown != lastButtonStateDown) {
    lastDebounceTimeDown = millis();
  }
 
 
 
  if ((millis() - lastDebounceTimeUp) > debounceDelay) {
    if(lastOchrana+ochrana < millis() && readingUp == HIGH && stateLed < maxLed){
      stateLed++;
      lastOchrana = millis();
    }
  }

  if ((millis() - lastDebounceTimeDown) > debounceDelay) {
    if(lastOchrana+ochrana < millis() && readingDown == HIGH && stateLed > 0){
      stateLed--;
      lastOchrana = millis();
    }
  }
 
  //Ledka 1:
  if(stateLed % 2 == 1){
    digitalWrite(ledPin1, HIGH);
  }else{
    digitalWrite(ledPin1, LOW);
  }

  //Ledka 2:
  if((stateLed / 2) % 2 == 1){
    digitalWrite(ledPin2, HIGH);
  }else{
    digitalWrite(ledPin2, LOW);
  }

  //Ledka 3:
  if(((stateLed / 2) / 2) % 2 == 1){
    digitalWrite(ledPin3, HIGH);
  }else{
    digitalWrite(ledPin3, LOW);
  }

  //Ledka 4:
  if((((stateLed / 2) / 2) / 2) % 2 == 1){
    digitalWrite(ledPin4, HIGH);
  }else{
    digitalWrite(ledPin4, LOW);
  }

  //Ledka 5:
  if(((((stateLed / 2) / 2) / 2) / 2) % 2 == 1){
    digitalWrite(ledPin5, HIGH);
  }else{
    digitalWrite(ledPin5, LOW);
  }

  //Ledka 6:
  if((((((stateLed / 2) / 2) / 2) / 2) / 2) % 2 == 1){
    digitalWrite(ledPin6, HIGH);
  }else{
    digitalWrite(ledPin6, LOW);
  }

  //Ledka 7:
  if(((((((stateLed / 2) / 2) / 2) / 2) / 2) / 2) % 2 == 1){
    digitalWrite(ledPin7, HIGH);
  }else{
    digitalWrite(ledPin7, LOW);
  }

  //Ledka 8:
  if((((((((stateLed / 2) / 2) / 2) / 2) / 2) / 2) / 2) % 2 == 1){
    digitalWrite(ledPin8, HIGH);
  }else{
    digitalWrite(ledPin8, LOW);
  }



  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonStateUp = readingUp;
  lastButtonStateDown = readingDown;
 

}
Stran: [1] 2 3 ... 10