Winstar टेक्स्ट OLED डिस्प्ले के साथ कनेक्ट और काम करने के बारे में

लाइनों के रूप में पाठ जानकारी के वितरण के लिए लाइन (या पाठ) प्रदर्शित करने का इरादा है। वे कई प्रकार के होते हैं (मुख्य रूप से एलसीडी या स्व-चमकदार OLED), और आमतौर पर उनके अंकन में संख्या 1202, 1602, 1204 या समान होती है, जो प्रत्येक पंक्ति (12 और 16) में लाइनों की संख्या (उदाहरण 2 या 4 में) और वर्णों को दर्शाती है। । इस प्रकार के सिंगल-लाइन डिस्प्ले हैं, लेकिन निम्नलिखित प्रस्तुति में हम आमतौर पर उपयोग किए जाने वाले दो-लाइन डिस्प्ले पर ध्यान केंद्रित करते हैं।

इनमें से अधिकांश डिस्प्ले HD44780 कंट्रोलर (हिताची) के साथ संगत हैं। इस किस्म के सबसे लोकप्रिय (कम से कम हमारे देश में) विनस्टार द्वारा निर्मित हैं। इसके अलावा, एलसीडी किस्में (नाम WH से अक्षरों के साथ शुरू होता है, उदाहरण के लिए, WH1602) HD44780 कमांड सिस्टम के साथ एक-पर-एक संगत हैं, और OLED प्रकार (नाम WEH से शुरू होता है, उदाहरण के लिए, WEH001602 में एक बेहतर WS0010 नियंत्रक है। दुर्भाग्य से, या सौभाग्य से, अब हम सौदा करेंगे।

Ks0108 नियंत्रक के आधार पर पहले की गई ग्राफिक डिस्प्ले के विपरीत , लोअरकेस डिस्प्ले में वर्ण जनरेटर अंतर्निहित है। इसके अलावा, हमारे लिए, WS0010 और मानक HD44780 के बीच मुख्य अंतर बहुभाषी पाठ प्रदर्शित करने के लिए कई (चार) कोड तालिकाओं की उपस्थिति है। HD44780 में केवल एक ऐसी तालिका है, जिसके कारण कंपनियों को प्रत्येक क्षेत्र में एक अलग प्रकार का प्रदर्शन बेचना पड़ता है। WS0010- आधारित OLED डिस्प्ले को क्षेत्रीय ब्रेकडाउन की आवश्यकता नहीं है, जो कि अधिक सुविधाजनक है। लेकिन उपयोगकर्ता के लिए नहीं: डिफ़ॉल्ट रूप से, ENGLISH_JAPANESE तालिका WEH डिस्प्ले में चालू होती है, और रूसी वर्णों को सक्षम करने के लिए, आपको इसे ENGLISH_RinguAN पर स्विच करना होगा।

ENGLISH_R रूसी तालिका के बारे में अधिक जानें।
: (. ) , . , , — - -8, (. 19768-93). -, , , EBCDIC, , ( 127 ) ASCII. , , , ASCII .

मानक लिक्विड क्रिस्टल लाइब्रेरी (Arduino IDE के साथ आपूर्ति की गई), निश्चित रूप से, चार तालिकाओं के बारे में कुछ नहीं जानती है, और इसलिए इस संबंध में सीधे, कम से कम आवश्यकता होती है। लेकिन न केवल: अंत में, यह अंग्रेजी भाषा के साथ करना संभव होगा। हालांकि, WS0010 के लिए प्रारंभिक प्रक्रिया बिल्कुल अलग है, और अगर इसे ठीक नहीं किया जाता है, तो प्रदर्शन यह दिखाएगा कि हर बार यह शुरू होता है।

अन्य विशेषताएं
, OLED- Winstar , ( , ). , , . , , WEH SPI (, « SPI»), , , ( 3) — . : , . , I2C (. , ).

किसी कारण से, विनस्टार डिस्प्ले बुद्धिमानीपूर्ण प्रलेखन के संदर्भ में एक बड़ा घाटा है (जैसा कि आपने देखा हो सकता है, यह आमतौर पर चीनी उत्पादों की एक विशेषता है)। यह इंगित करने के लायक है कि आप किसी त्रुटि के बिना अधिक या कम पूर्ण दस्तावेज़ कहाँ से डाउनलोड कर सकते हैं: यहाँ एलसीडी (WH1602) पर HD44780 नियंत्रक के साथ, यहाँ OLED प्रकार के डिस्प्ले (WEH1602) पर, यहाँ WS007 नियंत्रक पर अलग से (हम बाद में इसका उल्लेख करेंगे) । और यहां, यदि आप रुचि रखते हैं, तो रूसी में एचडी 44780 नियंत्रक का विस्तृत विवरण है

लिक्विड क्रिस्टल लाइब्रेरी को समतल करना


HD44780 और इसके एनालॉग्स पर लोअरकेस डिस्प्ले को नियंत्रित करने के लिए, मानक लिक्विड क्रिस्टल लाइब्रेरी, जो पारंपरिक रूप से सभी संस्करणों के अरडूइनो आईडीई में शामिल है, काफी उपयुक्त है। रूसी पाठ को प्रदर्शित करने के लिए, इसका लिक्विडक्रिस्ट्रस का संस्करण है , जो आश्चर्यजनक रूप से Arduino IDE के सभी आधुनिक संस्करणों में अच्छा काम करता है (यह कहता है कि लेखक ने UTF-8 वर्णों के रूपांतरण के लिए सही तरीके से संपर्क किया है)। लेकिन WS0010 नियंत्रक पर OLED डिस्प्ले के लिए अनुकूल करने के लिए, आपको अभी भी सुधार करने की आवश्यकता है। भविष्य में, हम इस लाइब्रेरी का मज़ाक उड़ाएंगे और इसलिए हम इसका नाम बदलकर LiquidCrystalRus_OLED कर देंगे, ताकि सामान्य रूप से भ्रमित न हों। कार्य को सरल बनाने के लिए, हम फ़ंक्शन का नाम नहीं बदलेंगे, क्योंकि प्रारंभिक लिक्विडक्रिस्ट्रस के लिए आरंभीकरण वैसा ही होगा।

परिवर्तन इस प्रकार हैं:

1. चूंकिWS0010 में रूसी-अंग्रेजी तालिका (ऊपर दिए गए लिंक का उपयोग करके WS0010 पर डेटाशीट के लिए पृष्ठ 9 देखें) नंबर 2 है, तो इसे स्विच करने के लिए आपको राज्य 10 (0x02) पर सेट करने के लिए FUNCTION SET कमांड में दो सबसे कम महत्वपूर्ण बिट्स FT1 और FT0 सेट करने की आवश्यकता है। (एक कोड तालिका वाले एलसीडी में, इन बिट्स, वैसे, बिल्कुल भी उपयोग नहीं किए जाते हैं)। ऐसा करने के लिए, LiquidCrystalRus_OLED.cpp फ़ाइल में, उस स्थान (फ़ाइल की लाइन 96) को देखें जहाँ _displayfunction चर का मान सेट है । इसके आरंभीकरण की दोनों पंक्तियों में (लाइनें 97 और 99) एक परिशिष्ट जोड़ें " = = 0x02 "।

2. अगला, आपको शक्ति चालू करने के बाद आरंभीकरण देरी को ठीक करने की आवश्यकता है । HD44780 के लिए, यह 40 एमएस से अधिक नहीं होना चाहिए (ऊपर दिए गए लिंक पर प्रलेखन देखें)। पुस्तकालय इसके लिए फ़ंक्शन का उपयोग करता है।delayMicroseconds (50000) ( LiquidCrystalRus_OLED.cpp फ़ाइल की पंक्ति 120 )। डब्लूएस ००१० कंट्रोलर के लिए, आपको दस गुना अधिक देरी करने की आवश्यकता है - कम से कम ५०० एमएस (ऊपर लिंक पर डेटाशीट का अंतिम पृष्ठ देखें)। यह आवश्यकता इतनी सावधानी से छिपी हुई है (विनस्टार पर अंग्रेजी-भाषा के दस्तावेज़ों के साथ फाइल "इस भाग में" फ़ॉन्ट खो गया "), ऐसा लगता है कि कुछ लोगों ने अब तक इसके बारे में सोचा है। इसलिए, हम प्रत्येक 16 एमएस के 32 विलंब दोहराव के साथ इस पंक्ति को बदलते हैं:

for (int i = 0; i <=31; i++) delayMicroseconds(16000);

3. इसके अलावा (डेटशीट के इस अंतिम पृष्ठ को भी देखें), इस देरी के बाद, जब चार-तार चालू होते हैं, तो आपको एक पंक्ति (0x00) में पांच बार खाली कमांड भेजने की आवश्यकता होती है । चूंकि Arduino डिस्प्ले कंट्रोलर की तुलना में काफी तेज है, इसलिए कमांड को एक मध्यवर्ती विलंब के साथ दिया जाना चाहिए। उन्हें शुरुआती फ़ंक्शन के पाठ में थोड़ा और सम्मिलित करने की आवश्यकता होती है, जहां यह विशेष रूप से 4-बिट समावेशन ( लिक्विडक्रिस्ट्रस_ओएलईडीसीपीसी फ़ाइल की लाइन 147 ) के बारे में है।

4. लेकिन यह अंत नहीं है। मूल ENGLISH_R रूसी तालिका में एक डिग्री आइकन है(कोड 0xEF)। विकल्प बेहद असफल रूप से (बहुत बड़ा) निष्पादित किया गया है, इसलिए इसके बजाय मैं एक बोल्ड ऊपरी बिंदु (कोड 0xDF) का उपयोग करना पसंद करता हूं - यह सामान्य शैली में एक डिग्री की तरह बहुत अधिक है। इसे एक कोड के रूप में दर्ज किया जा सकता है (ऑक्टल "333" से बेहतर), लेकिन परेशानी यह है - वर्ण जनरेटर तालिका में कोड के साथ रूसी अक्षरों के कोड को बदलने के कार्य को सरल बनाने की कोशिश करना, पुस्तकालय के लेखक, UTF-8 एन्कोडिंग ( पिछले लेख देखें ) पर आधारित है, 0x80 ( LiquidCrystalRus :: write function ) से अधिक किसी भी कोड के लिए एक प्रतिस्थापन स्थिति की शुरुआत की । चूंकि हमारा 0xDF 0x80 से अधिक स्पष्ट है, जब आप कोड की पंक्ति में वर्ण "333" निर्दिष्ट करते हैं, तो इसके बजाय एक खाली स्थान प्रदर्शित किया जाएगा, क्योंकि यह किसी भी रूसी पत्र के अनुरूप नहीं है।

दुर्भाग्य से, मानक createChar () फ़ंक्शनजब मैंने अपने स्वयं के डिग्री आइकन बनाने के लिए इसका उपयोग करने की कोशिश की, तो मैंने प्रदर्शन को पूर्ण स्तूप में दर्ज किया, जिससे इसे केवल कार्यक्रम को फिर से लोड करके हटाया जा सकता था। मुझे अतिरिक्त रूप से निपटने की आवश्यकता है और मैं आभारी रहूंगा यदि कोई मुझे बताएगा कि मामला क्या है। इसलिए चरित्र जनरेटर को हमारी क्षमताओं में संपादित नहीं किया जा सकता है, लेकिन हम 0xDF वर्ण को शर्त से अलग कर सकते हैं। ऐसा करने के लिए मौजूदा (। पाठ समारोह को देखने की जगह लिखने ) निम्न में से हालत:

if ((value>=0x80)&&(value!=0xdf))

5. अंत में, इस डिस्प्ले पर पार किया गया शून्य ग्राफिक एलसीडी स्क्रीन पर उतना हड़ताली नहीं है। फिर भी, उसी लेखन समारोह में, मैंने "O" (0x4f) अक्षर के कोड के साथ शून्य कोड (0x30) के प्रतिस्थापन की शुरुआत की। जो लोग चाहते हैं कि जीरो बैक को केवल रिप्लेसमेंट लाइन ( डिलीटेड लिक्विडक्रिस्ट्रस_ओएलड.कैप फाइल की लाइन 308 ) को डिलीट या कमेंट करके वापस किया जा सकता है
अद्यतन पुस्तकालय को लेख के अंत में लिंक से डाउनलोड किया जा सकता है।

संबंध


अब सब कुछ ट्विक लगता है, आप कनेक्ट कर सकते हैं। Arduino को WEH001602BG डिस्प्ले (16 अक्षर, स्क्रीन की लंबाई 100 मिमी) का कनेक्शन निम्न आकृति में दिखाया गया है:

छवि

Arduino पिन जिसमें RS, E, DB4-DB7 डिस्प्ले पिन जुड़े हुए हैं, जब संकेत आरंभ होने पर संकेत दिया जाना चाहिए:

// RS, E, DB4, DB5, DB6, DB7
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);

यदि वांछित है, तो आप किसी भी इंटरफ़ेस विकल्प (आठ- या चार-तार) में दो या उससे अधिक डिस्प्ले कनेक्ट कर सकते हैं। इस मामले में, डेटा लाइनें और रुपये साझा किए जा सकते हैं। इस मामले में डिस्प्ले के बीच का चुनाव टर्मिनल E के माध्यम से किया जाता है, जो अलग-अलग डिस्प्ले के लिए अलग-अलग Arduino टर्मिनलों से जुड़ा होता है (दूसरे डिस्प्ले की कनेक्शन लाइनें डायग्राम पर ग्रे में दिखाई जाती हैं, दूसरे डिस्प्ले के टर्मिनल E को Arduino के 6 पिन से जोड़ा जाता है)। बेशक, इस मामले में, आपको लाइब्रेरी की दो प्रतियां बनाने की आवश्यकता है (उदाहरण के लिए, OLED1 और OLED2), जिसमें सभी आउटपुट समान हैं, केवल ई। को छोड़कर, डिस्प्ले अलग-अलग कॉन्फ़िगरेशन और आकार (8x2, 16x2, 12x2, 12x4, आदि) के हो सकते हैं। ) .. यह HD44780 पर पारंपरिक एलसीडी डिस्प्ले पर भी लागू होता है।

