<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>server - Hard Wired</title>
	<atom:link href="https://www.hardwired.dev/tag/server/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.hardwired.dev</link>
	<description></description>
	<lastBuildDate>Sun, 05 Feb 2023 14:04:43 +0000</lastBuildDate>
	<language>cs</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://www.hardwired.dev/wp-content/uploads/2022/10/android-chrome-256x256-1-150x150.png</url>
	<title>server - Hard Wired</title>
	<link>https://www.hardwired.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ESP32 Bluetooth Server &#8211; Rozšíření</title>
		<link>https://www.hardwired.dev/2023/02/05/esp32-bluetooth-server-2/</link>
		
		<dc:creator><![CDATA[John Doe]]></dc:creator>
		<pubDate>Sun, 05 Feb 2023 14:02:16 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[IOT]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[ble]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[platformio]]></category>
		<category><![CDATA[server]]></category>
		<guid isPermaLink="false">https://www.hardwired.dev/?p=975</guid>

					<description><![CDATA[<p>Rozšíření článku ESP32 Bluetooth Server. Kód vytváří UART BLE server na ESP32 vývojové desce. Bluetooth server se jde připojit pomocí &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2023/02/05/esp32-bluetooth-server-2/">ESP32 Bluetooth Server – Rozšíření</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><p>Rozšíření článku <a href="https://www.hardwired.dev/esp32-bluetooth-server/">ESP32 Bluetooth Server</a>. Kód vytváří <a href="https://cs.wikipedia.org/wiki/UART">UART</a> <a href="https://cs.wikipedia.org/wiki/Bluetooth">BLE</a> server na <a href="https://www.espressif.com/en/products/socs/esp32">ESP32</a> vývojové desce. Bluetooth server se jde připojit pomocí programu <a href="https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal">Serial Bluetooth Terminal</a> na telefonu se systémem Android, nebo ekvivalentním na iOS.</p>
<p>Bluetooth server reaguje na dva příkazy.</p>
<ul>
<li><code>get</code></li>
<li><code>set &lt;payload&gt;</code></li>
</ul>
<p>Příkazem <code>set</code> se do dočasné paměti ukládá textová hodnota <code>payload</code>. Pokud vše proběhne v pořádku, server vrátí do konzole uloženou zprávu.</p>
<p>Příkazem <code>get</code> získáme ze serveru uloženou zprávu. Po poslání uložené zprávy klientovi se zpráva ze serveru smaže.</p>
<pre><code class="language-cpp">/**
 * @file main.cpp
 * @author Hard Wired
 * @brief Bluetooth server reagující na příkazy.
 * @version 0.1
 * @date 2023-02-01
 * @details Umožňuje připojení telefonu přes Bluetooth terminal aplikaci a
 *          pomocí příkazu &quot;set &lt;text&gt;&quot; uložit textový řetězec do paměti
 *          Bluetooth serveru. Při úspěšném uložení pošle server zprávu
 *          zpět do konzole na telefonu jako potvrzení. Zpráva v takovém
 *          případě zůstává uložena v paměti serveru.
 *
 *          Při opětovném připojení a zadání příkazu &quot;get&quot; server pošle zpět do
 *          Bluetooth konzole na telefonu uloženou zprávu. Tuto zprávu
 *          následně smaže.
 */

#include &lt;Arduino.h&gt;

// Bluetooth knihovny
#include &lt;BLE2902.h&gt;
#include &lt;BLEDevice.h&gt;
#include &lt;BLEServer.h&gt;
#include &lt;BLEUtils.h&gt;

// inicializace modulu z knihovny
BLECharacteristic *pCharacteristic;

const String COMMAND_GET = &quot;get&quot;;
const String COMMAND_SET = &quot;set&quot;;

/**
 * @brief Definuje zda li je klient aktualne pripojeny
 *
 */
bool deviceConnected = false;

/**
 * @brief Flag definující akci odeslat
 *
 */
bool send = false;

/**
 * @brief Flag definující ponechat zprávu uloženou i po odeslání
 *
 */
bool keepMessage = false;

/**
 * @brief Obsahuje zprávu kterou klient pošle serveru
 *
 */
std::string receivedMessage;

/**
 * @brief Zpráva, která se bude odesílat klientovi
 *
 */
String out = &quot;Lorem ipsum&quot;;

#define SERVICE_UUID &quot;6E400001-B5A3-F393-E0A9-E50E24DCCA9E&quot;
#define CHARACTERISTIC_UUID_RX &quot;6E400002-B5A3-F393-E0A9-E50E24DCCA9E&quot;
#define CHARACTERISTIC_UUID_TX &quot;6E400003-B5A3-F393-E0A9-E50E24DCCA9E&quot;

/**
 * @brief Převede std::string na String objekt.
 *
 * @param message
 * @return String
 */
String convertMessageToString(std::string message)
{
    return String(message.c_str());
}

String normalizeMessage(String message)
{
    message.trim();
    message.toLowerCase();

    return message;
}

/**
 * @brief Zpracovává a ukládá zprávu pro odeslání.
 *
 * @param message
 */
void setOutputMessage(String message)
{
    message.trim();

    out = message;
}

/**
 * @brief Maže zprávu pro odeslání
 *
 */
void clearOutputMessage() { out = &quot;&quot;; }

/**
 * @brief Vrací `payload` příkazu typu `[command] &lt;payload&gt;`.
 *
 * @param str
 * @return String
 */
String getCommandPayload(String str, int spacePosition)
{
    return str.substring(spacePosition + 1, str.length());
}

/**
 * @brief Hledá první mezeru v řetězci. Když nenajde, vraci délku řetězce + 1.
 *
 * @param str
 * @return int
 */
int findCommandPositionIndex(String str)
{
    int spacePosition = 0;
    int length = str.length();

    for (int i = 0; i &lt; length; i++)
    {
        spacePosition = i;

        if (str[i] == &#039; &#039;)
        {
            return spacePosition;
        }
    }

    return spacePosition + 1;
}

/**
 * @brief Nastaví odchozí zprávu na základě přijatého příkazu SET.
 *
 * @param message
 */
void commandSet(String payload)
{
    keepMessage = true;
    send = true;

    setOutputMessage(payload);
}

/**
 * @brief Nastavi odeslání zprávy klientovi a její následné smazání.
 *
 */
void commandGet()
{
    keepMessage = false;
    send = true;
}

/**
 * @brief Zpracování příkazu zaslaného klientem.
 *
 * @param message
 */
void processCommand(std::string message)
{
    /*
     * Převedení std::string zprávy na String.
     */
    String stringMessage = convertMessageToString(message);

    /*
     * Odstranění mezer na začátku a konci řetězce. Převedení na malá písmena.
     */
    String normalizedMessage = normalizeMessage(stringMessage);

    /*
     * Vyhledá kde v řetězci končí příkaz. Hledá první mezeru :).
     */
    int commandPositionIndex = findCommandPositionIndex(normalizedMessage);

    String command = normalizedMessage.substring(0, commandPositionIndex);

    if (command == COMMAND_GET)
    {
        commandGet();
    }
    else if (command == COMMAND_SET)
    {
        String payload = getCommandPayload(stringMessage, commandPositionIndex);
        commandSet(payload);
    }
}

/**
 * @brief Odešle zprávu přes Bluetooth.
 *
 */
void sendMessage()
{
    /*
     * Úprava pro výstup do terminálové aplikace.
     */
    String txMessage = out + &quot;\n&quot;;
    int txMessageLength = txMessage.length() + 1;

    char message[txMessageLength];

    txMessage.toCharArray(message, txMessageLength);

    pCharacteristic-&gt;setValue(message);

    pCharacteristic-&gt;notify();
}

/**
 * @brief Vytiskne přijatou zprávu do sériové konzole.
 *
 * @param receivedMessage
 */
void printReceivedMessage(std::string receivedMessage)
{
    Serial.print(&quot;Prijata zprava: &quot;);

    for (int i = 0; i &lt; receivedMessage.length(); i++)
    {
        Serial.print(receivedMessage[i]);
    }

    Serial.println();
}

/**
 * @brief Connect, disconnect callbacks
 *
 */
class MyServerCallbacks : public BLEServerCallbacks
{
    void onConnect(BLEServer *pServer) { deviceConnected = true; };

    void onDisconnect(BLEServer *pServer)
    {
        deviceConnected = false;
        pServer-&gt;getAdvertising()-&gt;start();
    }
};

/**
 * @brief Callback zpracovávající příchozí zprávy
 *
 */
class MyCallbacks : public BLECharacteristicCallbacks
{
    void onWrite(BLECharacteristic *pCharacteristic)
    {
        receivedMessage = pCharacteristic-&gt;getValue();

        if (receivedMessage.length() &gt; 0)
        {
            printReceivedMessage(receivedMessage);
            processCommand(receivedMessage);
        }
    }
};

void setup()
{
    Serial.begin(115200);

    BLEDevice::init(&quot;ESP32 BLE SERVER&quot;);

    BLEServer *pServer = BLEDevice::createServer();
    pServer-&gt;setCallbacks(new MyServerCallbacks());

    BLEService *pService = pServer-&gt;createService(SERVICE_UUID);

    pCharacteristic = pService-&gt;createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY);
    pCharacteristic-&gt;addDescriptor(new BLE2902());

    BLECharacteristic *pCharacteristic = pService-&gt;createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE);
    pCharacteristic-&gt;setCallbacks(new MyCallbacks());

    pService-&gt;start();

    pServer-&gt;getAdvertising()-&gt;start();

    Serial.println(&quot;BLE nastaveno, ceka na pripojeni..&quot;);
}

void loop()
{
    if (deviceConnected == true &amp;&amp; out.length() &gt; 0 &amp;&amp; send == true)
    {
        sendMessage();
        delay(100);

        if (keepMessage == false)
        {
            clearOutputMessage();
        }

        send = false;
        keepMessage = false;
    }

    delay(1000);
}</code></pre>
<pre><code class="language-ini">; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200</code></pre>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2023%2F02%2F05%2Fesp32-bluetooth-server-2%2F&#038;via=hessevalentino" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2023/02/05/esp32-bluetooth-server-2/">ESP32 Bluetooth Server – Rozšíření</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ESP32 Bluetooth Server</title>
		<link>https://www.hardwired.dev/2023/02/01/esp32-bluetooth-server/</link>
		
		<dc:creator><![CDATA[John Doe]]></dc:creator>
		<pubDate>Wed, 01 Feb 2023 03:28:54 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[IOT]]></category>
		<category><![CDATA[Různé]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ble]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[platformio]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[vscode]]></category>
		<guid isPermaLink="false">https://www.hardwired.dev/?p=938</guid>

					<description><![CDATA[<p>Dneska se podíváme jak zprovoznit Bluetooth na ESP32. Cílem je umožnit telefonu připojit se na naše Bluetooth zařízení a odpovídat &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2023/02/01/esp32-bluetooth-server/">ESP32 Bluetooth Server</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><p>Dneska se podíváme jak zprovoznit Bluetooth na ESP32. Cílem je umožnit telefonu připojit se na naše Bluetooth zařízení a odpovídat na specifické zprávy. Jako vývojové prostředí použijeme <a href="https://platformio.org/">PlatformIO</a>.</p>
<h1>ESP32</h1>
<p>Pro projekt použijeme <a href="https://www.aliexpress.com/item/32996458212.html">ESP32 Development Board</a> z Aliexpressu. V době psaní článku stojí zhruba 120CZK.</p>
<p><img decoding="async" src="https://www.hardwired.dev/wp-content/uploads/2023/02/esp32-aliexpress.jpg" alt="" /></p>
<h1>platformio.ini</h1>
<p>Konfigurační soubor pro projekt.</p>
<pre><code class="language-ini">[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200</code></pre>
<h1>main.cpp</h1>
<p>Jako základ kódu jsem použil výborný článek <a href="https://navody.dratek.cz/navody-k-produktum/esp32-a-bluetooth-low-energy-ble.html">ESP32 a Bluetooth Low Energy (BLE)</a> z <a href="https://navody.dratek.cz/">Drátek Návody</a> a provedl úpravy pro potřeby projektu. Pro zjednodušení nejprve celý kód projektu. Rozbor bude pokračovat.</p>
<pre><code class="language-c++">#include &lt;Arduino.h&gt;

// Bluetooth knihovny
#include &lt;BLEDevice.h&gt;
#include &lt;BLEServer.h&gt;
#include &lt;BLEUtils.h&gt;
#include &lt;BLE2902.h&gt;

// inicializace modulu z knihovny
BLECharacteristic *pCharacteristic;

// proměnná pro kontrolu připojených zařízení
bool deviceConnected = false;

// proměnná pro ukládání přijaté zprávy
std::string receivedMessage;

// proměnná pro zprávu pro odeslání
String out = &quot;&quot;;

// definice unikátních ID pro různé služby,
// pro vlastní UUID využijte generátor
// https://www.uuidgenerator.net/
#define SERVICE_UUID &quot;6E400001-B5A3-F393-E0A9-E50E24DCCA9E&quot;
#define CHARACTERISTIC_UUID_RX &quot;6E400002-B5A3-F393-E0A9-E50E24DCCA9E&quot;
#define CHARACTERISTIC_UUID_TX &quot;6E400003-B5A3-F393-E0A9-E50E24DCCA9E&quot;

int compareCommand(std::string message, String command)
{
    String converted = String(message.c_str());
    converted.trim();
    converted.toLowerCase();

    return converted == command;
}

void setOutputMessage(String message)
{
    out = message;
    out += &quot;\n&quot;;
}

void clearOutputMessage()
{
    out = &quot;&quot;;
}

void sendMessage()
{
    char message[out.length() + 1];
    out.toCharArray(message, out.length() + 1);

    // přepsání zprávy do BLE služby
    pCharacteristic-&gt;setValue(message);

    // odeslání zprávy skrze BLE do připojeného zařízení
    pCharacteristic-&gt;notify();
}

// třída pro kontrolu připojení
class MyServerCallbacks : public BLEServerCallbacks
{
    // při spojení zařízení nastav proměnnou na log1
    void onConnect(BLEServer *pServer)
    {
        deviceConnected = true;
    };
    // při odpojení zařízení nastav proměnnou na log0
    void onDisconnect(BLEServer *pServer)
    {
        deviceConnected = false;
        pServer-&gt;getAdvertising()-&gt;start();
    }
};

// třída pro příjem zprávy
class MyCallbacks : public BLECharacteristicCallbacks
{
    // při příjmu zprávy proveď následující
    void onWrite(BLECharacteristic *pCharacteristic)
    {
        // načti přijatou zprávu do proměnné
        receivedMessage = pCharacteristic-&gt;getValue();

        // pokud není zpráva prázdná, vypiš její obsah
        // po znacích po sériové lince
        // a pokud přijde očekávaný příkaz pošli odpověď
        if (receivedMessage.length() &gt; 0)
        {
            Serial.print(&quot;Prijata zprava: &quot;);
            for (int i = 0; i &lt; receivedMessage.length(); i++)
            {
                Serial.print(receivedMessage[i]);
            }
            Serial.println();

            if (compareCommand(receivedMessage, &quot;ahoj&quot;))
            {
                setOutputMessage(&quot;No nazdar&quot;);
            }
        }
    }
};

void setup()
{
    // zahájení komunikace po sériové lince
    // rychlostí 115200 baud
    Serial.begin(115200);

    // inicializace Bluetooth s nastavením jména zařízení
    BLEDevice::init(&quot;ESP32 BLE&quot;);

    // vytvoření BLE serveru
    BLEServer *pServer = BLEDevice::createServer();
    pServer-&gt;setCallbacks(new MyServerCallbacks());

    // vytvoření BLE služby
    BLEService *pService = pServer-&gt;createService(SERVICE_UUID);

    // vytvoření BLE komunikačního kanálu pro odesílání (TX)
    pCharacteristic = pService-&gt;createCharacteristic(
        CHARACTERISTIC_UUID_TX,
        BLECharacteristic::PROPERTY_NOTIFY);
    pCharacteristic-&gt;addDescriptor(new BLE2902());

    // vytvoření BLE komunikačního kanálu pro příjem (RX)
    BLECharacteristic *pCharacteristic = pService-&gt;createCharacteristic(
        CHARACTERISTIC_UUID_RX,
        BLECharacteristic::PROPERTY_WRITE);
    pCharacteristic-&gt;setCallbacks(new MyCallbacks());

    // zahájení BLE služby
    pService-&gt;start();

    // zapnutí viditelnosti BLE
    pServer-&gt;getAdvertising()-&gt;start();
    Serial.println(&quot;BLE nastaveno, ceka na pripojeni..&quot;);
}

void loop()
{
    if (deviceConnected == true &amp;&amp; out.length() &gt; 0)
    {
        sendMessage();
        delay(100);
        clearOutputMessage();
    }

    // pauza před novým během smyčky
    delay(1000);
}</code></pre>
<h1>Rozbor kódu</h1>
<pre><code class="language-cpp">#include &lt;Arduino.h&gt;

// Bluetooth knihovny
#include &lt;BLEDevice.h&gt;
#include &lt;BLEServer.h&gt;
#include &lt;BLEUtils.h&gt;
#include &lt;BLE2902.h&gt;</code></pre>
<p>Knihovny potřebné pro obsluhu Bluetooth.</p>
<pre><code class="language-cpp">BLECharacteristic *pCharacteristic;</code></pre>
<p>Inicializace modulu knihovny pro práci s Bluetooth.</p>
<pre><code class="language-cpp">bool deviceConnected = false;</code></pre>
<p>Indikace, že je zařízení připojeno k našemu Bluetooth zařízení.</p>
<pre><code class="language-cpp">std::string receivedMessage;</code></pre>
<p>Proměnná pro uložení zprávy, kterou pošleme našemu Bluetooth zařízení.</p>
<pre><code class="language-cpp">String out = &quot;&quot;;</code></pre>
<p>Proměnná pro uložení odchozí zprávy.</p>
<pre><code class="language-cpp">#define SERVICE_UUID &quot;6E400001-B5A3-F393-E0A9-E50E24DCCA9E&quot;
#define CHARACTERISTIC_UUID_RX &quot;6E400002-B5A3-F393-E0A9-E50E24DCCA9E&quot;
#define CHARACTERISTIC_UUID_TX &quot;6E400003-B5A3-F393-E0A9-E50E24DCCA9E&quot;</code></pre>
<p>Bluetooth se skládá z jednotlivých služeb pro které je mít potřeba vygenerované unikátní identifikátory.</p>
<pre><code class="language-cpp">int compareCommand(std::string message, String command)
{
    String converted = String(message.c_str());
    converted.trim();
    converted.toLowerCase();

    return converted == command;
}</code></pre>
<p>Naše Bluetooth zařízení se chová jako server. Pokud mu pošlete zprávu/příkaz, který rozpozná, tak odpoví zpět. Příchozí zpráva se ukládá do proměnné typu <code>std::string</code>. Zprávu je potřeba očistit od bílých znaků, normalizovat (převést na malá písmena <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ) a porovnat s příkazem, který chceme provést. Tady byl lehce zádrhel, protože vhodné metody obsahuje zase <code>String</code> objekt. Céčko/C++ jsem provozoval naposledy na vysoké pro školní projekty a už tam jsem většinu věcí řešil v Pythonu. Jsem už prostě zmlsaný moderními programovacími jazyky. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Mé řešení asi nebude nejefektivnější, ale je lehce čitelné a funguje.</p>
<p>TLDR: <code>compareCommand</code> vezme příchozí zprávu, očistí od bordelu, porovná s námi zadaným příkazem a vrátí hodnotu porovnání.</p>
<pre><code class="language-cpp">void setOutputMessage(String message)
{
    out = message;
    out += &quot;\n&quot;;
}</code></pre>
<p>Pomocná funkce pro nastavení odchozí zprávy.</p>
<pre><code class="language-cpp">void clearOutputMessage()
{
    out = &quot;&quot;;
}</code></pre>
<p>Pomocná funkce pro vyčistění proměnné po odeslání zprávy.</p>
<pre><code class="language-cpp">void sendMessage()
{
    char message[out.length() + 1];
    out.toCharArray(message, out.length() + 1);

    pCharacteristic-&gt;setValue(message);

    pCharacteristic-&gt;notify();
}</code></pre>
<p>Funkce zapouzdřující odeslání zprávy. Převede zprávu na pole znaků, předá Bluetooth knihovně a pomocí metody <code>notify</code> odešle na připojené zařízení.</p>
<pre><code class="language-cpp">class MyServerCallbacks : public BLEServerCallbacks
{
    void onConnect(BLEServer *pServer)
    {
        zarizeniPripojeno = true;
    };

    void onDisconnect(BLEServer *pServer)
    {
        zarizeniPripojeno = false;
        pServer-&gt;getAdvertising()-&gt;start();
    }
};</code></pre>
<blockquote>
<p>Během testů se objevil problém s opětovným připojením. Když se telefon odpojil od Bluetooth serveru, nešlo se znovu připojit. Pomohl jen restart ESPčka. Dle různých zdrojů za to můžou různé verze knihoven. Pokud přidáme při odpojení zařízení <code>pServer-&gt;getAdvertising()-&gt;start();</code>, který začne propagovat náš Bluetooth server do prostoru, opětovné připojení funguje.</p>
</blockquote>
<p>Třída zapouzdřující <code>callbacky</code> pro náš Bluetooth server. Pokud se zařízení připojí/odpojí nastaví proměnnou <code>deviceConnected</code>.</p>
<pre><code class="language-cpp">class MyCallbacks : public BLECharacteristicCallbacks
{
    void onWrite(BLECharacteristic *pCharacteristic)
    {
        receivedMessage = pCharacteristic-&gt;getValue();

        if (receivedMessage.length() &gt; 0)
        {
            Serial.print(&quot;Prijata zprava: &quot;);
            for (int i = 0; i &lt; receivedMessage.length(); i++)
            {
                Serial.print(receivedMessage[i]);
            }
            Serial.println();

            if (compareCommand(receivedMessage, &quot;ahoj&quot;))
            {
                setOutputMessage(&quot;No nazdar&quot;);
            }
        }
    }
};</code></pre>
<p>Třída zapouzdřující <code>callback</code> pro příjem zprávy. Při příchozí zprávě nenulové délky se jako první vypíše do sériové konzole. Následně proběhne porovnání jestli obsahuje, pro nás známý, příkaz. V našem případě <code>ahoj</code>. Pokud ano, tak odpoví <code>No nazdar</code>.</p>
<h2>setup()</h2>
<pre><code class="language-cpp">Serial.begin(115200);</code></pre>
<p>Nastavení rychlostí komunikace přes sériovou linku. Musí být stejné jako v <code>platformio.ini</code>.</p>
<pre><code class="language-cpp">BLEDevice::init(&quot;ESP32 BLE&quot;);</code></pre>
<p>Inicializace Bluetooth s nastavením jména, na které se bude dát z telefonu připojit.</p>
<pre><code class="language-cpp">BLEServer *pServer = BLEDevice::createServer();
pServer-&gt;setCallbacks(new MyServerCallbacks());</code></pre>
<p>Vytvoření Bluetooth serveru. Nastavíme <code>callbacky</code> pro detekci připojení/odpojení zařízení pomocí třídy nadefinované výše.</p>
<pre><code class="language-cpp">BLEService *pService = pServer-&gt;createService(SERVICE_UUID);</code></pre>
<p>Vytvoření Bluetooth služby.</p>
<pre><code class="language-cpp">pCharacteristic = pService-&gt;createCharacteristic(
        CHARACTERISTIC_UUID_TX,
        BLECharacteristic::PROPERTY_NOTIFY);
pCharacteristic-&gt;addDescriptor(new BLE2902());</code></pre>
<p>Vytvoření komunikačního kanálu pro odesílání zpráv.</p>
<pre><code class="language-cpp">BLECharacteristic *pCharacteristic = pService-&gt;createCharacteristic(
        CHARACTERISTIC_UUID_RX,
        BLECharacteristic::PROPERTY_WRITE);
pCharacteristic-&gt;setCallbacks(new MyCallbacks());</code></pre>
<p>Vytvoření kanálu pro příjem zpráv. Nastavujeme <code>callback</code> pro příjem nadefinovaný výše.</p>
<pre><code class="language-cpp">pService-&gt;start();</code></pre>
<p>Nastartování Bluetooth služby.</p>
<pre><code class="language-cpp">pServer-&gt;getAdvertising()-&gt;start();
Serial.println(&quot;BLE nastaveno, ceka na pripojeni..&quot;);</code></pre>
<p>Zviditelnění pro ostatní zařízení.</p>
<h2>loop()</h2>
<pre><code class="language-cpp">if (deviceConnected == true &amp;&amp; out.length() &gt; 0)
{
    sendMessage();
    delay(100);
    clearOutputMessage();
}

delay(1000);</code></pre>
<p><code>Loop</code> smyčka každou sekundu zkontroluje jestli je zařízení připojené k našemu Bluetooth serveru a jestli existuje zpráva co by šla odeslat. Pokud jsou obě podmínky splněny odešleme zprávu a vyčistíme data.</p>
<h2>TLDR</h2>
<p>Bluetooth server čeká na zp rávy. Pokud přijde zpráva, která obsahuje známy příkaz, nastaví se příslušné proměnné. Smyčka <code>loop</code> každou sekundu zkontroluje jestli jsou příslušné proměnné pro odchozí zprávu a pokud ano odešle zprávu na připojené zařízení. No raketová věda to teda není. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h1>Serial Bluetooth Terminal</h1>
<p>Kód je zkompilovaný, nahraný na ESP32 a běží. Teď je potřeba začít s naším Bluetooth zařízením komunikovat. Pro Android jde použít výbornou aplikaci <a href="https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&amp;hl=cs&amp;gl=US">Serial Bluetooth Terminal</a>. Umí to co potřebujeme. Připojit se k zařízení, posílat a obdržet zprávy.</p>
<p>Po instalaci se v obrazovce <code>Devices</code> přepněte do tabu <code>Bluetooth LE</code> a naskenujte zařízení. Objeví se naše ESPčko. Kliknutím na něj se připojíte.</p>
<p><img decoding="async" src="https://www.hardwired.dev/wp-content/uploads/2023/02/ble-terminal-01.jpg" alt="" /></p>
<p>Pokud připojení proběhne v pořádku zobrazí se následující.</p>
<p><img decoding="async" src="https://www.hardwired.dev/wp-content/uploads/2023/02/ble-terminal-02.jpg" alt="" /></p>
<p>Po odeslání zprávy <code>ahoj</code> dostaneme odpověď.</p>
<p><img decoding="async" src="https://www.hardwired.dev/wp-content/uploads/2023/02/ble-terminal-03.jpg" alt="" /></p>
<h1>Závěr</h1>
<p>Prezentovaný kód je takové minimum, bez hlubší znalosti Bluetooth a jeho vnitřního fungování, které ověřuje koncept ESP32 jako Bluetooth serveru odpovídajícího na příkazy.</p>
<p>Happy coding.</p>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2023%2F02%2F01%2Fesp32-bluetooth-server%2F&#038;via=hessevalentino" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2023/02/01/esp32-bluetooth-server/">ESP32 Bluetooth Server</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Radxa radxa radxa</title>
		<link>https://www.hardwired.dev/2022/09/07/radxa-radxa-radxa/</link>
		
		<dc:creator><![CDATA[Valentino Hesse OK2HSS]]></dc:creator>
		<pubDate>Wed, 07 Sep 2022 16:40:28 +0000</pubDate>
				<category><![CDATA[IOT]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Raspberry]]></category>
		<category><![CDATA[Různé]]></category>
		<category><![CDATA[iot]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[radxa]]></category>
		<category><![CDATA[server]]></category>
		<guid isPermaLink="false">https://hessevalentino.cz/?p=230</guid>

					<description><![CDATA[<p>Všem nám dávno došlo že na Raspberry Pi si ještě nějaký pátek počkáme. Když se budeme poohlížet po nějakých alternativách &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2022/09/07/radxa-radxa-radxa/">Radxa radxa radxa</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><p>Všem nám dávno došlo že na Raspberry Pi si ještě nějaký pátek počkáme. Když se budeme poohlížet po nějakých alternativách tak nám opět rychle dojde, že je pozdě protože prostě už jsou vyprodané anebo prodávané za nesmyl, popřípadě totálně nevyhovující. V tomto okamžiku se dostává ke slovu společnost <a href="https://wiki.radxa.com/Home">RADXA.</a></p>
<p>Vypadá to jako by se jednalo o klon Raspberry a dost možná že i je ale, a to opravdu ALE jejich produkty nejsou jen laciné klony, jak se můžeme setkat třeba se šmejdem co se tvoří jako Arduino a vlastně nestojí za nic. RADXA desky jsou velice kvalitně vyvedeny a do posledního detailu promyšleny. Jedná se teda o klon myšlenky, a ne produktu samotného. Jedna z mála nevýhod je komunita. RPI má obrovskou komunitu a opravdu propracovaný OS což u Rock Pi (radxa) bohužel zatím nenajdete. Ale nemusíme zoufat, protože na konci tohohle tunelu je světlo.</p>
<p>&nbsp;</p>
<h2><strong>Co Radxa nabízí?</strong></h2>
<p>V jejich nabídce je poměrně široká škála SBC a my si zde zkusíme všechny vyjmenovat.</p>
<p>&nbsp;</p>
<h3><strong>Radxa Zero</strong></h3>
<p><img decoding="async" class="size-medium wp-image-251 alignleft" src="http://wordpress.hardwired.dev/wp-content/uploads/2022/09/Zero-800px-300x140.png" alt="" width="300" height="140" srcset="https://www.hardwired.dev/wp-content/uploads/2022/09/Zero-800px-300x140.png 300w, https://www.hardwired.dev/wp-content/uploads/2022/09/Zero-800px-768x359.png 768w, https://www.hardwired.dev/wp-content/uploads/2022/09/Zero-800px.png 800w" sizes="(max-width: 300px) 100vw, 300px" />Radxa Zero je ultratenký SBC v malém provedení s vysokým výkonem založeným na Amlogic S905Y2. Může provozovat Android a vybrané distribuce Linuxu. Radxa Zero obsahuje čtyřjádrový 64bitový procesor ARM, až 4 GB 32bitové paměti LPDDR4, výstup HDMI na 4K@60, připojení Wifi a Bluetooth, USB 3.0 a 40pinový GPIO header. Kromě toho lze napájecí port použít také pro USB 2.0 OTG pro připojení dalších periferií. Radxa Zero se dodává v několika konfiguracích, aby vyhovoval vašim potřebám.</p>
<p><strong><a href="https://wiki.radxa.com/Zero" target="_blank" rel="noopener">Kompletní specifikace, návody a informace naleznete na webu výrobce.</a></strong></p>
<p>&nbsp;</p>
<h3><strong>Rock 3</strong></h3>
<p><img fetchpriority="high" decoding="async" class="size-medium wp-image-249 alignleft" src="http://wordpress.hardwired.dev/wp-content/uploads/2022/09/ROCK_3A-1-300x205.png" alt="" width="300" height="205" srcset="https://www.hardwired.dev/wp-content/uploads/2022/09/ROCK_3A-1-300x205.png 300w, https://www.hardwired.dev/wp-content/uploads/2022/09/ROCK_3A-1-1024x698.png 1024w, https://www.hardwired.dev/wp-content/uploads/2022/09/ROCK_3A-1-768x524.png 768w, https://www.hardwired.dev/wp-content/uploads/2022/09/ROCK_3A-1.png 1079w" sizes="(max-width: 300px) 100vw, 300px" />ROCK3 je řada Rockchip RK3566/RK3568 založených na SBC (jednodeskový počítač) a výpočetním modulu od Radxa. Může na ní běžet android nebo některé distribuce Linuxu. Řada ROCK3 obsahuje čtyřjádrový procesor Cortex-A55 ARM, 32bit 3200 Mb/s LPDDR4, až 4K@60 HDMI, MIPI DSI, MIPI CSI, 3,5 mm jack s mikrofonem, USB port, GbE LAN, PCIe 3.0, PCIe 2.0, 40 -pin rozšiřující header, RTC. ROCK3 také podporuje USB PD a QC napájení.</p>
<p><strong><a href="https://wiki.radxa.com/Rock3" target="_blank" rel="noopener">Kompletní specifikace, návody a informace naleznete na webu výrobce.</a></strong></p>
<p>&nbsp;</p>
<h3><strong>Rock Pi 4</strong></h3>
<p><img decoding="async" class="size-medium wp-image-236 alignleft" src="http://wordpress.hardwired.dev/wp-content/uploads/2022/09/Rockpi_4B_v13_breadboard_front-300x200.png" alt="" width="300" height="200" srcset="https://www.hardwired.dev/wp-content/uploads/2022/09/Rockpi_4B_v13_breadboard_front-300x200.png 300w, https://www.hardwired.dev/wp-content/uploads/2022/09/Rockpi_4B_v13_breadboard_front-1024x684.png 1024w, https://www.hardwired.dev/wp-content/uploads/2022/09/Rockpi_4B_v13_breadboard_front-768x513.png 768w, https://www.hardwired.dev/wp-content/uploads/2022/09/Rockpi_4B_v13_breadboard_front-1536x1025.png 1536w, https://www.hardwired.dev/wp-content/uploads/2022/09/Rockpi_4B_v13_breadboard_front.png 1600w" sizes="(max-width: 300px) 100vw, 300px" />ROCK Pi 4 je SBC založený na <a href="https://wiki.radxa.com/Special:SpecialContact/">Rockchip RK3399</a> . Může na ní běžet android nebo některé distribuce Linuxu. ROCK Pi 4 obsahuje šestijádrový procesor ARM, 64bitový dvoukanálový 3200Mb/s LPDDR4, až 4K@60 HDMI, MIPI DSI, MIPI CSI, 3,5mm jack s mikrofonem, 802.11 ac WIFI, Bluetooth 5.0, USB port, GbE LAN, 40 pin header, RTC. ROCK Pi 4 také podporuje USB PD a QC napájení. ROCK Pi 4 je k dispozici ve dvou modelech, Model A a Model B, každý model má možnosti 1GB, 2GB nebo 4GB RAM.</p>
<p><strong><a href="https://wiki.radxa.com/Rockpi4" target="_blank" rel="noopener">Kompletní specifikace, návody a informace naleznete na webu výrobce.</a></strong></p>
<p>&nbsp;</p>
<h3><strong>Rock Pi S</strong></h3>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-253 alignleft" src="http://wordpress.hardwired.dev/wp-content/uploads/2022/09/800px-Rockpi_s_yellow_1200px-300x273.png" alt="" width="300" height="273" srcset="https://www.hardwired.dev/wp-content/uploads/2022/09/800px-Rockpi_s_yellow_1200px-300x273.png 300w, https://www.hardwired.dev/wp-content/uploads/2022/09/800px-Rockpi_s_yellow_1200px-768x698.png 768w, https://www.hardwired.dev/wp-content/uploads/2022/09/800px-Rockpi_s_yellow_1200px.png 800w" sizes="auto, (max-width: 300px) 100vw, 300px" />ROCK Pi S je mini SBC založený na Rockchip RK3308. Je vybaven 64bitovým čtyřjádrovým procesorem, USB, ethernetem, bezdrátovým připojením a jádrem detekce hlasu o velikosti 1,7 palce, takže je ideální pro IoT a hlasové aplikace. ROCK Pi S se dodává ve dvou velikostech paměti RAM 256 MB nebo 512 MB DDR3 a pro operační systém a úložiště používá kartu uSD. Volitelně může ROCK Pi S poskytnout verzi s integrovaným úložištěm s 1Gb/2Gb/4Gb/8Gb <a href="https://wiki.radxa.com/RockpiS/hardware/SDNAND">NAND flash</a>.</p>
<p><strong><a href="https://wiki.radxa.com/RockpiS" target="_blank" rel="noopener">Kompletní specifikace, návody a informace naleznete na webu výrobce.</a></strong></p>
<p>&nbsp;</p>
<h3><strong><br />
Rock Pi E</strong></h3>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-254 alignleft" src="http://wordpress.hardwired.dev/wp-content/uploads/2022/09/1000px-ROCKPI_E_Text-300x242.png" alt="" width="300" height="242" srcset="https://www.hardwired.dev/wp-content/uploads/2022/09/1000px-ROCKPI_E_Text-300x242.png 300w, https://www.hardwired.dev/wp-content/uploads/2022/09/1000px-ROCKPI_E_Text-768x619.png 768w, https://www.hardwired.dev/wp-content/uploads/2022/09/1000px-ROCKPI_E_Text.png 1000w" sizes="auto, (max-width: 300px) 100vw, 300px" />ROCK Pi E založený na Rockchip RK3328. Je vybaven 64bitovým čtyřjádrovým procesorem, USB 3.0, dvěma ethernety, bezdrátovým připojením o velikosti 2,5 x 2,2 palce (56 x 65 mm), díky čemuž je ideální pro IoT a síťové aplikace. ROCK Pi E je k dispozici v různých velikostech paměti RAM od 512 MB do 4 GB DDR3 a používá kartu microSD pro operační systém a úložiště a také podporuje modul eMMC. Volitelně ROCK Pi E podporuje PoE, je vyžadován další HAT.</p>
<p><strong><a href="https://wiki.radxa.com/RockpiE" target="_blank" rel="noopener">Kompletní specifikace, návody a informace naleznete na webu výrobce.</a></strong></p>
<p>&nbsp;</p>
<h3><strong>Rock Pi X</strong></h3>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-255 alignleft" src="http://wordpress.hardwired.dev/wp-content/uploads/2022/09/1000px-Rockpi_X-300x203.png" alt="" width="300" height="203" srcset="https://www.hardwired.dev/wp-content/uploads/2022/09/1000px-Rockpi_X-300x203.png 300w, https://www.hardwired.dev/wp-content/uploads/2022/09/1000px-Rockpi_X-768x519.png 768w, https://www.hardwired.dev/wp-content/uploads/2022/09/1000px-Rockpi_X.png 1000w" sizes="auto, (max-width: 300px) 100vw, 300px" />ROCK Pi X je první X86 SBC. Může provozovat distribuce Windows a Linux. Projekt ROCK Pi X byl spuštěn poté, co tým Radxa dostal spoustu dotazů od uživatelů, zda <a href="https://wiki.radxa.com/Rockpi4">ROCK Pi 4</a> může provozovat Windows.</p>
<p>ROCK Pi X je vybaven čtyřjádrovým procesorem Intel Cherry Trail Z8350, 64bitový dvoukanálový 1866Mb/s LPDDR3, až 4K@30 HDMI, 3,5mm jack s mikrofonem, 802.11 ac WIFI, Bluetooth 4.2, USB port, GbE LAN, 40-pin header, RTC. ROCK Pi X také podporuje USB PD a QC napájení. ROCK Pi X je k dispozici ve dvou modelech, Model A a Model B, každý model má možnosti 1GB, 2GB nebo 4GB RAM.</p>
<p><strong><a href="https://wiki.radxa.com/RockpiX" target="_blank" rel="noopener">Kompletní specifikace, návody a informace naleznete na webu výrobce.</a></strong></p>
<p>&nbsp;</p>
<h3><strong>Rock Pi N10</strong></h3>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-256 alignleft" src="http://wordpress.hardwired.dev/wp-content/uploads/2022/09/ROCKPi_N10-300x300.png" alt="" width="300" height="300" srcset="https://www.hardwired.dev/wp-content/uploads/2022/09/ROCKPi_N10-300x300.png 300w, https://www.hardwired.dev/wp-content/uploads/2022/09/ROCKPi_N10-150x150.png 150w, https://www.hardwired.dev/wp-content/uploads/2022/09/ROCKPi_N10-768x768.png 768w, https://www.hardwired.dev/wp-content/uploads/2022/09/ROCKPi_N10-400x400.png 400w, https://www.hardwired.dev/wp-content/uploads/2022/09/ROCKPi_N10.png 800w" sizes="auto, (max-width: 300px) 100vw, 300px" />ROCK Pi N10 je SBC (jednodeskový počítač) od společnosti Radxa založený na Rockchip RK3399pro. Jedná se o NPU, AI desku, která slouží pro vývoj strojového učení. RK3399Pro je nízkoenergetický, vysoce výkonný procesor.</p>
<p>Je založeno na architektuře Big.Little a integruje dvoujádrový Cortex-A72 a čtyřjádrový Cortex-A53 se samostatným NEON koprocesorem. Je vybaven jednou výkonnou jednotkou pro zpracování neuronové sítě (NPU) a podporuje mainstream platformy na trhu, jako je caffe, tensor flow a tak dále.</p>
<p>Poskytuje optimalizovaný výkon pro high-end aplikace. RK3399Pro podporuje více formátové video dekodéry a kodéry. Díky integrovanému 3D GPU je RK3399Pro plně kompatibilní s OpenGL ES1.1/2.0/3.0/3.1, OpenCL a DirectX 11.1. Speciální 2D hardwarový engine s MMU maximalizuje zobrazení a poskytují velmi hladký provoz.</p>
<p><strong><a href="https://wiki.radxa.com/RockpiN10" target="_blank" rel="noopener">Kompletní specifikace, návody a informace naleznete na webu výrobce.</a></strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2022%2F09%2F07%2Fradxa-radxa-radxa%2F&#038;via=hessevalentino&#038;related=hessevalentino%3AValentino%20Hesse%20OK2HSS" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2022/09/07/radxa-radxa-radxa/">Radxa radxa radxa</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Automatické ovládání ventilátoru Raspberry</title>
		<link>https://www.hardwired.dev/2022/06/10/automaticke-ovladani-ventilatoru-raspberry/</link>
		
		<dc:creator><![CDATA[Valentino Hesse OK2HSS]]></dc:creator>
		<pubDate>Fri, 10 Jun 2022 13:09:48 +0000</pubDate>
				<category><![CDATA[Raspberry]]></category>
		<category><![CDATA[Raspberry web server]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rpi]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[ventilátor]]></category>
		<guid isPermaLink="false">https://hessevalentino.cz/?p=104</guid>

					<description><![CDATA[<p>Dnes se podíváme na automatické zapínání ventilátoru který nám bude chladit naše Raspberry pouze v případě že CPU dosáhne určité &#62;&#62;&#62;</p>
<p>The post <a href="https://www.hardwired.dev/2022/06/10/automaticke-ovladani-ventilatoru-raspberry/">Automatické ovládání ventilátoru Raspberry</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div><section class="g-s column ui grid">
<div class="stretched five wide computer sixteen wide mobile five wide tablet column g-s__sidebar">
<p>Dnes se podíváme na automatické zapínání ventilátoru který nám bude chladit naše Raspberry pouze v případě že CPU dosáhne určité nastavené teploty.</p>
<h3 class="g-s__sidebar-content g-s__sidebar-content--sticky">Zapojení</h3>
<div></div>
</div>
</section>
<section class="g-s column ui grid">
<div class="eleven wide computer sixteen wide mobile eleven wide tablet column">
<div class="ui one column grid">
<figure class="g-s__image column">
<div class="g-s__image-trigger">
<div class="lz "><img loading="lazy" decoding="async" class="ui image g-s__image-img" src="https://howchoo.com/media/ot/mx/ot/raspberry-pi-fan-controller-schematic.png?width=900&amp;auto=webp&amp;quality=70" sizes="auto, (max-width: 200px) 200px, (max-width: 360px) 360px,(max-width: 414px) 414px, (max-width: 768px) 768px,(max-width: 900px) 900px, (max-width: 1272px) 1272px, 900px" srcset="https://howchoo.com/media/ot/mx/ot/raspberry-pi-fan-controller-schematic.png?width=200&amp;auto=webp&amp;quality=70 200w, https://howchoo.com/media/ot/mx/ot/raspberry-pi-fan-controller-schematic.png?width=360&amp;auto=webp&amp;quality=70 360w, https://howchoo.com/media/ot/mx/ot/raspberry-pi-fan-controller-schematic.png?width=414&amp;auto=webp&amp;quality=70 414w, https://howchoo.com/media/ot/mx/ot/raspberry-pi-fan-controller-schematic.png?width=768&amp;auto=webp&amp;quality=70 768w, https://howchoo.com/media/ot/mx/ot/raspberry-pi-fan-controller-schematic.png?width=900&amp;auto=webp&amp;quality=70 900w, https://howchoo.com/media/ot/mx/ot/raspberry-pi-fan-controller-schematic.png?width=1440&amp;auto=webp&amp;quality=70 1272w" alt="Schéma ovladače ventilátoru Raspberry Pi" width="414" height="322" /></div>
</div>
</figure>
<div class="g-s__content column ">
<p><span class="">Budeme potřebovat: 5V ventilátor (představovaný velkým stejnosměrným motorem na obrázku), odpor 680Ω a tranzistor NPN (2N2222).</span></p>
<h2>Zapojení tranzistoru</h2>
<p>Tranzistor je zajímavá elektrická součástka sloužící ke spínání nebo zesilování výkonu. V našem případě jej používáme jako přepínač. Existuje mnoho typů tranzistorů, ale my používáme tranzistor NPN. <span class="">Takže „základní“ kolík tranzistoru je připojen k BCM 17 (vývod GPIO) s odporem 680Ω mezi nimi. </span>Kladný vodič na ventilátoru je připojen k 5V kolíku a zem je připojena ke kolíku "kolektoru" v našem tranzistoru. Nakonec je "emitor" tranzistoru spojen se zemí.</p>
<p><span class="">Takže když je pin 17 přepnut na HIGH, pošle nějaké napětí do báze tranzistoru, což uzavře obvod a zapne ventilátor.</span></p>
</div>
</div>
</div>
</section>
<section class="g-s column ui grid">
<div class="eleven wide computer sixteen wide mobile eleven wide tablet column">
<div class="ui one column grid">
<div class="g-s__header column">
<h2 id="use-the-install-script" class="ui huge header header--no-margin">Použijte instalační skript</h2>
</div>
<div class="g-s__content column ">
<p><strong>Howchoo</strong> vytvořil skript pro ventilátor a publikoval jej do veřejného repozitáře Howchoo s názvem pi-fan-controller .</p>
<p>Nejjednodušší způsob, jak nainstalovat skripty ovladače ventilátoru, je použití jeho instalačního skriptu.</p>
<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="shell" name="mshighlighter" >git clone https://github.com/Howchoo/pi-fan-controller.git</textarea></pre>
</div>
<p><em><span class="">Pokud ještě nemáte nainstalovaný git, budete muset nejprve nainstalovat git pomocí</span></em></p>
<div class="my-syntax-highlighter">
<pre><textarea id="mshighlighter" class="mshighlighter" language="shell" name="mshighlighter" >sudo apt-get install git</textarea></pre>
</div>
<p>Nainstaluje se tento skript <code>fancontrol.py</code>, který sleduje teplotu jádra a řídí ventilátor. Také přidá skript volaný <code>fancontrol.sh</code>a <code>/etc/init.d</code>nakonfiguruje skript tak, aby se spouštěl při spuštění systému.</p>
<p>Ve skriptu ktery naleznete v <strong>usr/local/bin/</strong> uvidíte tyto hodnoty:</p>
<p class=" language-python"><code class=" language-python">ON_THRESHOLD <span class="token operator">=</span> <span class="token number">65</span> </code></p>
<p class=" language-python"><code class=" language-python">OFF_THRESHOLD <span class="token operator">=</span> <span class="token number">55</span><br />
</code></p>
<p class=" language-python"><code class=" language-python">SLEEP_INTERVAL <span class="token operator">=</span> <span class="token number">5</span><br />
</code></p>
<p class=" language-python"><code class=" language-python">GPIO_PIN <span class="token operator">=</span> <span class="token number">17</span> </code></p>
<p>Které můžete upravit na vaše vlastní hodnoty ve kterých si přejete aby se ventilátor spustil a ve kterých se má deaktivovat.</p>
</div>
</div>
</div>
</section>

<div class="twitter-share"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.hardwired.dev%2F2022%2F06%2F10%2Fautomaticke-ovladani-ventilatoru-raspberry%2F&#038;via=hessevalentino&#038;related=hessevalentino%3AValentino%20Hesse%20OK2HSS" class="twitter-share-button">Tweet</a></div><p>The post <a href="https://www.hardwired.dev/2022/06/10/automaticke-ovladani-ventilatoru-raspberry/">Automatické ovládání ventilátoru Raspberry</a> first appeared on <a href="https://www.hardwired.dev">Hard Wired</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
