<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهدی نامقی</title>
        <link>https://virgool.io/feed/@mnameghi</link>
        <description>علاقه‌مند به کشف و ابداع. کمی تا قسمتی برنامه نویس</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:40:40</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/3545/avatar/WqZ298.png?height=120&amp;width=120</url>
            <title>مهدی نامقی</title>
            <link>https://virgool.io/@mnameghi</link>
        </image>

                    <item>
                <title>نامه‌نگاری در اینترنت اشیا</title>
                <link>https://virgool.io/@mnameghi/%D9%86%D8%A7%D9%85%D9%87-%D9%86%DA%AF%D8%A7%D8%B1%DB%8C-%D8%AF%D8%B1-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A7%D8%B4%DB%8C%D8%A7-gf3ndeoepfmy</link>
                <description>اینترنت اشیا به تنهایی کاربردی برای ما ندارد اگر نتوانیم دیتایی رد و بدل کنیم.  این مطلب درباره یکی از پروتکل‌های تبادل دیتا صحبت میکند که بیشتر به درد این شی‌های اینترنت دار میخوره. میدونم از آخرین مطلبم خیلی وقته گذشته ولی خب چه کنم دست و دلم به نوشتن نبود.اینترنت اشیا یعنی همون چیزهایی که دور و برمون هست رو به اینترنت وصل کنیم. مثل لامپ، تلویزیون، ماشین لباسشویی و...وصل شدن ماشین لباسشویی به تنهایی به اینترنت نه دردی از اون دوا میکنه نه از ما! یعنی صرف اینکه به اینترنت وصل بشه کافی نیست و در این بستر باید پیامی رد و بدل بشه تا خاصیتی داشته باشه. برای همین رد و بدل کردن پیام امری اجتناب ناپذیر از زمان کفتر کاکل به سر تا کنون بوده و هست.حال برای این خبر که از ما ببره و بیاره راه‌های گوناگونی وجود داره. حتما کلمه پروتکل رو شنیدید. مثلا پروتکل HTTP. جناب HTTP اومده یه سری استاندارد و ادا و اصول تعریف کرده که شما میخای تو اینترنت یه چیزی رو ببینی، طی مراحل اداری خاصی اون چیز از جایی در اینترنت به سیستم شما فرستاده میشه و شما اونو خواهید دید. اینجا کاری به اون ادا و اصول نداریم و قصد نداریم درباره‌اش صحبت کنیم. بریم سراغ اشیا خودمون.این اشیا بدبخت مثل سیستم‌های خفن شما که نیستند. معمولا سخت افزار ضعیف یا اینترنت ناپایداری دارند. تصور کنید دوربینی در جایی دور افتاده به زور اونم با اینترنت داغون ما! میخاد یه تصویر بفرسته. برای همین نمیشه همون راهی که برای یک PC استفاده می‌کنیم برای اونم به کار ببریم. نه که نشه! میشه ولی خب اینکه درست کار کنه و پایدار باشه با خداست.پروتکل MQTT که مخفف Message Queuing Telemetry Transport است در سال ۱۹۹۹ برای استفاده در صنعت نفت و گاز و اینا اختراع شد. هدفش هم این بود که با کمترین پهنای باند و کمترین مصرف باتری و این چیزا بتونن وضعیت خطوط لوله رو مانیتور کنند. بعدا این پروتکل تغییراتی کرد که فراتر از این چهار کلمه شد ولی این MQTT روش موند. این پروتکل سه بخش اصلی داره:کارگزار یا دلال یا هر ترجمه‌ای که دوست دارین از کلمه Brokerمشترک یا  (Subscriber)ناشر (Publisher)ناشر یه پیامی داره که میده به کفتر کاکل به سر های های! و میگه این خبر از من ببر های های! پیام باید موضوع (Topic) داشته باشه. این پیام میاد دست broker. جناب broker بر مبنای موضوع خبر، اون رو به دست کلاینت می‌رسونه. نکته مهم اینجاس که کلاینت باید بگه که من منتظر چه خبری هستم. برای همین باید موضوع رو بدونه و گوش به زنگ روی اون موضوع منتظر بمونه تا اگه خبری اومد broker بهش برسونه. این ارتباطی که توضیح دادم یک به یک نیست. یعنی اینکه هر تعداد کلاینت می‌تونند گوش بزنگ روی یک موضوع بمونند. حال شما می‌تونید تعیین کنید که پیام رو اونی که زودتر گرفت برداره یا همه اون پیام رو بردارند.برای اینکه مطلب کامل جا بیفته بیاید یه مثال عملی براتون بزنم. فرض کنید یک سنسور دما داریم که در جایی نصب شده و قراره دیتای اون رو به صورت متناوب دریافت کنیم. برای اینکه این مطلب طولانی نشه درباره سنسور دما و ماژول WiFi اینجا توضیح نمیدم می‌تونید از اینجا مفصل درباره‌اش بخونید. (حتما بخونید و گرنه ادامه بحث رو متوجه نخواهید شد)خب با توجه به لینک بالا یک برنامه نوشتم. این قسمت از برنامه ما مقدار دما رو از سنسور دریافت می‌کنه:sensors.requestTemperatures(); 
float temperatureC = sensors.getTempCByIndex(0);حالا می‌خواهیم مقدار دما رو با پروتکل MQTT ارسال کنیم. اول از همه باید کتابخونه‌اش رو به ادیتور آردوینو اضافه کنید. من از این کتابخونه استفاده کردم. اگه نمیدونید کتابخونه چجوری اضافه میشه اینجا رو ببینید. سپس در کد یه instance از کتابخونه ایجاد می‌کنیم. برای ایجاد این instance نیاز به WiFiClient داریم:WiFiClient espClient; 
PubSubClient client(espClient); خب حالا باید به یک broker وصل بشیم. اگر بروکر ندارین و یک سرور لینوکسی دارین می‌تونید روی سرورتون ستاپ کنید. وگرنه از بروکرهای رایگان که در اینترنت موجوده استفاده کنید. من در اینجا به یکی از این بروکرها وصل میشم:client.setServer(&amp;quotbroker.emqx.io&amp;quot, &amp;quot1883&amp;quot);حالا باید به سرور وصل بشیم:while (!client.connected()) {
    String client_id = &amp;quotesp8266-client-&amp;quot
    client_id += String(WiFi.macAddress());
    Serial.printf(&amp;quotThe client %s connects to the public mqtt broker\n&amp;quot, client_id.c_str());
    if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
    } else {
        Serial.print(&amp;quotfailed with state &amp;quot);
        Serial.print(client.state());
        delay(2000);
    }
}و بلاخره می‌تونیم پیام مون ارسال کنیم. client.publish(topic, temperatureC);کد کامل شده رو در ادامه براتون می‌ذارم. می‌دونم این نوشته کامل نیست و ممکنه ابهاماتی داشته باشه، برای همین راحت باشید و هر سوالی داشتید در قسمت کامنت‌ها بپرسید.#include &lt;ESP8266WiFi.h&gt;
#include &lt;PubSubClient.h&gt;
#include &lt;OneWire.h&gt;
#include &lt;DallasTemperature.h&gt;