और सत्ता के लिए एक रिले क्यों है? WS0010 का मुख्य दोष हार्डवेयर "रेजेट" की कमी है। HD44780 में, अंतर्निहित rezet को उचित ठहराया जा सकता है - लेखक के पास सुनिश्चित करने के लिए एलसीडी स्क्रीन के साथ पर्याप्त अनुभव नहीं है। लेकिन Winstar, इसके विकास में मानक का पालन करने की कोशिश कर रहा है, स्पष्ट रूप से इस कार्य के साथ सामना नहीं कर सका। पावर को बंद किए बिना कंट्रोलर को रिबूट करने से डिस्प्ले पर किसी भी टर्बिडिटी का आभास होता है और आप पूरे सर्किट की पावर को डिस्टर्ब करके और स्क्रैच से डिस्प्ले को इनिशियलाइज़ करके ही इससे छुटकारा पा सकते हैं।

इसके अलावा, बिजली चालू / बंद करने पर प्रदर्शन स्थानों में लाइनों को भ्रमित कर सकता है। लोगों का दावा है कि पूर्ण 8-बिट समावेश (4-बिट के बजाय) मदद करता है, लेकिन इसने मेरे लिए और भी बुरा काम किया। वे दृढ़ता से जोर देते हैं कि काल्पनिक "नए बैचों" में यह सब पहले से ही तय किया गया है, लेकिन यह विश्वास करना मुश्किल है कि हम किस तरह के "नए" बैचों के बारे में बात कर रहे हैं जब Winstar ने 2008 के बाद से OLED प्रदर्शन जारी किए हैं , और मेरे पास 13 और 14 साल के डिस्प्ले थे जारी?)।

