arduinoprojeleri
arduinoprojeleri
Arduino Iot projeleri
19 posts
Hakkında Teknoloji Günlüğü Projenizmivar.com - Arduino ve IOT Projeleri
Don't wanna be here? Send us removal request.
arduinoprojeleri · 3 years ago
Text
ESP8266 için Çoklu Sensör Kalkanı Oluşturun
Bu projede, ESP8266 Wemos D1 Mini kartı için bir Çoklu Sensör Kalkanı tasarlamayı ve oluşturmayı keşfedeceksiniz. Kalkan, sıcaklık sensörüne (DS18B20), bir PIR hareket sensörüne, bir LDR'ye ve bir röle modülünü bağlamak için bir terminale sahiptir. Tüm donanımı hazırlayarak başlayacağız ve ardından programlayacağız.
Tumblr media
Video Eğitimini İzleyin
Bu proje video formatında ve yazılı formatta mevcuttur. Aşağıdaki videoyu izleyebilir veya yazılı talimatlar için aşağı kaydırabilirsiniz. Bu proje iki videoya bölünmüştür.
ESP8266 WeMos D1 Mini Çoklu Sensör Kalkanını Tasarlayın ve İnşa Edin – Bölüm 1
Bu ilk videoda kullanacağımız donanıma karar vereceğiz. Ayrıca bu projenin ana özelliklerine ve kendi WeMos D1 Mini Multisensör kalkanınızı nasıl tasarlayıp monte edebileceğinize bir göz atacağız.
youtube
ESP8266 WeMos D1 Mini Çoklu Sensör Kalkanını Programlayın ve Test Edin – Bölüm 2
Bu ikinci videoda, Wemos D1 Mini Çoklu Sensör Kalkanını, çeşitli yapılandırılabilir ayarlara dayalı olarak çoklu sensör kalkanını izlemenize ve kontrol etmenize izin veren bir web sunucusunu çalıştıran bir kodla programlayacağız.
youtube
Kaynaklar
Bu projeyi oluşturmak için gereken tüm kaynakları aşağıdaki bağlantılarda bulabilirsiniz (veya GitHub projesini ziyaret edebilirsiniz ):
Web Sunucusu kodu (Arduino IDE için)
Şematik diyagram
Gerber dosyaları
PCB'yi düzenlemek için KiCad projesi
3D Yazıcı Muhafazası (STL dosyaları ve SketchUp Projesi)
Tüm dosyaları indirmek için buraya tıklayın
Projeye Genel Bakış
Shield, bir sıcaklık sensörü, bir hareket sensörü, bir LDR ve herhangi bir çıkışı bağlayabileceğiniz 3 pinli bir soketten oluşur, bir röle modülü kullanacağız.
Tumblr media
Ayrıca, çeşitli yapılandırılabilir ayarlarla 4 farklı mod kullanarak kalkanı kontrol etmek için bir web sunucusu çalıştıran bir program yazacağız.
Tumblr media
Bu projenin sonunda, benzer görünümlü bir gadget'ınız olacak.
Tumblr media
Röleyi manuel modda açıp kapatabileceksiniz.
Tumblr media
Veya otomatik modları seçebilirsiniz:
Otomatik hareket modu, yani hareket algıladığında röle belirli bir süre boyunca açık kalır.
Veya parlaklık modunu kullanabilirsiniz, böylece ışık belirli bir eşik değerinin altına düştüğünde röle açılır.
Son olarak, mevcut parlaklık değerine ve hareket algılanıp algılanmadığına göre röleyi kontrol etme seçeneği vardır.
Bu projede size tüm bu özellikleri çalışırken göstereceğiz.
JLCPCB
Bu proje JLCPCB tarafından  desteklenmiştir . JLCPCB, Çin'de iyi bilinen bir PCB prototip şirketidir. Hızlı PCB prototipi ve küçük parti üretimi konusunda uzmanlaşmıştır. Sadece 2 $ karşılığında en az 10 PCB sipariş edebilirsiniz.
Tumblr media
Breadboard devrelerinizi gerçek panolara dönüştürmek ve projelerinizi daha profesyonel hale getirmek istiyorsanız, yüksek kaliteli PCB'leri düşük fiyatlara sipariş etmek için Gerber dosyalarını yüklemeniz yeterli. Bunu daha sonra bu blog gönderisinde nasıl yapacağınızı göstereceğiz.
ESP8266 Çoklu Sensör Kalkanı Özellikleri
Multisensör Kalkanı, evinizi izlemek için faydalı olabilecek birkaç sensöre sahiptir. Kalkan şunları kontrol etmenizi sağlar:
Bir durumu belirtmek için 1x SMD LED
1x Işığa bağlı direnç (LDR)
1x DS18B20 sıcaklık sensörü
1x PIR hareket sensörü
Tumblr media
Ayrıca GND, 5V ve GPIO15'e erişmenizi sağlayan bir terminal bloğuna da sahiptir. Bu terminal, bir röleyi veya kontrol etmek isteyebileceğiniz başka herhangi bir çıkışı bağlamak için kullanılabilir.
Tumblr media
ESP8266 Çok Sensörlü Kalkan Pimi Ataması
Aşağıdaki tablo, çok sensörlü blendajın her bir bileşeni için pin atamasını açıklar:
BileşenWemos D1 Mini Pin MontajıPIR Hareket SensörüGPIO5 (D1)DS18B20 Sıcaklık SensörüGPIO4 (D2)Hafif Bağımlı DirençA0NEDEN OLMUŞGPIO12 (D6)Ek çıktıGPIO15 (D8)
Farklı pinler atamak ve kullanmak istiyorsanız, ESP8266 Pinout Referans Kılavuzumuzu okuyun .
Devreyi Breadboard Üzerinde Test Etme
PCB kalkanını tasarlamadan ve inşa etmeden önce devreyi bir devre tahtası üzerinde test etmek önemlidir. PCB yapmak istemiyorsanız yine de devreyi bir breadboard üzerine monte ederek bu projeyi takip edebilirsiniz.
Tumblr media
Gerekli Parçalar
Devreyi bir breadboard üzerine monte etmek için aşağıdaki parçalara ihtiyacınız vardır:
ESP8266 Wemos D1 Mini – En İyi ESP8266 Wi-Fi Geliştirme Kartını okuyun
1x 5mm LED
1x 330 Ohm direnç
1x DS18B20 sıcaklık sensörü
1x mini PIR hareket sensörü
1x ışığa bağlı direnç
2x 10k Ohm direnç
1x röle modülü
ekmek tahtası
Atlama telleri
Projeleriniz için tüm parçaları en iyi fiyata bulmak için önceki bağlantıları kullanabilir veya doğrudan MakerAdvisor.com/tools adresine gidebilirsiniz!
Tumblr media
Şematik
Tüm parçaları bir araya getirdikten sonra aşağıdaki şematik diyagramı izleyerek devreyi monte edin:
Tumblr media
İşte devre şeması:
Tumblr media
PCB tasarlama
Bir breadboard üzerinde devrenin düzgün çalıştığından emin olduktan sonra KiCad üzerinde bir PCB tasarladım . KiCad, PCB tasarlamak için kullanılan açık kaynaklı bir yazılımdır.
Tumblr media
Bir ESP8266 PCB kalkanı tasarlamak oldukça basittir. WeMos için önceden hazırlanmış KiCad parçaları var ve KiCad parçalarına aşağıda bir bağlantı bulabilirsiniz:
WeMos D1 Mini KiCad Parçası
LED, LDR, dirençler, terminal blokları vb. gibi diğer tüm bileşenler KiCad'de zaten mevcuttur.
Designing the circuit works like in any other circuit software tool, you place some components and you wire them together. When you’re happy with your circuit and pins usage, it’s time to assign each component to a footprint.
The WeMos D1 Mini was already created, and all the other components were also available by default on the KiCad parts library.
Having the parts assigned, you can start placing each component. When you’re happy with the layout, make all the connections and route your PCB. Once you’re done, save your project and export the Gerber files.
Note: if you’re familiar with KiCad, you can grab the project files and edit them to customize the shield for your own needs.
Download GERBER .zip file
KiCad project to edit the PCB
Ordering the PCBs
PCB'yi nasıl tasarlayacağınızı bilmiyorsanız, ancak yine de sipariş vermek istiyorsanız, çok kolay. Yapmanız gereken:
1. Gerber dosyalarını indirin – .zip dosyasını indirmek için buraya tıklayın
2.  JLCPCB.com'a gidin, “ ŞİMDİ SATIN AL ” düğmesine tıklayın ve az önce indirdiğiniz .zip dosyasını yükleyin.
Tumblr media
3. Altta bir başarı mesajı göreceksiniz. Ardından, her şeyin beklendiği gibi gidip gitmediğini kontrol etmek için sağ alt köşedeki “Gerber Viewer” bağlantısını kullanabilirsiniz. PCB'nin üstünü ve altını görüntüleyebilirsiniz. Lehim maskesini, serigrafiyi, bakırı vb. görüntüleyebilir veya gizleyebilirsiniz.
Tumblr media
Varsayılan ayarlarla, sadece 2$'a 10 adet PCB sipariş edebilirsiniz. Ancak, farklı bir PCB Rengi gibi diğer ayarları seçmek isterseniz, size birkaç dolara mal olacaktır.
4. Siparişinizden memnun kaldığınızda, siparişi tamamlamak için “ SEPETE KAYDET ” butonuna tıklayın.
Tumblr media
PCB'lerimin üretilmesi 2 gün sürdü ve DHL teslimat seçeneğiyle 3 iş günü içinde geldi.
Tumblr media
kutudan çıkarma
Yaklaşık bir hafta sonra PCB'leri ofisime aldım. Her zamanki gibi her şey iyi paketlenmiş olarak geldi ve PCB'ler gerçekten çok kaliteli.
Tumblr media
Serigrafi üzerindeki harfler gerçekten iyi basılmış ve okunması kolay. Bu fiyata daha iyi bir PCB hizmeti alabileceğinizi sanmıyorum.
Tumblr media
Bileşenleri Lehimleme
Bir sonraki adım, bileşenleri PCB'ye lehimlemektir. Bir SMD LED ve SMD dirençleri kullandım. SMD bileşenlerini lehimlemenin biraz zor olduğunu biliyorum, ancak PCB'de çok yer tasarrufu sağlıyorlar.
İşte kullandığım lehimleme araçları:
TS100 mini taşınabilir havya
Lehim 60/40 0,5 mm çap
Lehim matı
Tumblr media
TS100 Havya hakkındaki incelememizi okuyun:  TS100 Havya İncelemesi – En İyi Taşınabilir Havya .
PCB'ye lehimlemeniz gereken tüm bileşenlerin listesi burada (kalkanı Wemos D1 mini'ye takmak için başlık pimlerini unutmayın):
Tumblr media
1x SMD LED'i
1x 330 Ohm SMD dirençler
2x 10k Ohm SMD direnci
1x DS18B20 sıcaklık sensörü
1x mini PIR hareket sensörü
1x ışığa bağlı direnç
1x Vidalı klemensler
Dişi pin başlık soketi
SMD bileşenlerini lehimleyerek başlayın. Ardından, başlık pimlerini lehimleyin. Son olarak, diğer bileşenleri lehimleyin.
Tumblr media
WeMos Çoklu Sensör Kalkanı, tüm parçaları birleştirdikten sonra böyle görünüyor. ESP8266 WeMos D1 mini'ye mükemmel şekilde bağlanmalıdır.
Tumblr media
3D Baskılı Muhafaza
Son olarak, devrenizi yerleştirmek için bir muhafaza satın alabilirsiniz. Bir 3D yazıcınız varsa, kendi kasanızı oluşturabilirsiniz.
Creality CR-10 3D yazıcıyı kullanarak çok sensörlü kalkanı yerleştirmek için basit bir muhafazayı 3D yazdırdım .
Tumblr media
Muhafaza iki parçadan oluşur: alt ve kapak. Kapakta PIR hareket sensörü için bir boşluk ve LDR ve sıcaklık sensörü için dikdörtgen bir delik bulunur. Yanda, röle kabloları için bir boşluk ve ESP8266'ya güç sağlamak ve programlamak için USB kablosunun geçmesi için bir boşluk var.
Tumblr media
İşte bu, kalkan bitti!
Tumblr media
Şimdi biraz kod yazmanın zamanı geldi.
Çoklu Sensör Kalkanını Programlama
Bu projenin kodu, çeşitli yapılandırılabilir ayarlara dayalı olarak çoklu sensör kalkanını izlemenize ve kontrol etmenize izin veren bir web sunucusunu çalıştırır.
Devam etmeden önce Arduino IDE'nizde ESP8266 kurulu olmalıdır. Henüz yapmadıysanız, ESP8266'yı Arduino IDE'ye kurmak için sonraki öğreticiyi izleyin.
Arduino IDE'de ESP8266 Kartı Nasıl Kurulur
Web Sunucusuna Genel Bakış
Bu projeye devam edelim, kuracağımız web sunucusu, röleyi kontrol etmek için 4 farklı mod arasından seçim yapmanızı sağlar:
Manuel (mod 0) : röleyi açıp kapatmak için bir düğmeniz olduğu.
Otomatik PIR (mod 1) : hareket algılandığında röleyi açar. Bu modda, hareket algılandıktan sonra çıkışın kaç saniye açık olacağını ayarlayabileceğiniz bir alan vardır.
LDR (mod 2) : parlaklık belirli bir eşiğin altına düştüğünde röle açılır. %0 ile %100 arasında bir LDR eşik değeri ayarlayabilirsiniz.
Otomatik PIR ve LDR (mod 3) : bu mod, PIR hareket sensörünü ve LDR'yi birleştirir. Bu mod seçildiğinde PIR sensörü hareket algıladığında ve parlaklık değeri eşiğin altında olduğunda röle açılır. Bu modda zamanlayıcıyı ve LDR eşik değerini ayarlayabilirsiniz.
Tumblr media
Web sunucusunda, sıcaklık okumasını istemek için basabileceğiniz bir düğme de vardır. Sıcaklık okumalarını talep ettikten sonra, web sunucusu performansını optimize etmek için okumaları gizlemek için “Sensör Okumalarını Kaldır” düğmesine basabilirsiniz.
Her modda, seçilen modun yanı sıra mevcut çıkış durumunu gösteren bir etiket vardır.
ESP8266'nın sıfırlanması veya aniden güç kaybetmesi durumunda son çıkış durumunu ve ayarları hatırlamasını istiyoruz. Bu yüzden bu parametreleri ESP8266 EEPROM'a kaydetmemiz gerekiyor.
Kitaplıkları yükleme
Kodu yüklemeden önce, Arduino IDE'nize iki kitaplık yüklemeniz gerekir:  Paul Stoffregen'in OneWire kitaplığı ve DS18B20 sensörünü kullanabilmeniz için  Dallas  Sıcaklık kitaplığı . Bu kitaplıkları yüklemek için sonraki adımları izleyin.
OneWire kitaplığı
OneWire kitaplığını indirmek için buraya tıklayın . İndirilenler içinde bir .zip klasörünüz olmalıdır
.zip  klasörünü açın ve  OneWire  -master  klasörünü almalısınız
Klasörünüzü yeniden adlandırın OneWire-master OneWire'a  _
OneWire  klasörünü Arduino IDE kurulum  kitaplıkları  klasörünüze taşıyın 
Son olarak, Arduino IDE'nizi yeniden açın
Dallas Sıcaklık kitaplığı
DallasTemperature kütüphanesini indirmek için buraya tıklayın . İndirilenler içinde bir .zip klasörünüz olmalıdır
.zip  klasörünü açın ve Arduino-Temperature-Control-Library-master  klasörünü  almalısınız  .
Klasörünüzü yeniden adlandırın Arduino-Sıcaklık-Kontrol-Kütüphane-ustasıDallasSıcaklık  _ 
DallasTemperature klasörünü Arduino IDE kurulum  kitaplıkları  klasörünüze taşıyın 
Son olarak, Arduino IDE'nizi yeniden açın
kod
Aşağıdaki kodu Arduino IDE'ye kopyalayın.
/********* Rui Santos Complete project details at https://randomnerdtutorials.com *********/ // Load libraries #include <ESP8266WiFi.h> #include <EEPROM.h> #include <OneWire.h> #include <DallasTemperature.h> // Replace with your network credentials const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; // Auxiliary variables for temperature static char celsiusTemp[7]; static char fahrenheitTemp[7]; String temperatureString = ""; // Variable to hold the temperature reading // EEPROM size // Address 0: Last output state (0 = off or 1 = on) // Address 1: Selected mode (0 = Manual, 1 = Auto PIR, // 2 = Auto LDR, or 3 = Auto PIR and LDR) // Address 2: Timer (time 0 to 255 seconds) // Address 3: LDR threshold value (luminosity in percentage 0 to 100%) #define EEPROM_SIZE 4 // Set GPIOs for: output variable, status LED, PIR Motion Sensor, and LDR const int output = 15; const int statusLed = 12; const int motionSensor = 5; const int ldr = A0; // Store the current output state String outputState = "off"; // 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(&oneWire); // Timers - Auxiliary variables unsigned long now = millis(); unsigned long lastMeasure = 0; boolean startTimer = false; unsigned long currentTime = millis(); unsigned long previousTime = 0; const long timeoutTime = 2000; // Auxiliary variables to store selected mode and settings int selectedMode = 0; int timer = 0; int ldrThreshold = 0; int armMotion = 0; int armLdr = 0; String modes[4] = { "Manual", "Auto PIR", "Auto LDR", "Auto PIR and LDR" }; // Decode HTTP GET value String valueString = "0"; int pos1 = 0; int pos2 = 0; // Variable to store the HTTP request String header; // Set web server port number to 80 WiFiServer server(80); void setup() { // Start the DS18B20 sensor sensors.begin(); // Serial port for debugging purposes Serial.begin(115200); // PIR Motion Sensor mode, then set interrupt function and RISING mode pinMode(motionSensor, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING); Serial.println("start..."); EEPROM.begin(EEPROM_SIZE); // Uncomment the next lines to test the values stored in the flash memory /*Serial.println(" bytes read from Flash . Values are:"); for(int i = 0; i < EEPROM_SIZE; i++) { Serial.print(byte(EEPROM.read(i))); Serial.print(" "); }*/ // Initialize the output variable and the LED as OUTPUTs pinMode(output, OUTPUT); pinMode(statusLed, OUTPUT); digitalWrite(output, HIGH); digitalWrite(statusLed, LOW); // Read from flash memory on start and store the values in auxiliary variables // Set output to last state (saved in the flash memory) if(!EEPROM.read(0)) { outputState = "off"; digitalWrite(output, HIGH); } else { outputState = "on"; digitalWrite(output, LOW); } selectedMode = EEPROM.read(1); timer = EEPROM.read(2); ldrThreshold = EEPROM.read(3); configureMode(); // Connect to Wi-Fi network with SSID and password Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // Print local IP address and start web server Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.begin(); } void loop() { WiFiClient client = server.available(); // Listen for incoming clients if (client) { // If a new client connects, currentTime = millis(); previousTime = currentTime; Serial.println("New Client."); // print a message out in the serial port String currentLine = ""; // make a String to hold incoming data from the client while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected currentTime = millis(); if (client.available()) { // if there's bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor header += c; if (c == '\n') { // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: if (currentLine.length() == 0) { // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) // and a content-type so the client knows what's coming, then a blank line: client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); // Display the HTML web page client.println("<!DOCTYPE html><html>"); client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); client.println("<link rel=\"icon\" href=\"data:,\">"); // CSS to style the on/off buttons // Feel free to change the background-color and font-size attributes to fit your preferences client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}"); client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;"); client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}"); client.println(".button2 {background-color: #555555;}</style></head>"); // Request example: GET /?mode=0& HTTP/1.1 - sets mode to Manual (0) if(header.indexOf("GET /?mode=") >= 0) { pos1 = header.indexOf('='); pos2 = header.indexOf('&'); valueString = header.substring(pos1+1, pos2); selectedMode = valueString.toInt(); EEPROM.write(1, selectedMode); EEPROM.commit(); configureMode(); } // Change the output state - turn GPIOs on and off else if(header.indexOf("GET /?state=on") >= 0) { outputOn(); } else if(header.indexOf("GET /?state=off") >= 0) { outputOff(); } // Set timer value else if(header.indexOf("GET /?timer=") >= 0) { pos1 = header.indexOf('='); pos2 = header.indexOf('&'); valueString = header.substring(pos1+1, pos2); timer = valueString.toInt(); EEPROM.write(2, timer); EEPROM.commit(); Serial.println(valueString); } // Set LDR Threshold value else if(header.indexOf("GET /?ldrthreshold=") >= 0) { pos1 = header.indexOf('='); pos2 = header.indexOf('&'); valueString = header.substring(pos1+1, pos2); ldrThreshold = valueString.toInt(); EEPROM.write(3, ldrThreshold); EEPROM.commit(); Serial.println(valueString); } // Web Page Heading client.println("<body><h1>ESP8266 Web Server</h1>"); // Drop down menu to select mode client.println("<p><strong>Mode selected:</strong> " + modes[selectedMode] + "</p>"); client.println("<select id=\"mySelect\" onchange=\"setMode(this.value)\">"); client.println("<option>Change mode"); client.println("<option value=\"0\">Manual"); client.println("<option value=\"1\">Auto PIR"); client.println("<option value=\"2\">Auto LDR"); client.println("<option value=\"3\">Auto PIR and LDR</select>"); // Display current state, and ON/OFF buttons for output client.println("<p>GPIO - State " + outputState + "</p>"); // If the output is off, it displays the ON button if(selectedMode == 0) { if(outputState == "off") { client.println("<p><button class=\"button\" onclick=\"outputOn()\">ON</button></p>"); } else { client.println("<p><button class=\"button button2\" onclick=\"outputOff()\">OFF</button></p>"); } } else if(selectedMode == 1) { client.println("<p>Timer (0 and 255 in seconds): <input type=\"number\" name=\"txt\" value=\"" + String(EEPROM.read(2)) + "\" onchange=\"setTimer(this.value)\" min=\"0\" max=\"255\"></p>"); } else if(selectedMode == 2) { client.println("<p>LDR Threshold (0 and 100%): <input type=\"number\" name=\"txt\" value=\"" + String(EEPROM.read(3)) + "\" onchange=\"setThreshold(this.value)\" min=\"0\" max=\"100\"></p>"); } else if(selectedMode == 3) { client.println("<p>Timer (0 and 255 in seconds): <input type=\"number\" name=\"txt\" value=\"" + String(EEPROM.read(2)) + "\" onchange=\"setTimer(this.value)\" min=\"0\" max=\"255\"></p>"); client.println("<p>LDR Threshold (0 and 100%): <input type=\"number\" name=\"txt\" value=\"" + String(EEPROM.read(3)) + "\" onchange=\"setThreshold(this.value)\" min=\"0\" max=\"100\"></p>"); } // Get and display DHT sensor readings if(header.indexOf("GET /?sensor") >= 0) { sensors.requestTemperatures(); temperatureString = " " + String(sensors.getTempCByIndex(0)) + "C " + String(sensors.getTempFByIndex(0)) + "F"; client.println("<p>"); client.println(temperatureString); client.println("</p>"); client.println("<p><a href=\"/\"><button>Remove Sensor Readings</button></a></p>"); } else { client.println("<p><a href=\"?sensor\"><button>View Sensor Readings</button></a></p>"); } client.println("<script> function setMode(value) { var xhr = new XMLHttpRequest();"); client.println("xhr.open('GET', \"/?mode=\" + value + \"&\", true);"); client.println("xhr.send(); location.reload(true); } "); client.println("function setTimer(value) { var xhr = new XMLHttpRequest();"); client.println("xhr.open('GET', \"/?timer=\" + value + \"&\", true);"); client.println("xhr.send(); location.reload(true); } "); client.println("function setThreshold(value) { var xhr = new XMLHttpRequest();"); client.println("xhr.open('GET', \"/?ldrthreshold=\" + value + \"&\", true);"); client.println("xhr.send(); location.reload(true); } "); client.println("function outputOn() { var xhr = new XMLHttpRequest();"); client.println("xhr.open('GET', \"/?state=on\", true);"); client.println("xhr.send(); location.reload(true); } "); client.println("function outputOff() { var xhr = new XMLHttpRequest();"); client.println("xhr.open('GET', \"/?state=off\", true);"); client.println("xhr.send(); location.reload(true); } "); client.println("function updateSensorReadings() { var xhr = new XMLHttpRequest();"); client.println("xhr.open('GET', \"/?sensor\", true);"); client.println("xhr.send(); location.reload(true); }</script></body></html>"); // The HTTP response ends with another blank line client.println(); // Break out of the while loop break; } else { // if you got a newline, then clear currentLine currentLine = ""; } } else if (c != '\r') { // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine } } } // Clear the header variable header = ""; // Close the connection client.stop(); Serial.println("Client disconnected."); } // Starts a timer to turn on/off the output according to the time value or LDR reading now = millis(); // Mode selected (1): Auto PIR if(startTimer && armMotion && !armLdr) { if(outputState == "off") { outputOn(); } else if((now - lastMeasure > (timer * 1000))) { outputOff(); startTimer = false; } } // Mode selected (2): Auto LDR // Read current LDR value and turn the output accordingly if(armLdr && !armMotion) { int ldrValue = map(analogRead(ldr), 0, 1023, 0, 100); Serial.println(ldrValue); if(ldrValue < ldrThreshold && outputState == "on") { outputOff(); } else if(ldrValue > ldrThreshold && outputState == "off") { outputOn(); } delay(100); } // Mode selected (3): Auto PIR and LDR if(startTimer && armMotion && armLdr) { int ldrValue = map(analogRead(ldr), 0, 1023, 0, 100); Serial.println(ldrValue); if(ldrValue < ldrThreshold) { outputOff(); startTimer = false; Serial.println("a"); } else if(ldrValue > ldrThreshold && outputState == "off") { outputOn(); Serial.println("b"); } else if(now - lastMeasure > (timer * 1000)) { outputOff(); startTimer = false; Serial.println("c"); } } } // Checks if motion was detected and the sensors are armed. Then, starts a timer. ICACHE_RAM_ATTR void detectsMovement() { if(armMotion || (armMotion && armLdr)) { Serial.println("MOTION DETECTED!!!"); startTimer = true; lastMeasure = millis(); } } void configureMode() { // Mode: Manual if(selectedMode == 0) { armMotion = 0; armLdr = 0; // Status LED: off digitalWrite(statusLed, LOW); } // Mode: Auto PIR else if(selectedMode == 1) { outputOff(); armMotion = 1; armLdr = 0; // Status LED: on digitalWrite(statusLed, HIGH); } // Mode: Auto LDR else if(selectedMode == 2) { armMotion = 0; armLdr = 1; // Status LED: on digitalWrite(statusLed, HIGH); } // Mode: Auto PIR and LDR else if(selectedMode == 3) { outputOff(); armMotion = 1; armLdr = 1; // Status LED: on digitalWrite(statusLed, HIGH); } } // Change output pin to on or off void outputOn() { Serial.println("GPIO on"); outputState = "on"; digitalWrite(output, LOW); EEPROM.write(0, 1); EEPROM.commit(); } void outputOff() { Serial.println("GPIO off"); outputState = "off"; digitalWrite(output, HIGH); EEPROM.write(0, 0); EEPROM.commit(); }
Ham kodu görüntüle
Bu kodu açıklamak oldukça uzundur, bu nedenle aşağıdaki iki değişkeni ağ kimlik bilgilerinizle değiştirebilirsiniz ve kod hemen çalışacaktır.
const char* ssid = ""; const char* password = "";
Bu kodun nasıl çalıştığını öğrenmek istiyorsanız okumaya devam edin.
Kod Nasıl Çalışır?
Gerekli kitaplıkları dahil ederek başlayın.
#include <ESP8266WiFi.h> #include <EEPROM.h> #include <OneWire.h> #include <DallasTemperature.h>
ESP Wi-Fi özelliklerini kullanmak için ESP8266WiFi kitaplığı gereklidir . EEPROM kitaplığı , ESP8266 EEPROM'da kalıcı verileri okumanıza ve yazmanıza olanak tanır ve OneWire ve DallasTemperature kitaplıkları, DS18B20 sıcaklık sensöründen sıcaklığı okumanıza olanak tanır.
Ağ Kimlik Bilgilerinizi Ayarlama
Bu iki değişkene ağ kimlik bilgilerinizi eklemeniz gerekir.
const char* ssid = ""; const char* password = "";
Bunlar, sıcaklığı Celsius/Fahrenheit cinsinden depolamak için yardımcı değişkenlerdir:
// Auxiliary variables for temperature and humidity static char celsiusTemp[7]; static char fahrenheitTemp[7]; static char humidityTemp[7]; String temperatureString = ""; // Variable to hold the temperature reading
EEPROM
Daha sonra erişmek istediğimiz EEPROM boyutunu tanımlıyoruz.
#define EEPROM_SIZE 4
Flash belleğe dört değer kaydetmemiz gerekecek: adres 0'daki son çıkış durumu, adres 1'deki seçilen mod, adres 2'deki zamanlayıcı değeri ve adres 3'teki LDR eşik değeri. Yani, 4 bayta ihtiyacımız var. flash bellekte.
Adres 0 : Son çıkış durumu (0 = kapalı veya 1 = açık)
Adres 1 : Seçilen mod (0 = Manuel, 1 = Otomatik PIR, 2 = Otomatik LDR veya 3 = Otomatik PIR ve LDR)
Adres 2 : Zamanlayıcı (zaman 0 - 255 saniye)
Adres 3 : LDR eşik değeri (yüzde 0 ila %100 olarak parlaklık)
GPIO'ları tanımlama
Bu bölümde çıkış, durum LED'i, PIR hareket sensörü ve LDR için GPIO'ları tanımlıyoruz.
const int output = 15; const int statusLed = 12; const int motionSensor = 5; const int ldr = A0;
Ayrıca web sunucusunda görüntülenecek outputState'i tutmak için bir String değişkeni oluşturuyoruz.
String outputState = "off";
Sıcaklık sensörü
Ardından, sıcaklık sensörü için gereken örnekleri oluşturun. Sıcaklık sensörü GPIO 4'e bağlıdır.
// 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(&oneWire);
zamanlayıcılar
Ardından, zamanlayıcılar için yardımcı değişkenler oluşturuyoruz:
long now = millis(); long lastMeasure = 0; boolean startTimer = false;
Seçilen Mod ve Ayarlar
Burada, seçilen modu ve ayarları saklamak için değişkenleri başlatıyoruz:
int selectedMode = 0; int timer = 0; int ldrThreshold = 0; int armMotion = 0; int armLdr = 0; String modes[4] = { "Manual", "Auto PIR", "Auto LDR", "Auto PIR and LDR" };
Web Sunucusu için Değişkenleri Ayarlama
Aşağıdaki kod parçası web sunucusuyla ilgilidir. Temel bir web sunucusu koduna aşina olmak için ESP8266 Web Sunucusu eğitimini takip edebilirsiniz .
// Decode HTTP GET value String valueString = "0"; int pos1 = 0; int pos2 = 0; // Variable to store the HTTP request String header; // Set web server port number to 80 WiFiServer server(80);
kurmak()
setup() içinde , DS18B20 sıcaklık sensörünü başlatarak başlayın.
sensors.begin();
Hata ayıklama amacıyla Seri Bağlantı Noktasını 115200 baud hızında başlatın.
Serial.begin(115200);
Yarıda kesmek
PIR hareket sensörünü INPUT_PULLUP olarak ayarlayın ve RISING modunda bir interrupt olarak tanımlayın.
pinMode(motionSensor, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);
flaş bellek
Kodun bu kısmı, flash belleği daha önce tanımlanan EEPROM boyutuyla başlatır.
EEPROM.begin(EEPROM_SIZE);
Durum LED'ini ve çıkış pinini çıkış olarak ayarlayın.
pinMode(output, OUTPUT); pinMode(statusLed, OUTPUT);
Tersine çevrilmiş mantıkla bir röleyi kontrol ediyoruz, bu yüzden onu YÜKSEK olarak ayarlayarak başlıyoruz, yani aslında başlıyor.
digitalWrite(output, HIGH); digitalWrite(statusLed, HIGH);
Ardından, çıktıyı en son kaydedilen duruma ayarlayın. Çıkış durumu 0 konumunda kaydedilir, bu nedenle EEPROM.read(0) kullanın.
Çıkış durumunu buna göre güncellemek için kaydedilen durumun açık mı yoksa kapalı mı olduğunu kontrol ederiz.
if(!EEPROM.read(0)) { outputState = "off"; digitalWrite(output, HIGH); } else { outputState = "on"; digitalWrite(output, LOW); }
Ayrıca, EEPROM'da kayıtlı değerlerle, seçilen mod, zamanlayıcı ve LDR eşik değeri gibi ayarları tutan tüm değişkenleri güncelliyoruz.
selectedMode = EEPROM.read(1); timer = EEPROM.read(2); ldrThreshold = EEPROM.read(3);
Ardından, her moda doğru değerleri atamak için configureMode() işlevini çağırırız.
configureMode();
configureMode() işlevi
Şimdi bu fonksiyonun nasıl çalıştığına bir göz atalım. Seçilen mod Manuel ise, hareket etkinleştirilmez ( armMotion ), ne LDR ( armLdr ). Ayrıca manuel modda olduğumuzu göstermek için durum LED'ini DÜŞÜK olarak ayarlıyoruz (otomatik modlarda durum LED'i yanıyor).
if(selectedMode == 0) { armMotion = 0; armLdr = 0; // Status LED: off digitalWrite(statusLed, LOW); }
Diğer modları yapılandırmak için benzer bir işlem yapılır. Bir sensörü etkinleştirmek veya devre dışı bırakmak için kol değişkenlerini değiştirirsiniz. Şimdi setup() 'a geri dönelim .
Wi-Fi bağlantısı
Burada Wi-Fi ağına bağlanıyoruz ve Seri Monitörde ESP8266 IP adresini yazdırıyoruz.
Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // Print local IP address and start web server Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.begin();
döngü()
loop() ' da web sunucusunu görüntüler ve seçilen mod ve ayarlara göre işleri yaparız.
ESP8266 Web Sunucusu Eğitiminde web sunucularını çok ayrıntılı olarak ele aldık . Bu nedenle, bu proje için daha alakalı olan kısımlara bir göz atacağız.
Canlı bir gösteri ile neler olduğunu açıklarsak, kodun bu kısmı daha kolay anlaşılır.
Web sunucusuna eriştiğinizde benzer bir web sayfası göreceksiniz.
Tumblr media
En üstte bu dört farklı moddan birini seçebilirsiniz.
Tumblr media
Manuel (mod 0)
Otomatik PIR (mod 1)
Otomatik LDR (mod 2)
Otomatik PIR ve LDR (mod 3)
manuel mod
Örneğin, Manuel modu seçerseniz, kodun aşağıdaki kısmı yürütülür.
if(header.indexOf("GET /?mode=") >= 0) { pos1 = header.indexOf('='); pos2 = header.indexOf('&'); valueString = header.substring(pos1+1, pos2); selectedMode = valueString.toInt(); EEPROM.write(1, selectedMode); EEPROM.commit(); configureMode(); }
Seçilen modu selectedMode değişkenine kaydeder ve flash bellekte şu şekilde saklar:
EEPROM.write(1, selectedMode);
Web sayfası görünümü seçilen moda göre değişir. Bu durumda, 0'a karşılık gelen manuel modu seçtiğimiz için, aşağıdaki if ifadesi doğrudur ve web sayfasında çıktıyı kontrol etmek için iki düğme görüntülenecektir.
if(selectedMode == 0) { if(outputState == "off") { client.println("<p><button class=\"button\" onclick=\"outputOn()\">ON</button></p>"); } else { client.println("<p><button class=\"button button2\" onclick=\"outputOff()\">OFF</button></p>"); } }
Açma ve kapama düğmelerine tıkladığınızda aşağıdaki kod çalışır ve bu iki else if ifadesinden biri çıktıyı açar veya kapatır.
// Change the output state - turn GPIOs on and off else if(header.indexOf("GET /?state=on") >= 0) { outputOn(); } else if(header.indexOf("GET /?state=off") >= 0) { outputOff(); }
Otomatik PIR modu
Şimdi, açılır menüden Otomatik PIR modunu seçin.
Tumblr media
Web sayfasında görünen yeni bir giriş alanı var. Bu alan, hareket algılandıktan sonra çıkışın kaç saniye açık kalacağını belirtmek için 0 ile 255 arasında bir int numarası yazmanıza olanak tanır.
Numarayı değiştirdiğinizde, kodun aşağıdaki bölümünü çağırır ve zamanlayıcı değişkenini değiştirir.
else if(header.indexOf("GET /?timer=") >= 0) { pos1 = header.indexOf('='); pos2 = header.indexOf('&'); valueString = header.substring(pos1+1, pos2); timer = valueString.toInt(); EEPROM.write(2, timer); EEPROM.commit(); Serial.println(valueString); }
Bu modda (mod 1), yalnızca zamanlayıcı için giriş alanını görüntüler.
else if(selectedMode == 1) { client.println("<p>Timer (0 and 255 in seconds): <input type=\"number\" name=\"txt\" value=\"" + String(EEPROM.read(2)) + "\" onchange=\"setTimer(this.value)\" min=\"0\" max=\"255\"></p>"); }
Otomatik LDR modu
Otomatik LDR modunu seçin ve yeni bir giriş alanı belirir.
Tumblr media
Bu, LDR eşik değerini ayarlar ve parlaklık yüzdesini belirtmek için 0 ile 100 arasında bir sayı girebilirsiniz. Bu alanı değiştirdiğinizde, LDR eşik değerini güncellemek için kodun aşağıdaki bölümünü çağırır:
else if(header.indexOf("GET /?ldrthreshold=") >= 0) { pos1 = header.indexOf('='); pos2 = header.indexOf('&'); valueString = header.substring(pos1+1, pos2); ldrThreshold = valueString.toInt(); EEPROM.write(3, ldrThreshold); EEPROM.commit(); Serial.println(valueString); }
Bu mod 2'dir ve ldr shold giriş alanını gösterecektir.
else if(selectedMode == 2) { client.println("<p>LDR Threshold (0 and 100%): <input type=\"number\" name=\"txt\" value=\"" + String(EEPROM.read(3)) + "\" onchange=\"setThreshold(this.value)\" min=\"0\" max=\"100\"></p>"); }
Otomatik PIR ve LDR modu
Otomatik PIR ve LDR modunun seçilmesi hem PIR hem de LDR'yi etkinleştirir. Ayrıca iki giriş alanına sahip yeni bir web sayfası yükler.
Tumblr media
Her iki giriş alanı da daha önce tanımladığımız şekilde çalışır.
Sensör okumaları
Son olarak, sıcaklık okumalarını istemek ve görüntülemek için bir düğme vardır.
Tumblr media
if(header.indexOf("GET /?sensor") >= 0) { sensors.requestTemperatures(); temperatureString = " " + String(sensors.getTempCByIndex(0)) + "C " + String(sensors.getTempFByIndex(0)) + "F"; client.println("<p>"); client.println(temperatureString); client.println("</p>");
Bu okumaları kaldırmak için basabileceğiniz bir düğme de vardır.
client.println("<p><a href=\"/\"><button>Remove Sensor Readings</button></a></p>");
Çoklu sensörünüzün ayarlarını bu şekilde yapılandırırsınız. Ardından, seçilen mod ve ayarlara göre , çıkışın açık mı yoksa kapalı mı olacağını kontrol etmek için loop() 'un başka bir parçası çalışır.
Çıkış Durumunu Kontrol Etme
Örneğin, hareket algılandığında, bir zamanlayıcıyı başlatanDetectsMovement () işlevini çağırır.
void detectsMovement() { if(armMotion || (armMotion && armLdr)) { Serial.println("MOTION DETECTED!!!"); startTimer = true; lastMeasure = millis(); } }
Ardından geçen süreye bağlı olarak çıkışı açar veya kapatır.
// Mode selected (1): Auto PIR if(startTimer && armMotion && !armLdr) { if(outputState == "off") { outputOn(); } else if((now - lastMeasure > (timer * 1000))) { outputOff(); startTimer = false; } }
Çıkışı, eşik değerinin parlaklığına göre açıp kapatmak için kodun aşağıdaki bölümü de vardır.
// Mode selected (2): Auto LDR // Read current LDR value and turn the output accordingly if(armLdr && !armMotion) { int ldrValue = map(analogRead(ldr), 0, 1024, 0, 100); //Serial.println(ldrValue); if(ldrValue > ldrThreshold && outputState == "on") { outputOff(); } else if(ldrValue < ldrThreshold && outputState == "off") { outputOn(); } delay(100); }
Son olarak, otomatik PIR ve LDR modu seçildiğinde ve hareket algılandığında aşağıdaki kod parçası çalışır.
// Mode selected (3): Auto PIR and LDR if(startTimer && armMotion && armLdr) { int ldrValue = map(analogRead(ldr), 0, 4095, 0, 100); //Serial.println(ldrValue); if(ldrValue > ldrThreshold) { outputOff(); startTimer = false; } else if(ldrValue < ldrThreshold && outputState == "off") { outputOn(); } else if(now - lastMeasure > (timer * 1000)) { outputOff(); startTimer = false; } }
Kod aşağı yukarı bu şekilde çalışır, biz de kodun anlaşılmasını kolaylaştırmak için bir sürü yorum yazmak için çaba harcadık.
WeMos Multisensör kalkanını bu kodla programladık, ancak herhangi bir ev otomasyon platformuyla entegre olmak için kendi kodunuzu yazabilirsiniz. Çok sensörlü kalkanın pin atamasını dikkate almanız yeterlidir.
Kodu Yükle
Kodu ESP8266'nıza yüklemek için yükle düğmesine tıklayın. Doğru kartın ve COM bağlantı noktasının seçili olduğundan emin olun.
Tumblr media
Çoklu Sensör Kalkanını Test Etme
112500 baud hızında Seri Monitörü açın. ESP IP adresini yazdırmak için ESP8266 etkinleştirme düğmesine basın.
Tumblr media
Tarayıcınızı açın ve ESP8266 IP adresini yazın. Aşağıdaki sayfa yüklenmelidir.
Tumblr media
Çıkış terminal soketine bir röle modülü bağladık, bu nedenle 12V'luk bir lambayı kontrol ediyoruz, ancak istediğiniz herhangi bir çıkışı kontrol edebilirsiniz.
Tumblr media
Şimdi her modu seçin, her şeyin düzgün çalışıp çalışmadığını kontrol etmek için farklı ayarlar yapmayı deneyin.
Örneğin, Manuel modu seçin ve lambayı açıp kapatın.
Tumblr media
Otomatik PIR modunu seçin. Bu modda lamba, hareket algılandığında ayarladığınız saniye sayısı kadar yanar.
Tumblr media
LDR modunda lambanın yanmasını sağlayacak eşik değerini ayarlayabilirsiniz. LDR'yi kapattığımda parlaklık eşiğin altına düşüyor ve lamba yanıyor.
Tumblr media
Otomatik PIR ve LDR modunda, zamanlayıcıyı ve LDR eşiğini ayarlayabilirim.
Tumblr media
Hareket algılanırsa ancak ışık yoğunluğu eşiğin üzerindeyse hiçbir şey olmaz. Ama LDR'yi kapatırsam yani ışık yok ve hareket algılanıyorsa, ayarlarda tanımladığım saniye kadar lamba yanar.
En son sıcaklık okumalarını istemek için “Sensör Okumalarını Görüntüle” düğmesine de tıklayabilirsiniz.
Tumblr media
Toplama
Aşağıda yorum yapan birine 5 çıplak PCB veriyoruz! Basitçe bu blog gönderisine PCB ile ne yapmak istediğinize dair bir yorum gönderin ve bu çıplak PCB'lerden birini kazanma şansına sahip olursunuz. Kazananlar önümüzdeki hafta açıklanacak! Öyleyse, bizi izlemeye devam edin! [Güncelleme] çekiliş sona erdi ve kazananlar: Ram Chivukula, Phillip R. Hickman, Douglas W Murray, Terry Wegener ve Dale Wolver.
Tumblr media
Bu proje için bu kadar. Umarız bu projeyi faydalı bulmuşsunuzdur ve bunu kendiniz oluşturabilirsiniz. Multisensör Kalkanını ihtiyaçlarınıza uygun başka bir kod ile programlayabilirsiniz. Örneğin, mevcut sıcaklık değerine göre çıkışı kontrol edebilirsiniz. Ayrıca gerber dosyalarını düzenleyebilir ve ESP8266 Multisensor Shield'a başka özellikler ekleyebilirsiniz.
0 notes
arduinoprojeleri · 5 years ago
Text
Arduino Telsiz Nasıl Yapılır
Adım 2: NRF24L01 modüllerini devre şemasında gösterildiği gibi aşağıdaki sırayla bağladım. CE dijital pin numarası 7, CSN pin numarası 8, SCK dijital pin 13, MOSI dijital pin 11, MISO dijital pin 12 ve IRQ dijital pin 2.
Tumblr media Tumblr media Tumblr media Tumblr media
5G ve 5G özellikli cihazlar çağında yaşıyoruz; ancak, telsiz sistemi ve RF iletişim sistemi gibi eski teknolojiler, uzak, kısa mesafe, ucuz ve düşük maliyetli iletişimin gerekli olduğu senaryolarda hala çok önemlidir. Örneğin, bir bina veya ağır yük taşıyan inşaat şirketiniz varsa, işçilerinizin koordineli çalışmak için birbirleriyle iletişim kurması gerekir. Bir telsizin yardımıyla, birbirleriyle iletişim kurabilirler ve kısa bir masaj veya talimatlar yayınlayabilirler, sadece diğer işçilere ses iletmek için “PTT” düğmesine basarak komutları dinleyip takip edebilirler. Başka bir uygulama akıllı kasklarda olabiliruzun bir sürüş sırasında bir sürü bisikletçi arasında iletişim kurmak için, burada önerilen model bir seferde altı kişi arasında iletişim kurabilir. Diğer kısa menzilli kablosuz ses iletim projelerine göz atmak istiyorsanız , bağlantıları kullanarak IR Tabanlı Kablosuz Ses Verici ve Li-Fi Ses Verici projesini ziyaret edin .             
NRF24L01 RF Modülünü kullanan Walkie Talkie
Bu projenin ana bileşeni NRF24L01 RF modülü ve beyin veya işlemci olan Arduino Uno'dur . Bir servo motoru uzaktan kontrol ederek Nrf24L01 ile Arduino arasında nasıl arayüz kurabileceğimizi öğrendik . Bu proje için NRF24L01 RF modülü, dijital iletişim ortamına göre çeşitli avantajlara sahip olduğu için seçilmiştir. Bu sahip 2,4 GHz çok yüksek frekanslı ISM bandını ve veri hızı 250kbps, 1 Mbps, 2 Mbps olabilir. 1Mhz aralığı arasında 125 olası kanal vardır, böylece modül 125 farklı kanal kullanabilir, bu da tek bir yerde 125 bağımsız çalışan modemden oluşan bir ağa sahip olmayı mümkün kılar.
En önemlisi, NRF24L01 sinyalleri polis telsizi ve demiryolu telsizi gibi diğer telsiz sistemleri ile çakışmaz veya çapraz arayüz oluşturmaz ve diğer telsizleri rahatsız etmez. Tek bir nrf24l01 modülü, alıcı durumdayken diğer 6 nrf24l01 modülü ile iletişim kurabilir. Ayrıca, ek bir avantaj olan düşük güç tüketimi modülüdür. Yaygın olarak bulunan ve yaygın olarak kullanılan iki tür NRF24L01 modülü vardır, biri NRF24L01 + ve diğeri dahili antenli NRF24L01 + PA + LNA (aşağıda gösterilmiştir). NRF24L01 +
Tumblr media
yerleşik bir antene ve sadece 100 metre menzile sahiptir. Sadece iç mekan kullanımı için iyidir ve dış mekan uzun mesafeli iletişim için uygun değildir. Ayrıca, verici ve alıcı arasında bir duvar varsa, sinyal iletimi çok zayıftır. Harici antenli NRF24L01 + PA + LNA bir sahip PA olduğunu artırır iletiminden önce sinyalin gücü. LNA, Düşük Gürültülü Amplifikatör anlamına gelir. Açıktır, gürültüyü filtreler ve antenden alınan sinyalin son derece zayıf ve belirsiz düşük seviyesini artırır. Bu sinyalin kullanışlı seviyelerini yapımında yardımcı olur ve sahip olduğu 2dB'lik dış anteni o hangi aracılığıyla , üzerinde hava aralığı kapsamının 1000 metreden iletmek açık hava telsiz iletişim projelerimiz için mükemmeldir.
Arduino tabanlı Walkie Talkie için Gerekli Bileşen
Harici 2DB antenli NRF24L01 + PA + LNA (2 adet)
Arduino UNO veya Arduino'nun herhangi bir sürümü
Ses yükseltici (2 adet)
Mikrofon devresi: Kendiniz yapabilir (daha sonra tartışılacaktır) veya bir ses sensörü modülü satın alabilirsiniz.
DC'den DC'ye yükseltme güçlendirici modülü (2 adet)
3.3V AMS1117 voltaj regülatörü modülü
Güç gösterge LED'i (2 adet)
470 ohm direnç (2 adet)
4 inç hoparlör (2 adet)
basma düğmesi (bas-konuş düğmesi için)
PTT düğmesinin yapılması için 104 PF (2 adet)
NRF24L01 için 100 NF kapasitör (2 adet)
PTT düğmesi için 1k direnç (2 adet)
2 set li-ion pil
Li-ion pil şarj ve pil koruma modülü (2 adet)
Bazı jumper teli, erkek başlık pimi, noktalı vero kartı
Arduino Walkie Talkie Devre Şeması
Arduino Walkie Talkie için tüm devre şeması aşağıdaki resimde gösterilmektedir. Devre şeması PTT düğmesi, mikrofon devresi ve stereo ses çıkışı dahil tüm bağlantıları gösterir.
Tumblr media
Önemli: NRF24L01 modülü voltaj giriş aralığı 1.9v ila maksimum 3.6 volt arasındadır ve voltaj ve akım kararlılığı için + VCC ve - GND'ye 100nf kapasitör kullanmanız gerekir, ancak nrf24l01 modülünün diğer pimleri 5 volt sinyale tolere edebilir seviyeleri.
Adım 1: Ev yapımı özel PCB ve Arduino Atmega328p kartı yapmaya başladım. IC Atmega328p'yi programcıya koydum ve yanıp söndüm ve kodu yükledim. Daha sonra, Atmega328p IC'ye (PB6, PB7) pin 9 ve 10'a 16 MHz kristal ekledim. Özel yapım PCB'm ve programlanmış IC'ye sahip monte edilmiş kartın resimleri aşağıda gösterilmiştir.
Tumblr media
Adım 2: NRF24L01 modüllerini devre şemasında gösterildiği gibi aşağıdaki sırayla bağladım. CE dijital pin numarası 7, CSN pin numarası 8, SCK dijital pin 13, MOSI dijital pin 11, MISO dijital pin 12 ve IRQ dijital pin 2.
Tumblr media
Güç kaynağı için, gerilimi önce 5 volttan 3.3 v'ye iyi akım kararlılığı ile düşürmeniz gerekir. Ayrıca, nrf24l01 modülünün VCC'sine ve toprağına 100nF kapasitör koymanız gerekir. Bu nedenle, 3.3 volt voltaj regülatörü olan AMS1117'yi kullandım   , modül aynı zamanda proje boyutunuzu da küçültür ve kompakt hale getirir.
Tumblr media
Bu voltaj regülatör kartını kendiniz yapmak istiyorsanız, sadece 3,3 voltluk regülatör IC'yi satın alabilir ve hassas bir cihaz olduğu için RF modülünüz için çok önemli olduğu için bazı kapaklar, giriş ve çıkışta direnç ekleyerek yapabilirsiniz. Veya , Breadboard güç kaynağı projesinde yaptığımız gibi 3.3V Ayarlı bir devre oluşturmak için LM317 değişken voltaj regülatörünü kullanabilirsiniz .
Adım 3: Devre şemasında gösterildiği gibi bir ses sensörü satın alabilir veya basit bir mikrofon devresi yapabilirsiniz. Sadece bir transistör- 2n3904 NPN transistörden oluşur . Aşağıdaki resimde bir Vero kartı üzerine inşa edilmiş ev yapımı mikrofon devresi gösterilmektedir. Daha fazla bilgi için bu basit ses ön amplifikatör devresini de kontrol edebilirsiniz .
Tumblr media
Daha iyi anlamak için, aşağıda gördüğünüz gibi bileşen değerleriyle tüm bağlantının başka bir temsilini yaptım
Tumblr media
Bağlantı çok basit, Ses Amplifikatörünü çalıştırmak için 3.7V ila 5V güç kaynağı gerekir. Arduino pin 9 ve 10'dan toprak pin ile birlikte sol kanal ve sağ kanal ses girişi, devre şemasında gösterildiği gibi bu amplifikatör modülü için giriş olarak verilmelidir. Benim durumumda, tek bir 4 inç 8 ohm hoparlör kullandım ve sadece sağ kanal çıkışını kullandım. İsterseniz, bu modülle iki hoparlör kullanabilirsiniz.
Adım 5: Ardından, basit bir basma düğmesi kullanarak PTT anahtarını oluşturdum. Düğmeye basıldığında anahtarın sıçramasını veya düzensiz sinyalleri önlemek için 104PF veya 0.1 uf kapasitör ekledim . Pin 4 şimdi kodlamaya kesilmiş bir pin atandığı için Arduino Digital pin D3 ile doğrudan bağlanmıştır.
Bir ses sinyali veya DATA paketleri iletirken NRF24L01 + PA + LNA daha fazla güç tüketir, bu nedenle daha fazla akım tüketir. PTT düğmesine aniden bastığınızda, güç tüketimi artar. Bu aniden artan yükü yönetmek için NRF24L01 + PA + LNA Modülünün iletim kararlılığı için + vcc ve Toprak üzerinde 100nF kapasitör kullanmanız gerekir.
Düğmeye basıldığında, Arduino kartı D3 pininde bir Arduino Kesintisi alır . Programda, Arduino'nun dijital pimi 3'ü giriş voltajını sürekli kontrol ettiğini ilan edeceğiz. Giriş voltajı düşükse, telsizi alma modunda tutar ve dijital pin numarası 3 yüksekse, mikroişlemci aracılığıyla mikrofon işlemi tarafından alınan ses sinyalini göndermek ve iletmek için telsizi iletim moduna geçirir. Harici antenli NRF24L01 + PA + LNA.
Adım 6: Güç kaynağı için bu Li-ion pili seçtim . Arduino IC Atmega328p, NRF24L01 + PA + LNA, ses yükseltici, PTT düğmesi ve Mikrofon devresi gibi tüm bileşenlere güç vermek için, aşağıda gösterildiği gibi bu proje için 2 set Li-ion pil kullandım.
İyi bir hücrenin voltaj seviyesi 3.8v ila 4.2 volt arasındadır ve şarj voltajı sadece 4v ila 4.2 volttur. Bilmek için daha lityum piller hakkında Bağlı makaleye bakabilir. Bu piller taşınabilir elektronik cihazlarda ve elektrikli araçlarda çok popülerdir . Ancak Li-ion pil hücreleri diğer piller kadar sağlam değildir, aşırı şarj ve deşarjdan çok hızlı korumaya ihtiyaç duyarlar, yani şarj / deşarj akımı ve voltajı güvenli sınırlar içinde tutulmalıdır. Bu nedenle, en pervane Li-ion pil şarj modülünü kullandım - TP4056 . Bu modülü daha önce bir Taşınabilir Güç Bankası oluşturmak için kullandık, bu kartta daha fazla ayrıntı için bunu kontrol edebilirsiniz .
Adım 7: Arduino atmega328p, Ses Amplifikatörü, mikrofon devresi, PTT düğmesi her şey 5 volt'a ihtiyaç duyduğundan dc yükseltici modülüne  2 Amp dc dc kullandım, ancak pilim sadece 3.7V ila 4.2V tedarik edebilir, bu yüzden bir boost dönüştürücüye ihtiyacım var 1 Amp'dan fazla kararlı güç çıkışı ile 5V'a ulaşmak için.
Devreyi kurduktan sonra, küçük bir kasaya monte edebilirsiniz. Plastik bir kutu kullandım ve devrelerimi aşağıdaki resimde gösterildiği gibi yerleştirdim
Walkie Talkie Arduino Kodu
Arduino telsizi için komple program bu sayfanın alt kısmında bulunabilir. Bu bölümde, programın nasıl çalıştığını tartışalım. Buraya gelmeden önce, aşağıda listelenen bazı Kütüphaneleri eklemeniz gerekir.
nRF24 Kütüphanesi
nRF24 Ses Kütüphanesi
Maniaxbug RF24 Kütüphanesi
Radyo ve Ses Kütüphanesi başlıklarını aşağıda gösterildiği gibi ekleyerek programlamaya başlayın
#include <RF24.h> #include <SPI.h> #include <RF24Audio.h> #include "printf.h"    // General includes for radio and audio lib
7 ve 8 numaralı pinlerde RF Radyoyu başlatın ve ses radyo numarasını 0 olarak ayarlayın. Ayrıca, pin 3'teki ppt düğmesini başlatın.
RF24 radio(7,8);    // Set radio up using pins 7 (CE) 8 (CS) RF24Audio rfAudio(radio,0); // Set up the audio using the radio, and set to radio number 0 int talkButton = 3;
Kurulum fonksiyonunun içinde, hata ayıklama için seri monitörü 115200 baud hızında başlatın. Daha sonra ppt düğmesini connect pimini 3 kesinti pimi olarak başlatın.
void setup () { Serial.begin (115200); printf_begin (); radio.begin (); radio.printDetails (); rfAudio.begin (); pinMode (talkButton, INPUT); // düğme konuşması abutton press attachInterrupt (digitalPinToInterrupt (talkButton), konuşma, CHANGE) olup olmadığını kontrol etmek için kesmeyi ayarlar ; // rfAudio.receive () almak için her modül için varsayılan durumu ayarlar ; }
Sonra, kesmeye yanıt olarak çağrılan talk () adında bir fonksiyonumuz var. Program, düğmeye basılıp basılı tutulursa düğmenin durumunu kontrol eder ve sesi göndermek için iletim moduna girer. Düğme bırakılırsa alma moduna girer.
void setup() {      Serial.begin(115200);  printf_begin();  radio.begin();  radio.printDetails();  rfAudio.begin();  pinMode(talkButton, INPUT);//sets interrupt to check for button talk abutton press  attachInterrupt(digitalPinToInterrupt(talkButton), talk, CHANGE);  //sets the default state for each module to receive  rfAudio.receive(); }
Bu projenin tam çalışması, aşağıdaki bağlantıda bulunan videoda bulunabilir. Walkie Talkie çalışma sırasında biraz gürültü çıkarıyor, bu nRF24L01 Modülünün taşıyıcı frekansından gelen gürültü. İyi bir ses sensörü veya mikrofon modülü kullanılarak azaltılabilir. Bu proje hakkında herhangi bir sorunuz varsa, bunları aşağıdaki yorum bölümünde bırakabilirsiniz. Forumlarımızı diğer teknik sorularınıza hızlı yanıtlar almak için de kullanabilirsiniz. 
Kod
#include <RF24.h> #include <SPI.h> #include <RF24Audio.h> #include "printf.h"    // General includes for radio and audio lib RF24 radio(7,8);    // Set radio up using pins 7 (CE) 8 (CS) RF24Audio rfAudio(radio,0); // Set up the audio using the radio, and set to radio number 0 int talkButton = 3; void setup() {        Serial.begin(115200);  printf_begin();  radio.begin();  radio.printDetails();  rfAudio.begin();  pinMode(talkButton, INPUT);  //sets interrupt to check for button talk abutton press  attachInterrupt(digitalPinToInterrupt(talkButton), talk, CHANGE);  //sets the default state for each module to receiver  rfAudio.receive(); } //void talk() //Called in response to interrupt. Checks the state of the button. //If the button is pressed (and held) enters transmit mode to send //audio. If button is release, enters receive mode to listen. void talk() {  if (digitalRead(talkButton)) rfAudio.transmit();  else rfAudio.receive(); } void loop() { }
0 notes
arduinoprojeleri · 5 years ago
Text
Node Red Ile Telegram Nasıl Kullanılır?
Node red gün geçtikçe kullanımı artan ve sürekli olarak güncel programlar için api eklenebilen akış tabanlı bir iot yazılım platformudur.
Bugün ki Yazımızda güncel mesajlaşma programlarından Telegramın node red'e Nasıl entegre edileceğinden bahsedeceğiz.
Node Red Ve Telegram ile Neler Yapılabilir?
Istediğiniz bir cihazı telegram dan bir mesaj ile kontrol esebilirsiniz.
Istenen verileri veya mesajları gün veya saat bazlı olarak istediğiniz telegram kişisi ile paylaşırsınız.
0 notes
arduinoprojeleri · 5 years ago
Text
Buna bir göz at... 👀
https://pin.it/3jJSJGZ
https://projenizmivar.com adresini ziyaret edebilirsiniz. #evdekal #kendinyap #arduino #arduinoproject #raspberrypi #maker #makerbot #robot #robotikkodlama #robotarm #robotics #robotics #kodlama #kodlamaeğitimi #yazilim #teknoloji #iot #internetofthings #3dprinter #3d #teknofest #meb #rccars #türkiye#node #nodejs #nodered #MQTT
0 notes
arduinoprojeleri · 5 years ago
Text
Buna bir göz at... 👀 https://pin.it/2cf4MgA
https://projenizmivar.com adresini ziyaret edebilirsiniz. #evdekal #kendinyap #arduino #arduinoproject #raspberrypi #maker #makerbot #robot #robotikkodlama #robotarm #robotics #robotics #kodlama #kodlamaeğitimi #yazilim #teknoloji #iot #internetofthings #3dprinter #3d #teknofest #meb #rccars #türkiye#node #nodejs #nodered #MQTT
0 notes
arduinoprojeleri · 5 years ago
Text
Buna bir göz at... 👀 https://pin.it/1VSPoi1
https://projenizmivar.com adresini ziyaret edebilirsiniz. #evdekal #kendinyap #arduino #arduinoproject #raspberrypi #maker #makerbot #robot #robotikkodlama #robotarm #robotics #robotics #kodlama #kodlamaeğitimi #yazilim #teknoloji #iot #internetofthings #3dprinter #3d #teknofest #meb #rccars #türkiye#node #nodejs #nodered #MQTT
0 notes
arduinoprojeleri · 5 years ago
Text
Buna bir göz at... 👀 https://pin.it/1DO2u9d
https://projenizmivar.com adresini ziyaret edebilirsiniz. #evdekal #kendinyap #arduino #arduinoproject #raspberrypi #maker #makerbot #robot #robotikkodlama #robotarm #robotics #robotics #kodlama #kodlamaeğitimi #yazilim #teknoloji #iot #internetofthings #3dprinter #3d #teknofest #meb #rccars #türkiye#node #nodejs #nodered #MQTT
0 notes
arduinoprojeleri · 5 years ago
Text
Buna bir göz at... 👀 https://pin.it/7nuNnoO
https://projenizmivar.com adresini ziyaret edebilirsiniz. #evdekal #kendinyap #arduino #arduinoproject #raspberrypi #maker #makerbot #robot #robotikkodlama #robotarm #robotics #robotics #kodlama #kodlamaeğitimi #yazilim #teknoloji #iot #internetofthings #3dprinter #3d #teknofest #meb #rccars #türkiye#node #nodejs #nodered #MQTT
0 notes
arduinoprojeleri · 5 years ago
Photo
Tumblr media
Arduino Ile MQTT Kullanarak Bilgisayarımız veya Herhangi bir sunucuda çalışan node red ile nasıl haberleşebiliriz. ? Daha fazlası için https://projenizmivar.com adresini ziyaret edebilirsiniz. #evdekal #kendinyap #arduino #arduinoproject #raspberrypi #maker #makerbot #robot #robotikkodlama #robotarm #robotics #robotics #kodlama #kodlamaeğitimi #yazilim #teknoloji #iot #internetofthings #3dprinter #3d #teknofest #meb #rccars #türkiye#node #nodejs #nodered #MQTT https://www.instagram.com/p/B_ATPjggJs_/?igshid=1o1xxkb52f9es
0 notes
arduinoprojeleri · 5 years ago
Photo
Tumblr media
Node Red ile MQTT Örneği Daha fazlası için projenizmivar.com adresini ziyaret edebilirsiniz. #evdekal #kendinyap #arduino #arduinoproject #raspberrypi #maker #makerbot #robot #robotikkodlama #robotarm #robotics #robotics #kodlama #kodlamaeğitimi #yazilim #teknoloji #iot #internetofthings #3dprinter #3d #teknofest #meb #rccars #türkiye#node #nodejs #nodered #MQTT https://www.instagram.com/p/B--eqpRDETD/?igshid=4klf60jbudg6
0 notes
arduinoprojeleri · 5 years ago
Video
tumblr
Tumblr media
   Arduino Laser Gravür Nasıl Yapılır Makalemiz Yakında Yayında
Bizi Takip etmeyi Unutmayın
0 notes
arduinoprojeleri · 5 years ago
Link
Tumblr media
0 notes
arduinoprojeleri · 5 years ago
Link
Tumblr media
0 notes
arduinoprojeleri · 5 years ago
Link
Tumblr media
0 notes
arduinoprojeleri · 5 years ago
Link
Tumblr media
0 notes
arduinoprojeleri · 5 years ago
Link
Tumblr media
0 notes
arduinoprojeleri · 5 years ago
Link
Tumblr media
0 notes