// WiFi
const char *ssid = &amp;quotSSID&amp;quot // Enter your WiFi name
const char *password = &amp;quotPASSWORD&amp;quot  // Enter WiFi password

// MQTT Broker
const char *mqtt_broker = &amp;quotbroker.emqx.io&amp;quot
const char *topic = &amp;quotesp8266/test&amp;quot
const char *mqtt_username = &amp;quotemqx&amp;quot
const char *mqtt_password = &amp;quotpublic&amp;quot
const int mqtt_port = 1883;

// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;     
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&amp;oneWire);

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  // Set software serial baud to 115200;
  Serial.begin(115200);
  // connecting to a WiFi network
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.println(&amp;quotConnecting to WiFi..&amp;quot);
  }
  Serial.println(&amp;quotConnected to the WiFi network&amp;quot);
  //connecting to a mqtt broker
  client.setServer(mqtt_broker, mqtt_port);
  client.setCallback(callback);
  while (!client.connected()) {
      String client_id = &amp;quotesp8266-client-&amp;quot
      client_id += String(WiFi.macAddress());
      Serial.printf(&amp;quotThe client %s connects to the public mqtt broker\n&amp;quot, client_id.c_str());
      if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
          Serial.println(&amp;quotPublic emqx mqtt broker connected&amp;quot);
      } else {
          Serial.print(&amp;quotfailed with state &amp;quot);
          Serial.print(client.state());
          delay(2000);
      }
  }
  // Start the DS18B20 sensor
  sensors.begin();
}