रिले और पावर को बंद किए बिना Arduino को रिबूट करते समय प्रदर्शन को कृत्रिम रूप से रीसेट करने के लिए सेट करें। यह मज़बूती से स्क्रीन पर कचरा खत्म करता है। इस रिले के माध्यम से डिस्प्ले (या डिस्प्ले) की शक्ति को अलग से चालू किया जाता है, जो कि सेटअप प्रक्रिया की शुरुआत में नि: शुल्क Arduino पिन (इस मामले में, पिन 4) से स्विच किया जाता है, जब नियंत्रक पहले से ही सख्ती से काम कर रहा हो। और रिले को चालू करने से पहले, 1000 एमएस की अतिरिक्त देरी देना अच्छा है (नीचे स्केच देखें)। इंगित रिले EDR202A05 एक रीड रिले है, घुमावदार वर्तमान 10 एमए है, इसलिए इसे अरुडिनो आउटपुट से चुपचाप नियंत्रित किया जाता है।

जब चालू की गई लाइनों के बीच भ्रम की स्थिति के लिए, इनिशियलाइज़ेशन प्रक्रिया में उपरोक्त परिवर्तनों के अलावा, यह प्रभाव पूरी तरह से पर्याप्त रूप से शक्तिशाली (कम से कम 1-2 ए) बाहरी स्रोत से कम से कम 7.5 के लोड के साथ एक स्थिर वोल्टेज से पूरे सर्किट की शक्ति से छुटकारा दिलाता है। वोल्ट। पोषण पर यह निर्भरता, जाहिर है, कई प्रकाशनों में विसंगतियों का एक स्रोत है, जहां कई लेखक दावा करते हैं कि उनके लिए सब कुछ ठीक है। इस मामले में, डिस्प्ले (या डिस्प्ले) को Arduino आंतरिक स्टेबलाइज़र (बोर्ड के पिन 5V) के माध्यम से जोड़ा जा सकता है, या उन्हें एक अलग स्टेबलाइज़र के माध्यम से जोड़ा जा सकता है, लेकिन मुख्य बात यह है कि स्टेबलाइज़र के इनपुट वोल्टेज को स्विचिंग के क्षण में पावर सर्जेस की परवाह किए बिना पर्याप्त स्थिर होना चाहिए।

