Arduino uno anolog pin dijital kullanim

Erraynn

Üye
Katılım
5 Şub 2021
Mesajlar
19
Puanları
1
Yaş
34
Merhaba arkadaşlar Arduino Nano da A0 pininde bir ledi flaş yaptırmaya çalışıyorum internette araştırdığımda anolog pinleri dijital pin olarak kullanabilecegimi öğrendim.
Ancak şöyle bir sorunum var. Pinmode 14 numaralı pimi çıkış olarak tanimliyorum sonra sonsuz döngüde


Digitalwrite (14, HIGH);
Delay(1000);
Digitalwrite(14,LOW);
Delay(1000);


Yazıyorum ancak bir saniye yanıp bir saniye sönmesi gerekirken. LED anlık yanıp sönüyor 2 sn bekliyor
 
pinMode(A0,OUTPUT); yap setup içine
digitalWrite(A0,HIGH);
delay(1000);
 
Normalde a0 pinindeki ledi yakıp sondurmenin normal çalıştığını gördüm. P10 Panel de yazı yazdiriyorum. Kademe kademe konrol ettim ve gördüm ki begin() fonksiyonunu tanimladigim anda anolog girişler çalışmıyor begin fonksiyonu da P10 paneli hazır hale getiriyor ve anolog pinleri hiç birisini de kullanmıyor ama neden se digitalwrite (A0,HIGH);. komutunu bozuyor
 
Abicim çok gizli bi deney değilse dünyayı ele geçirmeye felan çalışmıyorsan paylaş şu kodu görelim. Nerden biliyim neden çalışmıyor
 
Abicim çok gizli bi deney değilse dünyayı ele geçirmeye felan çalışmıyorsan paylaş şu kodu görelim. Nerden biliyim neden çalışmıyor
fakirmaker ustam bilgisayarın başında değildi işte kodum da bu


#include <avr/io.h>
#include <SPI.h>
#include <DMD2.h>
#include <fonts/Arial_Black_16.h>
#define USART_BAUDRATE 9600
unsigned int sayac=0, toplam=0, sys=0,slva=0,slvb=0,slvc=0,slvd=0,slve=0,slvf=0,slvg=0;

byte level=1,a=2,b=3,c=4,d=5,e=10,f=12,g=14;
byte low=0,high=0;
bool aa=0,bb=0,cc=0,dd=0,ee=0,ff=0,gg=0,interrupt=0;
bool stringComplete = false;
SoftDMD dmd(2,1); // DMD controls the entire display
DMD_TextBox box(dmd, 0, 1);





void setup() {


Serial.begin(9600);
dmd.setBrightness(100);
dmd.selectFont(Arial_Black_16);
dmd.begin(); // bu komutu sildiğimde A0 pini çalışması gerektiği gibi çalışıyor ancak p10 panelin komutu burası
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);


digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);

}