void loop() {
  client.loop();
  sensors.requestTemperatures(); 
  float temperatureC = sensors.getTempCByIndex(0);
  Serial.print(temperatureC);
  Serial.println(&amp;quotºC&amp;quot);
  client.publish(topic, temperatureC);
  delay(1000);
}</description>
                <category>مهدی نامقی</category>
                <author>مهدی نامقی</author>
                <pubDate>Wed, 29 Mar 2023 09:11:14 +0330</pubDate>
            </item>
                    <item>
                <title>آردوینو به زبان خیلی ساده (۲)</title>
                <link>https://virgool.io/@mnameghi/%D8%A2%D8%B1%D8%AF%D9%88%DB%8C%D9%86%D9%88-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%AE%DB%8C%D9%84%DB%8C-%D8%B3%D8%A7%D8%AF%D9%87-%DB%B2-bqj7548qzhuq</link>
                <description>تو مطلب قبلی براتون از آردوینو گفتم که چی هست و از کجا پیداش شد. برای اینکه با آردوینو کار کنید باید زبونش رو بفهمید تا بتونید باهاش صحبت کنید. چون قراره خیلی ساده بگم یه کم از برنامه نویسی براتون میگم تا بیشتر آشنا بشید.هر زبان برنامه نویسی یه سری قواعد داره و یه سری دستورات فانکشن‌های از پیش تعریف شده. زبان برنامه نویسی آردوینو C هستش. برای نوشتن برنامه و کامپایل اون به Arduino IDE نیاز دارین که می‌تونید اون رو از اینجا دانلود کنید. بعد از نصب و باز کردن IDE با چنین صحنه‌ای مواجه خواهید شد.Ardunio IDEوقتی کامپیوتر شخصی‌تان رو روشن می‌کنید یه سری اتفاقات اون پشت می‌افته. مثلا شناسایی هارد دیسک چک کردن سالم بودن سخت افزار‌ها مثل رم و ... بعد از این جریانات سیستم عامل بالا میاد و شما شروع به کار می‌کنید. بورد آردوینو هم تقریبا این شکلی است. اگر به کد دقت کنید می‌بینید که دو بلاک (block) اصلی دارد. به قسمت‌هایی که توسط کروشه {} مشخص می‌شود بلاک می‌گویند. بلاک setup مربوط به اتفاقاتی است که هنگام بالا اومدن (boot) بورد رخ می‌دهد و بلاک loop تا زمانی که برق قطع نشود یا بورد ریست نشود به طور مداوم اجرا می‌شود.قواعد و سینتکس زبان C رو می‌تونید از اینجا ببینید. چنتا پیش پا افتاده شو میگم براتون که کارتون راه بیفته. اول اینکه آخر هر خط باید سمی کالن (;) باشه. چند مدل متغیر در C داریم که باید به تناسب برنامه از اونها استفاده کنید. مثلا برای مقادیر عددی int, float, double ... و برای مقادیری مانند متن و اینا char, String. تو مطلب قبلی براتون گفتم که یک بورد آردوینو چند پورت IO داره. این پورتها می‌تونند ورودی یا خروجی باشن.  قبول کنید که آردوینو علم غیب نداره که بفهمه ما کدوم پورت رو به عنوان ورودی استفاده کردیم یا خروجی! پس تو قسمت setup باید براش بگیم که قصد داریم با پورت‌هاش چیکار کنیم. به این کد دقت کنید:void setup {
    pinMode(7, OUTPUT);              
    pinMode(8, INPUT_PULLUP);
    pinMode(5, INPUT);
}در این کد پورت ۷ به عنوان خروجی و پورت ۸ و ۵ به عنوان ورودی مشخص شده‌اند. فرق input با input_pullup خیلی ساده است. وقتی پایه‌ای به صورت input مشخص شود شما باید چک کنید مقدار آن ۱ یا صفر است. یعنی اگه به این پایه +5V وصل کنید مقدارش ۱ یا HIGH میشه و اگه صفر ولت یا همون GND وصل کنید مقدارش صفر یا LOW میشه. در input_pullup پایه با یک مقاومت داخلی میکروکنترلر به +5V وصل میشه. بنابرین اگه شما یک کلید سر راه اون پایه بذارین و اون سر دیگه کلید رو به GND وصل کنید با فشردن کلید پایه LOW میشه و فقط در کد نیاز دارین که چک کنید آیا این پایه LOW شده یا نه و اگر شده بود اون کاری که لازمه رو انجام بدین.میخایم مداری که در مطلب قبل نشون دادم رو پروگرام کنیم. همونطور که در عکس می‌بینید یک led به پایه ۷ وصل شده.void setup {
    pinMode(7, OUTPUT);
}
void loop {
    digitalWrite(7,HIGH);
    delay(1000);
    digitalWrite(7,LOW);
    delay(1000);
}یک کد ساده برای این مدار نوشتم. در این کد از digitalWrite استفاده کردم. این دستور به آردوینو میگه که اون پایه‌ای که مشخص کردیم خروجیش صفر باشه یا ۱ (HIGH و LOW کار صفر و یک رو انجام میدن، یعنی هم میتونید عدد ۰ و ۱ رو بذارین هم از این دو کلمه استفاده کنید). بعد از دستور delay استفاده کردم که باعث میشه اجرای دستورات ما به اندازه زمانی که مشخص کردیم وقفه بیفته. این زمان بر حسب میلی ثانیه است که هر ۱۰۰۰ میلی ثانیه میشه یک ثانیه. پس یک ثانیه led روشن می‌مونه و میرسه به دستور بعدی که مقدار پایه رو LOW کرده پس led خاموش میشه و تا یک ثانیه خاموش می‌مونه. چون این کد رو در قسمت loop نوشتیم تا بینهایت تکرار میشه و led چشمک می‌زنه.  دقت کنید که در قسمت setup تکلیف خودمو با پایه روشن کردم که باید OUTPUT باشه. اگه این کار رو نکنید led روشن نخواهد شد.کد ما آماده است. الان باید آردوینو رو با کابل USB به سیستم‌تون وصل کنید. از منوی Tools &gt; Board مطابق شکل زیر Ardunio/Generic UNO رو انتخاب کنید.دوباره از منوی Tools &gt; Port باید پورتی که توسط آن کامپیوتر شما آردوینو رو شناخته انتخاب کنید. این پورت معمولا COM3 یا بالاتر است. (COM1 و COM2 توسط سیستم رزرو شده) اگر در منوی پورت چیزی نمی‌بینید کابل usb رو قطع کنید و مجدد وصل کنید. دقت کنید اسم این پورتها در لینوکس فرق داره و برای پروگرام کردن باید دسترسی‌هایی به اون پورت بدهید برای اطلاعات بیشتر اینجا رو بخونید.همه چی آماده است. دکمه پروگرام رو بزنید تا آردوینو پروگرام شود. بعد از آن خواهید دید که led برایتان چشمک میزند. </description>
                <category>مهدی نامقی</category>
                <author>مهدی نامقی</author>
                <pubDate>Mon, 08 Jun 2020 15:39:15 +0430</pubDate>
            </item>
                    <item>
                <title>آردوینو به زبان خیلی ساده (۱)</title>
                <link>https://virgool.io/@mnameghi/ardunio-as-simple-as-possible-g5qqe8clfn5f</link>
                <description>چند وقت پیش یک برق‌کار آوردم خونه تا مقداری کارهای سیم کشی رو انجام بده. بعد اینکه شیرین کاری‌های من رو روی کلیدهای برق خونه دید خیلی مشتاق شد که از این کارها انجام بده و گفت براش به طور خلاصه این چیزها رو توضیح بدم. الان با وجود آردوینو و سایر بوردهای وابسته ساختن یک دستگاه هوشمند خیلی سخت نیست و لازم نیست از امحا و احشام میکروکنترولر و فیوز بیت و این چیزها سر در بیارین. تو این نوشته سعی میکنم به ساده‌ترین روش ممکن مفاهیم اولیه کار با آردوینو رو توضیح بدم.اگه یادتون بیاد دستگاه‌های قدیمی مثل الان پیچیده نبودند. مثلا ماشین‌های لباسشویی سطلی قدیمی اوج تکنولوژی که داشتند یه کلید تایمردار مکانیکی بود که یک فنر داشت و با چرخوندنش تیک تیک صدا میکرد و در زمان خاص ماشین رو خاموش می‌کرد. امروزه همه ماشین‌های لباسشویی حداقل چندین مدل برنامه شستشو دارند. مدیریت اینهمه پیچیده‌گی کار یک کلید مکانیکی تایمردار نیست و نیاز به یک برنامه هوشمند داره. به طبع انتظار ندارین که به هر ماشین لباسشویی یک کیس یا لپ تاپ وصل کنند :) اینجاس که تراشه‌های هوشمند وارد صحنه می‌شوند. (مقداری آهنگ هیجانی)میکروکنترلرها تراشه‌های کوچک و جمع و جور و گوگولی مگولی هستند که همه چیزهای لازم برای ساختن یک وسیله هوشمند را در خودشان دارند. مهمترین مزیت آنها اینه که زبون حالیشون میشه! (البته نه زبون آدمیزاد) یعنی میتونید از قبل بهش بگید چیکار کنه. مثلا می‌تونید بهش بگید برای لباسهای ضخیم موتور رو با دور آهسته بچرخونه یا برای ملافه‌ها اینجوری موتور بچرخه که چروک نشوند.ساختن و راه‌اندازی یک مدار ساده با میکروکنترلر کار ساده‌ای نیست و علاوه بر ساختن سخت افزار باید تنظیمات و نحوه پروگرام کردن و کلی چیز میز دیگه رو بدونید. یک شرکتی در یه گوشه‌ای از ایتالیا دید حل این پیچیدگی‌ها برای یه دانش‌آموز کار راحتی نیست، برای همین بوردهایی ساخت که به آردوینو معروف شدند. تمامی آنچه برای راه‌اندازی یک میکروکنترلر نیاز دارین توی این بوردها هست (اعم از پروگرامر و نوسان ساز و...) برای همین شما درگیر ساخت سخت افزار نمی‌شید و تنها با کمی دونستن برنامه نویسی می‌تونید اونها رو پروگرام کرده و استفاده کنید.جزئیات بورد Ardunio UNOعکس بالا دل و روده یکی از بوردهای Ardunio معروف به UNO رو نشون میده. قسمتی که با رنگ سبز مشخص شده ورودی و خروجی‌های دیجیتال هستند. هر کدام از این پین‌ها یک شماره دارند که در برنامه نویسی با این شماره به آنها مراجعه میکنیم. این پین‌ها دو وضعیت دارند: صفر و یک. بله همین صفر و یکی که متخصصین کامپیوتر اینهمه باهاش پز میدن!بذارین اینو با یک مثال روشن کنم. این شکل رو ببینید:اینجا یک led رو با یک مقاومت به پین شماره 7 وصل کردم. خروجی پین‌ها در حالت 1 حدودا 3 ولت و در حالت 0 صفر ولت هست. پس یه مقاومت لازمه که led سالم بمونه. این پایه 7 اینجا در نقش کلید عمل می‌کنه یعنی گوش به فرمان ما هست (البته گوش به فرمان کد ما) و با یه اشاره ما می‌تونه led رو روشن یا خاموش کنه.تو این عکس از یک پین دیگه هم استفاده کردم. یک کلید رو به پین 9 وصل کردم. اینجا پین به جای اینکه خروجی باشه برعکسه به عنوان ورودی عمل می‌کنه. یعنی به گوش به فرمان دست ماست و با فشرده شدن کلید مقدارش عوض می‌شه و ما توی کد اینو میفهمیم و بر اساس این رویداد یه کاری انجام میدیم.حتما با خودتون میگید که ساختن همچین چیزی دیگه آردینو و این قرتی بازیا لازم نداره! بله کاملا درسته. هدف من این بود که با پایه‌های ورودی و خروجی دیجیتال آشنا بشید. به این پایه‌ها به اختصار IO هم می‌گن. اینم بگم که این اتفاقات باید همراه با کد نویسی باشه. یعنی بدون نوشتن کد این وسیله تره هم برای شما خورد نمیکنه چه برسه به روشن و خاموش کردن led.چون این مطلب کمی طولانی شد کد نویسی رو میذارم در مطلب بعدی توضیح میدم. اگر جایی بد توضیح دادم یا چیزی جا اتفاده تو کامنت‌ها بگید تا بیشتر توضیح بدم و از شما یاد بگیرم.</description>
                <category>مهدی نامقی</category>
                <author>مهدی نامقی</author>
                <pubDate>Fri, 05 Jun 2020 18:08:06 +0430</pubDate>
            </item>
                    <item>
                <title>نقشه‌ها چطور ساخته می‌شن</title>
                <link>https://neshan.blog/نقشهها-چطور-ساخته-میشوند-he8c6kdhkbf9</link>
                <description>خیلی‌ها از من درباره نقشه نشان پرسیدن که چطور ساخته. میخام طی چند مطلب درباره نحوه ساخت و کارکردش براتون بنویسم، تو این متن سعی به صورت خلاصه و تیتروار کمی داستان رو براتون باز کنم، در ادامه همراهم باشید.قبل از فراگیر شدن کامپیوترها و دیوایس های الکترونیکی نقشه‌ها روی کاغذ چاپ می‌شدن. این نقشه‌ها از نظر جزئیات و میزان اطلاعات آن‌ها محدودیت داشتند. با آمدن کامپیوترها نقشه‌های جدیدی پیدا شدن که امکان نمایش اطلاعات بیشتری رو دارن، چون محدودیت کاغذ در آنها وجود نداره. این نقشه‌ها قابلیت زوم و نمایش اطلاعات متعددی رو دارن و میشه جزئیات آنها رو ویرایش کرد یا به دلخواه عوض‌شون کرد.برای نمایش عوارض ابتدا آن‌ها را به چیزهای ساده‌ای مثل نقطه، خط یا یک محیط بسته (polygon) تبدیل می‌کنیم تا تصویر کردن آن‌ها روی یک صفحه راحت‌تر باشه. مثلا یک درخت رو میشه نقطه در نظر گرفت یا خیابان رو یک خط حساب کرد. حال این اطلاعات (Geospatial Data) که نشان دهنده موقعیت یا محدوده مکان خاصی هستند را می‌تونیم به سادگی به صورت دیجیتال ذخیره کنیم. از ارتباط این اطلاعات مکانی و سایر اطلاعاتی که از آن مکان داریم (مثل اسم، تلفن و سایر دیتاهای اون مکان) نقشه های GIS ساخته می‌شن.اطلاعات مکانی بدون رنگ و لعاب مثل html بدون css می‌مونن! یعنی این خط و نقطه‌ها باید رنگ و شکل خاصی داشته باشن تا هم بشه عوارض رو از هم تشخیص داد و هم نقشه زیبا و قابل فهم باشه. این رنگ و لعاب می‌تونه شامل رنگ بندی خطوط و نواحی و لیبل گذاری عوارض دلخواه باشه. خروجی چنین فرایندی رو می‌شه به صورت یک عکس دید.همانطور که در این عکس می‌بینید جزئیاتی مثل کوچه‌ها و... دیده نمی‌شن. طبیعیه که نمایش تمام این جزئیات در عکسی با این ابعاد امکان پذیر نیست. برای همین باید عکس بزرگتری داشته باشیم تا بتونیم همه این جزئیات رو نشون بدیم. ساختن چنین عکسی زمان زیادی می‌بره و خروجی کار بسیار حجیم و سنگین خواهد شد. ممکنه نتیجه کار یک عکس با چند گیگ حجم بشه! به نظرتون سیستم یه کاربر عادی می‌تونه همچین عکسی رو باز کنه؟ تازه اگر این موضوع روی بستر وب انجام بشه مساله پیچیده‌تر خواهد بود. چون محدودیت‌های سرعت و پهنای باند اجازه باز شدن عکس‌های بزرگ و حجیم را به شما نخواهد داد.برای نمایش چنین عکس‌های بزرگی اون‌ها رو به عکسهای کوچکی می‌شکونیم و این تکه‌ها را به صورت موزاییک (tile) کنار هم قرار می‌دیم. بنابراین بسته به محدوده‌ای که مشغول مشاهده آن هستید تکه عکس‌های (تایل‌های) همان محدوده به شما نمایش داده خواهد شد. با این روش شما پهنای باند کمتری مصرف می‌کنید و نقشه سریعتر و روان‌تر باز خواهد شد. هر چه عکس بزرگتر بشه تعداد تایل‌های اون هم بیشتر می‌شه. یعنی اگر از بالا به نقشه نگاه کنید ممکنه کل اون رو در یک تایل ببینید ولی با زوم کردن در نقشه و اضافه شدن جزئیات بیشتر عکس بزرگتر خواهد شد.نرم‌افزارهای گرافیکی معمولا یا با عکس‌های رستر کار می‌کنند (مثل فتوشاپ) یا سیستم گرافیکی آن‌ها برداری (vector) است (مثل Corel Draw یا Adobe Illustrator). نقشه‌های وب و موبایل هم چون یک شکل گرافیکی هستند در این دو دسته جای می‌گیرند. همانطور که گفتم برای ساختن نقشه میشه اون رو به صورت عکس ذخیره کرد. این عکس یک نقشه رستره که   حجم زیادی می‌گیره و طبعا پهنای باند بیشتری مصرف می‌کنه. همچنین با بزرگنمایی در اون، به صورت پیکسلی و شطرنجی دیده می‌شه. بنابراین باید با هر بزرگنمایی عکس جدیدی ساخته بشه که این باعث میشه حجم این عکس‌ها به صورت نمایی زیاد بشه! برای همین نقشه‌های وکتوری امروزه بسیار فراگیر شدن و نقشه‌های رستر رو به انقراض می‌رن.در نقشه‌های وکتور دیتاهای GIS به صورت یه سری اعداد و ارقام و کد برای کاربر ارسال می‌شن. کاربر به کمک engine نمایش نقشه‌ای که در اختیار داره دیتا را دریافت کرده و اون رو رندر میکنه (عملیات رنگ و لعاب نقشه روی سیستم کلاینت انجام می‌شه)اولین ویژگی مهمی که این نقشه‌ها دارن اینه که مثل نقشه‌های رستری با بزرگنمایی پیکسل پیکسل نمی‌شن. حجم این نقشه‌ها بسیار کمتر از نقشه‌های رستری هست.نقشه‌های رستری به صورت رندر شده برای کاربر ارسال می‌شن، بنابراین امکان تغییر رنگ و شکل ظاهری در آن‌ها وجود نداره و برای هر تغییر ظاهری باید عکس جدیدی ساخته بشه. ولی نقشه‌های وکتور روی کلاینت رندر می‌شن و امکان تغییرات ظاهری آن‌ها روی کلاینت وجود داره.چون حجم مطالب مربوط به نقشه‌های موبایل و وب بسیار گسترده است سعی کردم مطالب اولیه و کاربردی اون رو به صورت خلاصه در این مطلب عنوان کنم. سعی می‌کنم در مطالب بعدی درباره وکتور تایل بیشتر صحبت کنم. البته ناگفته نمونه که نظرات شما به تکمیل شدن این مطلب کمک می‌کنه.</description>
                <category>مهدی نامقی</category>
                <author>مهدی نامقی</author>
                <pubDate>Sat, 07 Dec 2019 15:34:58 +0330</pubDate>
            </item>
                    <item>
                <title>خانه IOTهایت را بساز (4)</title>
                <link>https://virgool.io/@mnameghi/dream-iot4-tvrlkp1osvzd</link>
                <description>میدونم خیلی وقته چیزی ننوشتم، اول اینکه خب چیزی نداشتم که بنویسم بعدشم یا سرم شلوغ بوده یا حس و حالش نبوده :) امروز در ادامه شیرین کاری‌های قبلی که اینجا و اینجا و اینجا براتون گفتم میخام از شیرین کاری جدیدم براتون بگم.در پست‌های قبلی دیدید که با یک رزبری پای و چندتا رله و یه کوچولو کد نویسی تونستیم چراغهای خونه رو تحت فرمان دربیاریم. تو این مطلب میخام به چراغهای خونه نشون بدم رییس کیه! کاری که قراره بکنیم اینه که با استفاده از Google assistant و مقداری خواهش و تمنا (اونم با لهجه افتضاح انگلیسی من!) چراغها رو روشن و خاموش کنیم.اگر گوشی اندروید دارید که احتمالا با Google assistant و فرمان OK google معروف آشنا هستید. اگر هم از مرفهان بی دردید و از اون گوشی‌های گرون قیمت دارین مشکل خودتونه! برید ببینید با siri چجوری میشه از این کارا کرد.ما باید یه فرمان به جناب گوگل بدیم و بعد ازش بخوایم وب سرویس ما رو call کنه. اینجوری که من سرچ کردم گوگل برای این کار یه چیزایی داره که اینجا میتونید ببینید. ولی راستش یه کم پیچیده و دنگ و فنگ داره که حوصله و وقت سر و کله زدن باهاش رو نداشتم. در حالت ساده‌ترش می‌تونید از برنامه‌های جانبی استفاده کنید. یکی از این برنامه‌ها IFTTT هست. این برنامه همون if خودمان هست که کل برنامه نویسی‌هامون رو باهاش انجام میدیم! شما با تعریف یک تریگر میتونید یک اکشن رو اجرا کنید.ایجاد applet جدیدهمونطوری که تو این عکس می‌بینید روش کار بسیار ساده است. شما باید یک applet جدید بسازید. ابتدا ازتون میخاد که تریگر رو تعریف کنید. روی this کلیک کنید و به صفحه جستجوی تریگرها بروید. google assistant رو سرچ کنید و بعد از لاگین و این ادا بازی‌ها صفحه تنظیماتش براتون باز میشه که باید جمله‌ای که میخاین رو مشخص کنید و جملات آلترناتیو و این چیزا رو هم اگه دوست داشتید بدین.بعد از اینکه تریگر ایجاد شد میرسیم به مرحله دوم که تعریف اکشن است. همونطوری که تو شکل زیر می‌بینید قسمت if کامل شده و حالا میخاد بهش بگیم that چی میشه.با کلیک روی that دوباره پنجره جستجو باز میشه، اینجا باید webhooks رو سرچ کنید. با استفاده از webhooks میتونید یک ریکوئست get یا post بسازید و پارامترهای خودتون رو براش مشخص کنید.و در نهایت بعد از همه این داستانها نوبت به تست میرسه که در زیر می‌بینید. </description>
                <category>مهدی نامقی</category>
                <author>مهدی نامقی</author>
                <pubDate>Fri, 12 Apr 2019 10:41:14 +0430</pubDate>
            </item>
                    <item>
                <title>تبدیل موقعیت به آدرس در پلتفرم نقشه نشان</title>
                <link>https://neshan.blog/neshan-reverse-geocoding-api-yorwpz36teey</link>
                <description>با گسترش استفاده از نقشه‌های دیجیتال، خدمات و سرویس‌های جدیدی در راستای استفاده بهتر و کاربردی‌تر از این نقشه‌ها به وجود آمده‌اند. یکی از این APIهای نقشه، سرویس تبدیل موقعیت به آدرس یا Reverse Geocoding است. با کمک این سرویس در پلتفرم نقشه نشان می‌توان یک موقعیت جغرافیایی را به آدرس تبدیل کرد. یکی از گسترده‌ترین کاربردهای این سرویس نمایش آدرس مبدا و مقصد در اپلیکیشن‌های تاکسی اینترنتی می‌باشد. ولی استفاده از آن محدود به این برنامه‌ها نیست. در واقع حوزه وسیعی از سرویس‌های آنلاین مبتنی بر نقشه مانند سرویس‌های خدماتی مبتنی بر نقشه، دلیوری‌ها و امثال آنها برای ارائه سرویس‌های مطلوب‌تر به کاربران خود به این سرویس نیاز دارند.در کنار اهمیت این سرویس برای کسب و کارهای مختلف چنانچه خروجی آن دقت کافی و لازم را نداشته باشه می‌تواند باعث سردرگمی کاربران شده و تجربه بدی از سرویس را برای آنها رقم بزند. تولید این سرویس در درجه اول نیاز به نقشه دقیق دارد. دقت آن رابطه مستقیم با دقت داده‌های نقشه پایه استفاده شده دارد. در واقع اگر داده‌های نقشه ناقص و یا شامل اطلاعات اشتباه مانند نام‌های غلط و یا ترسیمات ناصحیح باشد خروجی این سرویس نیز به هیچ عنوان مطلوب نخواهد بود.چالش‌های پیش رو در تولید آدرسدر کشور ما آدرس‌دهی منطق خاص خودش را دارد. این منطق حتی بسته به شهرهای مختلف نیز ممکن است تفاوت‌هایی داشته باشد. آدرس‌دهی در بافت‌های قدیمی پیچیدگی‌های بیشتری نسبت به بافت‌های جدید شهرها دارد. پیچیدگی معابر و تو در تو بودن کوچه‌ها و عدم دسترسی می‌تواند تولید آدرس را با مشکلات جدی مواجه کند.نقشه قسمتی از بافت قدیمی شهر تهرانهمچنین شیوه نام‌گذاری معابر توسط شهرداری‌هامی‌تواند در آدرس دهی تاثیر بسزایی داشته باشد. متاسفانه شیوه این نام‌گذاری‌ها در شهرهای مختلف کشور تفاوت دارد و تقریبا می‌توان گفت به صورت سلیقه‌ای عمل می‌شود. به عنوان مثال در شهر مشهد نام‌گذاری کوچه‌ها توسط شماره انجام می‌شود و در مواردی کوچه‌ها بیش از دو نام می‌گیرند و حتی در مواردی کوچه‌هایی با چهار یا پنج نام هم وجود دارد!نمایی از کوچه‌های قدیمی شهر مشهد و نام گذاری آنهامسئله دیگری که در آدرس دهی تاثیر مهمی دارد تغییرات معابر خصوصا تغییرات نام‌ها است. به روز نبودن نقشه‌ها با تغییرات جدید باعث تولید آدرس‌های اشتباه خواهد شد. این تغییرات گاهی باعث می‌شود مردم محلی از همان نام‌های قدیمی استفاده کنند در صورتی که نقشه‌ها به‌روز و با نام‌های جدید می‌باشند. برای همین آدرس‌ها در مواردی برای مردم محلی ناآشنا خواهد بود.راه حل پلتفرم نقشه نشانما در پلتفرم نشان تلاش کرده‌ایم با توجه به مشکلاتی که در بالا به آن‌ها اشاره کردیم، سرویسی ارائه کنیم که در تمام ایران قابل استفاده باشد. در این سرویس تلاش شده کوتاه‌ترین و گویاترین آدرس از نظر معابر محلی تولید شود. همچنین اطلاعات تکمیلی در خروجی سرویس برای توسعه‌دهندگان در نظر گرفته شده‌است تا بتوانند بر اساس محل استفاده و یا کاربرد اپلیکیشن خود از آن‌ها استفاده نمایند.در ادامه یک نمونه از پاسخ این سرویس برای نقطه‌ای در شهر تهران را مشاهده می‌کنید:{
    &quot;status&quot;: &quot;OK&quot;,
    &quot;formatted_address&quot;: &quot;تهران، تهران، فاطمی، حجاب، سازمان آب، نزدیک به عبدالله زاده&quot;,
    &quot;route_name&quot;: &quot;سازمان آب&quot;,
    &quot;route_type&quot;: &quot;secondary&quot;,
    &quot;neighbourhood&quot;: &quot;فاطمی&quot;,
    &quot;city&quot;: &quot;تهران&quot;,
    &quot;state&quot;: &quot;تهران&quot;,
    &quot;place&quot;: null,
    &quot;municipality_zone&quot;: &quot;6&quot;,
    &quot;in_traffic_zone&quot;: true,
    &quot;in_odd_even_zone&quot;: true,
    &quot;addresses&quot;: [
        {
            &quot;formatted&quot;: &quot;حجاب، سازمان آب، نزدیک به عبدالله زاده&quot;,
            &quot;components&quot;: [
                {
                    &quot;name&quot;: &quot;حجاب&quot;,
                    &quot;type&quot;: &quot;primary&quot;
                },
                {
                    &quot;name&quot;: &quot;سازمان آب&quot;,
                    &quot;type&quot;: &quot;secondary&quot;
                }
            ]
        }
    ]
}در شهرهای بزرگ مانند تهران و مشهد سعی شده نام محله و نام منطقه شهرداری با توجه به موقعیت انتخاب شده در خروجی سرویس ارائه می‌شود. در صورتی که موقعیت مشخص شده داخل محدوده طرح ترافیک یا طرح زوج فرد باشد این مورد هم در خروجی سرویس مشخص می‌شود.در جهت کاربردی شدن آدرس‌ها و نزدیک‌ کردن آن‌ها به واقعیت مرسوم در بین مردم، سعی شده است از عبارت‌هایی مانند «نزدیک به ...»، «بین … و ...»، «بعد از ...» در آدرس تولیدشده استفاده شود و صرفا به گفتن نام چند خیابان پشت سر هم اکتفا نشده است.ما در تیم زیرساخت نقشه نشان بطور مداوم در حال به‌روزرسانی داده‌های نقشه و همچنین بهبود الگوریتم‌ها جهت تولید بهترین آدرس به همراه سرعت پاسخ‌دهی (response time) بهینه  در سرویس Reverse Geocoding هستیم. در زمان نگارش این مطلب نسخه ۲.۳ این سرویس منتشر و در اختیار توسعه‌دهندگان و برنامه‌نویسان قرار گرفته است. جهت کسب اطلاعات بیشتر در زمینه چگونگی استفاده از سرویس تبدیل موقعیت جغرافیایی به آدرس می‌توانید به این صفحه در سایت توسعه‌دهندگان نشان مراجعه کنید.</description>
                <category>مهدی نامقی</category>
                <author>مهدی نامقی</author>
                <pubDate>Mon, 17 Dec 2018 10:05:36 +0330</pubDate>
            </item>
                    <item>
                <title>خانه IOTهایت را بساز (۳)</title>
                <link>https://virgool.io/@mnameghi/dream-iot3-xhqxagsyd6ni</link>
                <description>در باب تنبلی و معضلاتی که داشتم اینجا و اینجا یه چیزایی نوشتم، ولی خب ماجرا به همینجا ختم نشد. اگر مطالب قبلی رو نخوندید پیشنهاد می‌کنم اول اونها رو مطالعه کنید. یکی از چیزهایی که وجودش تو هر خونه لازم است و رنگ و رویی به خونه‌ها میده گلدونه. بله گلدون، و حتما میدونید گلدون به مراقبت و رسیدگی نیاز داره. همچون فرزند آدم رشد میکنه، از سرحال بودنش سرحال میشی و از پژمرده شدنش غمگین.آب دادن به گلدونا داستان خودشو داره. طبعا کمتر گلدونی هر روز آب نیاز داره و اسکجول(schedule) من عمرا بتونه چند روز یه بار رو هندل کنه! برای همین همیشه با نگاه کردن به خاک گلدونا بهشون آب میدم.خب چون افتادم تو وادی IOT و این سوسول بازیا گفتم برای این قضیه هم یه فکری بکنم. ماژول تشخیص رطوبت خاکاین عکس ماژول تشخیص رطوبت خاک است. سیستم کارش ساده است، اون دوشاخه داخل خاک قرار می‌گیره و کارش اینه که بفهمه خاک چه میزان رطوبت داره. وقتی که رطوبت از حدی کمتر شد یه فرمان صادر می‌کنه که ما اونو می‌گیریم و یه کاری باهاش انجام میدیم.خب تا اینجای کار که ساده بود. این فرمانی که بالا بهش اشاره شد یک پمپ آب رو روشن می‌کنه. پمپ آب رو از مخزن میکشه و توسط شلنگهایی که به گلدونها وصل شده اونها رو آب میده. هنگامی که این اتفاق می‌افته یه پیام تو تلگرام برای من میاد که الان گلدونات آبیاری شد. برای اینکه مخزن آب خالی نباشه یک سنسور سطح آب تو مخزن گذاشتم که به محض اینکه آب از یه حدی کمتر شد هم پمپ از کار می‌افته هم پیام میاد که بیا منو پر آب کن.تمام این اتفاقات زیر سر یک ماژول وای فای EPS8266-12E است. ورودی سنسور آب و رطوب خاک به این ماژول میاد و توسط چند خط کد ساده این ماژول رو برنامه ریزی کردم. تو شکل زیر شماتیک مداری رو که ساختم مشاهده می‌کنید.سنسور سطح آب آنالوگ هست و یک عدد  تولید می کند. اگر آب روی سنسور نباشه این عدد کم میشه و از مقدار عدد میشه فهمید آب تو مخزن هست یا تموم شده.</description>
                <category>مهدی نامقی</category>
                <author>مهدی نامقی</author>
                <pubDate>Fri, 16 Nov 2018 17:51:20 +0330</pubDate>
            </item>
                    <item>
                <title>خانه IOT‌هایت را بساز (۲)</title>
                <link>https://virgool.io/@mnameghi/dream-iot2-jkwxo3kk6npp</link>
                <description>در ادامه مطلب قبلی که حتما خواندید متوجه شدید که تنبلی یک از معظلات -دوس دارم با ظ بنویسم اصن:) - اینجانب بوده و تلاش‌هایی برای حل این مشکل کردم. در مطلب قبل توضیح دادم که چطور با استفاده از رزبری پای و چند عدد رله تونستم چراغهای خونه رو توسط موبایل به زانو دربیارم.یکی از مشکلات این طرح سیم کشی بود. یعنی برای هر کلید در هر گوشه خونه یک رزبری باید کار گذاشته می‌شد که طبعا با این قیمت دلار منطقی نیست! و فضای زیادی هم می‌گیره که زیبا نیست، یا اینکه برای هر کلید در همان گوشه‌های ذکر شده باید دو رشته سیم تا رزبری پای فعلی کشیده می‌شد که این هم امکان پذیر نبود. و این رو هم در نظر داشته باشید که خروجی‌های رزبری محدود است.بنابراین دنبال راهی گشتم که بدون این ماجراها و با حداقل قیمت یک کلید با قابلیت کنترل از طریق WiFi داشته باشم. با کمک یکی از دوستان این کاره، که این مدت خیلی به ایشون زحمت دادم با ماژول ESP8266 آشنا شدم. این ماژول ورژن‌های مختلفی دارد و مدلی که من استفاده کردم تقریبا ۲۵ هزار تومن قیمت... داشت!!!خب طراحی‌های اولیه شروع شد. اگر از شماتیک زیر چیزی سر در نمیارید خیلی مهم نیست منم اولش زیاد سر در نمی‌آوردم. خلاصه این مدار اینه که دوتا خروجی از ماژول به رله ها وصل می‌شه و دوتا ورودی از دوتا کلید داریم. اگر یک درخواست از طریق وب یا WiFi داخلی به ماژول ارسال بشه خروجی رله رو وصل می‌کنه. کلیدها برای این گذاشته شدن که اگر به هر دلیلی WiFi قطع بود از طریق اونا بشه رله‌ها رو قطع و وصل کرد. یک led هم برای نشان دادن وضعیت روشن و خاموش بودن دستگاه هم اون گوشه گذاشته شده. تمام این ماجراها توسط یک کد C انجام میشه که باید زحمت بکشید اون رو خودتون بنویسید.مشطراحی برد این مدار باید طوری می‌بود که داخل قاب کلید جا می‌شد. بعد از چند بار سعی و خطا و کشیدن شرمنده شدن :) نهایت برد مدار به این شکل دراومد.نمای pcb قبل از سوار شدن قطعاتشکل کلی بعد از بستن قطعاتپروگرام کردن این ماژولها بسیار ساده است. اگر کمی C بلد باشید با مشاهده چند مثال خیلی ساده می‌تونید توسط ardunio ide و یک مبدل usb به ttl که در شکل زیر می‌بینید اونها رو پروگرام کنید.و در نهایت این برد روی یک صفحه پلکسی بسته و در جای کلید نصب شد.خب همچنان که می‌بینید کلید کنترل از راه دور ما ساخته شد. به خاطر اینکه این مطلب طولانی و حوصله بر نباشه زیاد وارد قسمتهای فنی نشدم. اگر دوست داشتید بیشتر بدونید یا سوالی داشتید در قسمت نظرات بنویسید تا با هم بیشتر یاد بگیریم.مطلب بعدی را از دست ندهید.</description>
                <category>مهدی نامقی</category>
                <author>مهدی نامقی</author>
                <pubDate>Fri, 03 Aug 2018 10:07:26 +0430</pubDate>
            </item>
                    <item>
                <title>خانه IOTهایت را بساز!</title>
                <link>https://virgool.io/@mnameghi/dream-iot-prf2v10dtpry</link>
                <description>از قدیم گفتن تنبلی باعث بروز خلاقیت میشه، برای همین معمولا اختراعات و علم و تکنولوژی و.. در راستای خدمت به آدمهای تنبل است.یکی از این اختراعات که از قدیم مورد توجه بوده کنترل از راه دور است که اول از تلویزیونها شروع شد. (واقعا خدا خیرشون بده! شاید شما یادتون نمیاد ولی من سالها از نزدیک لمس کردم این معضل رو)بگذریم...امروزه دیگه هر چیزی که فکرشو بکنید و نکنید کنترل از راه دور داره و تازه این ماجرا با آمدن اینترنت شده کنترل از راه اینترنت! خب منم به عنوان فرد کوچکی از جامعه تنبل‌ها با موضوعاتی در منزل درگیر بودم. یکی از اونها روشن و خاموش کردن چراغها بود. شاید برای شما عجیب باشه ولی خب درگیر بودم دیگه!به لطف مینی کامپیوتر کوچک و محبوب قلب‌ها رزبری پای، دست به کار شدم که این معضل رو حل کنم. اولین قدم اینه که شما کمی از رزبری و لینوکس سر در بیارین که کار زیاد سختی نیست. بعد اینکه از سیم کشی ساختمون و کلید و پریزها یه چیزایی بدونید. (که خیلی زیاد باید در این مورد احتیاط کنید)معمولا تو سیم کشی خونه ها کلیدهای چراغها تا حدی کنار هم قرار میگیرن. ولی خب طبیعیه که کلید چراغ اتاق خواب تو پذیرایی نیست. من معمولا سعی میکنم این حرکت با کمترین خسارت به خونه انجام بشه، برای همین ابتدا کلیدها رو باز میکنم. بعد رزبری و رله‌ها و مابقی ماجرا رو جای کلیدها می‌بندم. اینطوری نه دیواری سوراخ میشه و نه خسارتی وارد میشه. برای بستن تجهیزات روی دیوار یک جعبه طراحی کردم و با برش لیزر روی طلق‌های معروف به پلکسی جعبه رو ساختم. در آوردن جای مانیتور یه کم پیچیده بود که به لطف اتوکد انجام شد. (هر چند یه جاهای کوچکی اشتباه کردم) از نظر خودم ساده ترین قسمت ماجرا کدنویسی اون هست. برای کد نویسی از پایتون استفاده کردم و یک وب سرور ساده راه انداختم. با یک ریکوئست ساده شماره پورت GPIO رزبری رو ارسال میکنم و اون طرف ابتدا وضعیت پورت رو میخونم و عوضش میکنم. با این کار رله قطع و وصل میشه. اگر حوصله برنامه نویسی اندروید رو داشتید میتونید خودتون برنامه اش رو بنویسید و اگر هم نداشتید میتونید مثل من از این برنامه استفاده کنید.اگر فقط استفاده از این سیستم از طریق کنترل از راه دور باشه یه جاهایی به مشکل میخوردم. مثلا فرض کنید باتری گوشی تموم شده و گوشی خاموشه، حالا چطوری چراغها رو روشن کنیم! یا مثلا اینترنت قطع شده (البته برای این مشکل داخل خونه از شبکه WiFi داخل خونه استفاده میکنم) یا کلا WiFi قطع باشه! در هر حال باید روش دیگه ای برای این کار وجود داشته باشه. برای همین یک مانیتور لمسی روی این جعبه قرار دادم. همچنان که در عکس می‌بینید، چندتا کلید ساده وجود داره روی مانیتور دیده میشه. این یک برنامه ساده است که UI اون با Qt Designer طراحی شده و با PyQt آوردمش تو پایتون. وقتی رزبری میاد بالا این برنامه اجرا میشه و مانیتور هم لمسی است و با لمس کلیدها میشه اونها رو روشن و خاموش کرد.نکته‌ای که می‌مونه اینه که بعضی‌ها به من میگفتن چرا از دستگاه‌های آماده تو بازار استفاده نمی‌کنی. خدمت این دوستان عارضم که این دستگاه‌ها معمولا برای یک چراغ طراحی شدن و تقریبا یک عدد از اونها قیمتش اندازه کل این چیزی که من ساختم میشه. و اینکه اونها قابلیت کاستومایز به اون شکل که مد نظرت باشه ندارن. مثلا برای چراغ ورودی رو بعد از یک دقیقه میخام خودکار خاموش بشه. یا اینکه اینها رو به یک بات تلگرام وصل کنم و...نظر به اینکه اطلاعات سخت افزاری من در حد Hello World و یا حتی کمتر از اون هست، این مدت خیلی مزاحم یکی از دوستان شدم که همینجا از ایشون کمال تشکر و قدر دانی رو دارم.پی نوشت:به قول این فیلمها Don&#x27;t try this at home. یا اینکه اگر با برق آشنا نیستید هیچ وقت از این کارا نکنید چون ممکنه خیلی براتون خطرناک باشه.و صابخونه عزیز میدونم که داری این مطلب رو میخونی قول میدم خونه‌تو صحیح و سالم تحویل بدم :)قسمت دوم و سوم همین مطلب را از دست ندهید.</description>
                <category>مهدی نامقی</category>
                <author>مهدی نامقی</author>
                <pubDate>Fri, 29 Jun 2018 10:07:07 +0430</pubDate>
            </item>
            </channel>
</rss>