निरीक्षण


जांच करने के लिए, मैंने एक डेमो स्केच भेजा, Proba_Rus_Liquid_Crystal_OLED , एक कैलेंडर घड़ी डिस्प्ले का बाहरी तापमान सेंसर के साथ अनुकरण:

WEH1602 उदाहरण दिखाएँ
#include <LiquidCrystalRus_OLED.h>

// initialize the library with the numbers of the interface pins
// RS, E, DB4, DB5, DB6, DB7
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);
#define RelayPin 4 // 4 -  

void setup() {
delay (1000);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH); //  
delay (500);
  OLED1.begin(16,2); //16  2 
  OLED1.clear();
  OLED1.setCursor(0,0); // ,  
  OLED1.print("-22,3\337C"); //10  
  OLED1.setCursor(11,0); // , 11 
  OLED1.print("10:22"); //
  OLED1.setCursor(0,1); //   
  OLED1.print("16.01.17 "); // 16  
  OLED1.setCursor(13,0); // , 13  ":"
  OLED1.blink(); // 
   delay(1000);
}

void loop() {
/*        
        13,0 
    blink
*/
}


ऊपर वर्णित पुस्तकालय में सभी विशेषता परिवर्तन यहां लागू होते हैं। कार्यक्रम यह भी दिखाता है कि कोलन पलक कैसे बनाएं: पलक () फ़ंक्शन का उपयोग करते हुए मिनट ध्यान दें कि एक ही स्थिति में एक नया आउटपुट परिचितपन को नष्ट कर देता है, और इसे अपडेट करते समय, आपको इसे फिर से शुरू करना होगा, पहले से अदृश्य कर्सर को उसी स्थिति में शून्य पंक्ति में 13 पर सेट करना होगा। एक वास्तविक घड़ी अपडेट के साथ, 11-12 और 14-15 की स्थिति में केवल संख्याओं को अपडेट करना आसान हो सकता है, जिससे पलक झपकी बरकरार रहती है।