void loop()
{

if(aa==1)
{
slva=0;
aa=0;
DMD_TextBox box(dmd, 45, 0);
box.print("A");
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
delay(500);
}

if(bb==1)
{
slvb=0;
bb=0;
DMD_TextBox box(dmd, 45, 0);
box.print("B");
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
delay(500);
}

if(cc==1)
{
slvc=0;
cc=0;
DMD_TextBox box(dmd, 45, 0);
box.print("C");
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
delay(500);
}

if(dd==1)
{
slvd=0;
dd=0;
DMD_TextBox box(dmd, 45, 0);
box.print("D");
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
delay(500);
}

if(ee==1)
{
slve=0;
ee=0;
DMD_TextBox box(dmd, 45, 0);
box.print("E");
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
delay(500);
}

if(ff==1)
{
slvf=0;
ff=0;
DMD_TextBox box(dmd, 45, 0);
box.print("F");
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
delay(500);
}

if(gg==1)
{
slvg=0;
gg=0;
DMD_TextBox box(dmd, 45, 0);
box.print("G");
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
delay(500);
}
toplam=slva+slvb+slvc+slvd+slve+slvf+slvg;

box.clear();
box.print(toplam);



if(level==1)
{
aa=1;
slva=0;
digitalWrite(a,HIGH);
delay(1000);


}

if(level==2)
{
bb=1;
slvb=0;
digitalWrite(b,HIGH);
delay(1000);

}

if(level==3)
{
cc=1;
slvc=0;
digitalWrite(c,HIGH);
delay(1000);

}

if(level==4)
{
dd=1;
slvd=0;
digitalWrite(d,HIGH);
delay(1000);

}

if(level==5)
{
ee=1;
slve=0;
digitalWrite(e,HIGH);
digitalWrite(e,HIGH);
delay(1000);

}

if(level==6)
{
ff=1;
slvf=0;
digitalWrite(f,HIGH);
delay(1000);

}

if(level==7)
{
gg=1;
slvg=0;
digitalWrite(g,HIGH); // sorunum burası 1 saniye çıkış vermesi gerekirken anlık led yanıp sönüyor(genel sorunumu bulmak için led bağlayarak kontrol ettiğimde bu sorunu saptadım)

delay(1000);
}

level++;
if(level>=8) level=1;

}


void serialEvent() {
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);

byte sonuc=0;
high=0;
low=0;
sayac =0;
if (Serial.available() > 0)
{
low= Serial.read();
high= Serial.read();
sonuc=Serial.read();

sayac=high;
sayac=sayac<<8;
sayac |=low;
high=0;
low=0;

if(sonuc==67)
{
sonuc=0;

if(aa==1){
aa=0;
slva=sayac;
sayac=0;


}
if(bb==1){
bb=0;
slvb=sayac;
sayac=0;

}

if(cc==1){
cc=0;
slvc=sayac;
sayac=0;

}

if(dd==1){
dd=0;
slvd=sayac;
sayac=0;

}

if(ee==1){
ee=0;
slve=sayac;
sayac=0;

}

if(ff==1){
ff=0;
slvf=sayac;
sayac=0;

}

if(gg==1){
gg=0;
slvg=sayac;
sayac=0;

}

}
}
}
 
Sanıyorum bu ekranın arka planda kendini yenilemesinden kaynaklanıyor.

Kod:
dmd.begin();
yerine
Kod:
dmd.beginNoTimer();
kullan ve ekrana yaptırdığın her işlemden sonra mesela
Kod:
box.print("D");
yazdıkatan hemen sonra
Kod:
dmd.scanDisplay();
kodunu yaz. Manuel olarak ekranı yenilesin. Eğer olmazsa

Kod:
SoftDMD dmd(2, 1);
yerine
Kod:
SoftDMD dmd(2, 1, pin_noe, pin_a, pin_b,pin_sck,pin_clk, pin_r_data)

yazarak DMD nin pinlerini değiştir dahili spi dan ayırıp kafana göre pinler ver bir tanesini A0 yap böylelikle otomatik olarak kendisi kontrol etsin A0 pinini. Sen A0 yerine boşa çıkmış başka bir pin kullanırsın.
 
Sanıyorum bu ekranın arka planda kendini yenilemesinden kaynaklanıyor.

Kod:
dmd.begin();
yerine
Kod:
dmd.beginNoTimer();
kullan ve ekrana yaptırdığın her işlemden sonra mesela
Kod:
box.print("D");
yazdıkatan hemen sonra
Kod:
dmd.scanDisplay();
kodunu yaz. Manuel olarak ekranı yenilesin. Eğer olmazsa

Kod:
SoftDMD dmd(2, 1);
yerine
Kod:
SoftDMD dmd(2, 1, pin_noe, pin_a, pin_b,pin_sck,pin_clk, pin_r_data)