उदाहरण के आउटपुट के परिणाम फोटो में दिखाए गए हैं:

छवि

यह ध्यान दिया जाना चाहिए कि फोटो हरे रंग की ओएलईडी डिस्प्ले (इस मामले में) की चमक को व्यक्त नहीं करता है। वास्तव में, यह एक गहरे हरे रंग का रंग है, जिसमें एलईडी डिस्प्ले (सात-खंड या मैट्रिक्स) में सामान्य 568 एनएम से कम तरंग दैर्ध्य है। OLED की पृष्ठभूमि के खिलाफ उत्तरार्द्ध "फीका" क्यों लगता है, और उनका संयुक्त अनुप्रयोग मुश्किल है।

WS0010 में एक ग्राफिकल मोड है, और Winstar ग्राफिकल OLED डिस्प्ले (जैसे WEG010016) में भी यह कंट्रोलर है। किसी ने देखा कि उनके पास एक ही मैट्रिक्स भी है। मेरी राय में, एक टेक्स्ट लाइन डिस्प्ले पर ग्राफिक मोड लागू करने की कोशिश करना व्यर्थ है: लाइन डिस्प्ले में वर्णों और लाइनों के बीच हार्डवेयर-सेट डार्क स्पेस होते हैं जो तस्वीर को बेहद अशोभनीय बनाते हैं ( ऐसे प्रयासों के कई उदाहरण देखें )।

एक अंतिम नोट: Winstar OLEDs के स्थायित्व पर। डेटशीट में, समय 100,000 घंटे, यानी 11 साल का संकेत दिया गया है। फिर भी, रिलीज़ के 13 वें वर्ष (पीली चमक) के वर्तमान क्षण (16 वीं सर्दियों) के प्रदर्शनों में से एक ने मुझमें चमक खो दी है। यह मजेदार है कि बाकी समान (हरे) और बाद में (पीले और 14 साल पुराने) पार्टी मरने के कोई संकेत नहीं दिखाते हैं। इसलिए, निश्चितता के साथ, मैं कुछ भी कहने के लिए नहीं मानता हूं, लेकिन सिर्फ मामले में, मैं आपको सलाह देता हूं कि बोर्ड में डिस्प्ले को मिलाप न करें, बल्कि उन्हें कनेक्टर्स पर स्थापित करें, ताकि मामले में इसे बिना समस्याओं के बदला जा सके।

आप संग्रह को एक मुफ्त पुस्तकालय और यहां से एक उदाहरण के साथ डाउनलोड कर सकते हैं

UPD: शक्ति में हेरफेर किए बिना एक स्थिर शुरुआत की समस्या का समाधान था:
https://geektimes.ru/post/287234/

Source: https://habr.com/ru/post/hi400833/


All Articles