yazarak DMD nin pinlerini değiştir dahili spi dan ayırıp kafana göre pinler ver bir tanesini A0 yap böylelikle otomatik olarak kendisi kontrol etsin A0 pinini. Sen A0 yerine boşa çıkmış başka bir pin kullanırsın.
ustam sorun sadece A0 pininde de değil anolog atanmış pinlerin hepsi boyle davranıyor.
 
ustam sorun sadece A0 pininde de değil anolog atanmış pinlerin hepsi boyle davranıyor.
Evet daha başka sorun var mı? Bu bilgiyi baştan versen sanırım kitaplığı incelemezdim. Yani yukarıda yazdıklarımı boşa yazmış oldum. Bir pinin analog fonsksiyonu olması asıl i/o fonksiyonunu etkilemez. Analog pinler sen okumak isteyene kadar dijital gibi davranır. Analog fonksiyon ekstra bir fonksiyondur. Eğer analog pinlerin hepsi etkileniyorsa arduinodan veya dmd kitaplığından değil senin yazdığın koddan kaynaklanıyordur. serialEvent() fonksiyonu muhtemelen bu problemin kaynağıdır. serialEvent() fonksiyonu her karakter geldiğinde bayrak verir kesme üretir. Sen her karakter geldiğinde tekrar bir karakter gelmesini bekliyorsun. İkinci karakter geldiğinde kesme içinde kesme üretiyor, ve her seferinde senin aşağıdaki muhteşem kodunu çalıştırarak pinleri sıfırlıyor.

C-like:
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

serial kesmesi için arduino nun örneklerinde gayet güzel bir kod var onu kendi koduna uyarlamalısın.

C++:
/*
  Serial Event example

  When new serial data arrives, this sketch adds it to a String.
  When a newline is received, the loop prints the string and clears it.

  A good test for this is to try it with a GPS receiver that sends out
  NMEA 0183 sentences.

  NOTE: The serialEvent() feature is not available on the Leonardo, Micro, or
  other ATmega32U4 based boards.

  created 9 May 2011
  by Tom Igoe

  This example code is in the public domain.

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/SerialEvent
*/

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup() {
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
 
Evet daha başka sorun var mı? Bu bilgiyi baştan versen sanırım kitaplığı incelemezdim. Yani yukarıda yazdıklarımı boşa yazmış oldum. Bir pinin analog fonsksiyonu olması asıl i/o fonksiyonunu etkilemez. Analog pinler sen okumak isteyene kadar dijital gibi davranır. Analog fonksiyon ekstra bir fonksiyondur. Eğer analog pinlerin hepsi etkileniyorsa arduinodan veya dmd kitaplığından değil senin yazdığın koddan kaynaklanıyordur. serialEvent() fonksiyonu muhtemelen bu problemin kaynağıdır. serialEvent() fonksiyonu her karakter geldiğinde bayrak verir kesme üretir. Sen her karakter geldiğinde tekrar bir karakter gelmesini bekliyorsun. İkinci karakter geldiğinde kesme içinde kesme üretiyor, ve her seferinde senin aşağıdaki muhteşem kodunu çalıştırarak pinleri sıfırlıyor.

C-like:
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

serial kesmesi için arduino nun örneklerinde gayet güzel bir kod var onu kendi koduna uyarlamalısın.

C++:
/*
  Serial Event example

  When new serial data arrives, this sketch adds it to a String.
  When a newline is received, the loop prints the string and clears it.

  A good test for this is to try it with a GPS receiver that sends out
  NMEA 0183 sentences.

  NOTE: The serialEvent() feature is not available on the Leonardo, Micro, or
  other ATmega32U4 based boards.

  created 9 May 2011
  by Tom Igoe

  This example code is in the public domain.

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/SerialEvent
*/

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup() {
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
Ustam serial event aslında seri port kesmesi değil. Neden mi diyecek olursan ben sistemimi while döngüleri ile yaptım while döngüsü içinde ilgili slavin veri gönder pinine high yaptım slave veri gönderiyor ancak mastır while in içinden çıkamıyor yani serial event kesme oluşturmuyor yani woid loop takı kodla
Evet daha başka sorun var mı? Bu bilgiyi baştan versen sanırım kitaplığı incelemezdim. Yani yukarıda yazdıklarımı boşa yazmış oldum. Bir pinin analog fonsksiyonu olması asıl i/o fonksiyonunu etkilemez. Analog pinler sen okumak isteyene kadar dijital gibi davranır. Analog fonksiyon ekstra bir fonksiyondur. Eğer analog pinlerin hepsi etkileniyorsa arduinodan veya dmd kitaplığından değil senin yazdığın koddan kaynaklanıyordur. serialEvent() fonksiyonu muhtemelen bu problemin kaynağıdır. serialEvent() fonksiyonu her karakter geldiğinde bayrak verir kesme üretir. Sen her karakter geldiğinde tekrar bir karakter gelmesini bekliyorsun. İkinci karakter geldiğinde kesme içinde kesme üretiyor, ve her seferinde senin aşağıdaki muhteşem kodunu çalıştırarak pinleri sıfırlıyor.

C-like:
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

serial kesmesi için arduino nun örneklerinde gayet güzel bir kod var onu kendi koduna uyarlamalısın.

C++:
/*
  Serial Event example

  When new serial data arrives, this sketch adds it to a String.
  When a newline is received, the loop prints the string and clears it.

  A good test for this is to try it with a GPS receiver that sends out
  NMEA 0183 sentences.

  NOTE: The serialEvent() feature is not available on the Leonardo, Micro, or
  other ATmega32U4 based boards.

  created 9 May 2011
  by Tom Igoe

  This example code is in the public domain.

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/SerialEvent
*/

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup() {
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
Fakir maker üstadım olur mu öyle şey boşa yazmak. İlgi yardımlarindan dolayı çok çok teşekkür ederim. Serial event in uğraşların sonucunda aslında serial kesme olmadığını keşfettim. Woid loop komutları islendikten sonra en alt konuttan sonra serial eventi kontrol ediyor. Neden böyle kanıya vardım peki. Oda şöyle oldu ben yazılımımı while yapısıyla yaptım ancak while yapısından ne yaptıysam çıkaramadım programımi. Bir önceki while yapısını her serial kesme geldiğinde verii okunacak ve bı sonraki while nin şartı saglanacakti ama gelgorki öyle olmadı. Yukarıda paylaştığım yapı tam olarak çalışıyor aslında ama şöyle bir problem oluyor. Normalde 1 er saniyelik aralıklarla 7 adet slave den veriyi çekmesi lagzim ama 6 tanesini alıyor 7. Ci yi ise bazen alabiliyor bazen alamıyor du. Bu sorunda şundan kaynaklanıyor dmd den arta kalan 6 adet dijital çıkışa bağlı slaveler sorunsuz ama A0 pinine bağlı slave sorun yaratıyordu. O da şundan dolayı kaynaklı ben A0 pinini lojik high yaptığımda A0 pini anlık pals atıyor bunuda slave bazen yakalıyor bazen yakalayamiyor. Sonra A0 dan A1,A2,A3,. ... Hepsine bağladım ama hepsi aynı sorunu yaptı normalde 1 sn yanık kalması lagzim ama anlık pals atıyor. Sorunu çözemedim. Sonra sistemi ardu megaya yükledim ve dijital pinlerle atamaları yaptım. Yukarıdaki koduyukledim her şey yolunda hiçbir sorun yok 7 ayrı slaveden hiç hata vermeden haberlesiyor. Serial eventi serial kesme olarak düşünüyordum amaaaaa. Değilmiş. Ancak halaa kafam basmıyor dmd kütüphanesi neden anolog atanmış pinleri bozuyor
 

Forum istatistikleri

Konular
129,835
Mesajlar
930,600
Kullanıcılar
452,663
Son üye
Yılmaz Çetiner

Yeni konular

Çevrimiçi üyeler

Geri
Üst