Ardunio 2 analog kontrol

PROJJE

Üye
Katılım
8 Tem 2020
Mesajlar
26
Puanları
1
merhaba ardunio ile iki anolog girişi okuyan ve bu girişleri şartlı calıştırabilecegım bir kod yazmayı tasarlıyorum şöyle calısır

önce A6 VE A7 girişleri tanımlayalım 0-5v = 1023 deger okuyacak
A7 önce okumayacak A6 şartı gercekleştinde A7 okumaya baslıcak mesela A6 0-200mv =45 degerini
aştında A7 ye yönlendirip A7 okumaya devatetmesını ıstıyorum ve tekrar geri 45 degerin altına okuma geldınde okumayacak yani A6 kalıbrasyon yapacak kalıbrasyon gerceklesınce A7 calıstırıp okutmaya devam edecek

bunun do whıle ile denedim fakat sonsuz dongu yaptı geri geldımde okumadı yaptım kodlar asada


Kod:
merhaba     ardunio ile    iki   anolog  girişi okuyan    ve bu  girişleri  şartlı  calıştırabilecegım   bir kod yazmayı tasarlıyorum   şöyle  calısır   



         önce     A6 VE A7  girişleri  tanımlayalım    0-5v   = 1023  deger okuyacak

         A7    önce okumayacak       A6   şartı  gercekleştinde  A7 okumaya baslıcak    mesela   A6 0-200mv =45 degerini

   aştında    A7 ye   yönlendirip  A7 okumaya devatetmesını ıstıyorum    ve tekrar   geri   45 degerin altına  okuma  geldınde  okumayacak     yani A6 kalıbrasyon  yapacak kalıbrasyon gerceklesınce A7 calıstırıp  okutmaya devam edecek

    

bunun   do whıle    ile denedim fakat  sonsuz dongu yaptı   geri geldımde   okumadı  yaptım kodlar  asada

    

    





unsigned long oldTime = 0;
const long interval = 1000;

unsigned long  sensorPin = A7 ;
unsigned long  sensor = A6 ;
unsigned long  sensorC =20;

int sensorMin = 1023;
int sensorMax = 0;   
int sensorValue = 0;
unsigned int MinCAL = 10;
unsigned int MaxCAL = 1022;

byte calb=4;
byte out=5;


void setup()
{

pinMode( sensor , INPUT);   //  modlar :
pinMode(sensorPin, INPUT);
pinMode  (out,OUTPUT); 
pinMode  (calb,OUTPUT);

reads ();

}


   void loop()
{
  unsigned long currentMillis = millis();   
  if((currentMillis - oldTime) > interval)   
  {
    oldTime = currentMillis;  }               
  
       sensorC = analogRead(sensor);
     while (MinCAL>=MaxCAL)  { reads(); }
       digitalWrite  (out,1);

      sensorValue = analogRead(sensorPin);

  sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

  sensorValue = constrain(sensorValue, 0, 255);
  
{ if ( sensorValue>=250 )
  {digitalWrite(calb, 1);}
  else
  {digitalWrite(calb, 0);
delay (10);} 




}    }


void reads() {

  digitalWrite(  out, 0);
  sensorValue = analogRead(sensorPin);
   if (sensorValue > sensorMax) {
   sensorMax = sensorValue;  }
  if (sensorValue < sensorMin) {
    sensorMin = sensorValue;

  }
}
 
ffgg.png
 
Dostum çabanı takdir ediyorum ama aynı entegrenin kendi kendini kalibre etmesi gereksiz ve hatta saçmadır. Aynı silikon kılıfın içinde bulunan adc katları aynı çevresel etmenlerden etkilenir. İllaki kalibrasyon istiyorsan ikincil bi opamp kurman lazım. Eğer amacın kalibrasyon değil de 200mV altındaki değerleri gözardı edip üstündeki değerleri okumaksa sadece bir analog giriş yeterlidir. Aşağıdaki kod değer 45 üzerine çıkarsa kaydeder ve çıkışı bir yapar.

C++:
const int analogPin = A6; 
const uint16_t limit = 45;
const int cikisPin = 5;

uint16_t analogDeger = 0;
bool cikis = false;

unsigned long oldTime = 0;
const long interval = 1000;

void olcumYap(uint16_t *,bool *);

void setup() {
  pinMode(cikisPin,OUTPUT);
  digitalWrite(cikisPin,cikis);
  Serial.begin(115200);
}

void loop() {
  unsigned long currentMillis = millis();   
  if((currentMillis - oldTime) > interval)   
  {
    oldTime = currentMillis;
    olcumYap(&analogDeger,&cikis);
    digitalWrite(cikisPin,cikis);
    Serial.println(analogDeger);
    /*
     * analogDeger limit-1023 arası bir değer olacaktır.
     * onunla istediğini yapabilirsin
     */
    
  } 
}

void olcumYap(uint16_t *ad,bool *ck){
  uint16_t adeger = analogRead(analogPin);
  if(adeger > limit){
    *ad = adeger;
    *ck = true;
  }
  else{
    *ck = false;
    *ad = 0;
  }
}
 
Son düzenleme:
Dostum çabanı takdir ediyorum ama aynı entegrenin kendi kendini kalibre etmesi gereksiz ve hatta saçmadır. Aynı silikon kılıfın içinde bulunan adc katları aynı çevresel etmenlerden etkilenir. İllaki kalibrasyon istiyorsan ikincil bi opamp kurman lazım. Eğer amacın kalibrasyon değil de 200mV altındaki değerleri gözardı edip üstündeki değerleri okumaksa sadece bir analog giriş yeterlidir. Aşağıdaki kod değer 45 üzerine çıkarsa kaydeder ve çıkışı bir yapar.

C++:
const int analogPin = A6;
const uint16_t limit = 45;
const int cikisPin = 5;

uint16_t analogDeger = 0;
bool cikis = false;

unsigned long oldTime = 0;
const long interval = 1000;

void olcumYap(uint16_t *,bool *);

void setup() {
  pinMode(cikisPin,OUTPUT);
  digitalWrite(cikisPin,cikis);
  Serial.begin(115200);
}

void loop() {
  unsigned long currentMillis = millis();
  if((currentMillis - oldTime) > interval)
  {
    oldTime = currentMillis;
    olcumYap(&analogDeger,&cikis);
    digitalWrite(cikisPin,cikis);
    Serial.println(analogDeger);
    /*
     * analogDeger limit-1023 arası bir değer olacaktır.
     * onunla istediğini yapabilirsin
     */

  }
}

void olcumYap(uint16_t *ad,bool *ck){
  uint16_t adeger = analogRead(analogPin);
  if(adeger > limit){
    *ad = adeger;
    *ck = true;
  }
  else{
    *ck = false;
    *ad = 0;
  }
}



tesekürler
bu kodlarda zorlanmam normal galiba iyi elektronik tecrubesıne sahıbım ama kodlar bıraz daha cok deneme gerektriyor cogu devreyi karsılastırıcıları dizayn ediyorum ama karsılastırıcı opamplar koyduktan sonra atmega 328 niye var denmezmı zaten eskiden boyleydi mcu lar cıktı herseyi yaptırabılırız gıbı izlenim olustu bende
caibrasyona gelince ismini kalıbrasyon ben koydum aslında bir voltaj izleyici olarak calısacak ismine ne dersen o olur ???




45 deger civarında istememın nedeni bu aralıkta voltaj oynamaları oluyor ve atmega 328 olur olmadık cıkıs verdıyordu parazit gibi voltajı basıt filitretsekte ani voltaj hareketlerini görmezden gelemıyor sensor hassas ısı sensörü 0-5v veriyor özellikle 0-300mv arası cok hareketli ortamda ısınan herseyide algıladı ıcın iki anolog giriş düşündüm biri hep okusun A6 digeride onu takip etsin gibi tek giriş bende düşündüm zannedersem basit 40 deger alanı görmeyen kodlat buna benzerde oluypr

sensorValue = map( 40, 1023, 0, 255, gibi
 
Son düzenleme:
Aref pinini 100nf bir kondansatörle gnd a bağlarsan dalgalanma azalır, ama böyle işlemlerde saniyede bir yerine 10 kere ölçüm yapıp ortalamasını almak daha akla uygun olanıdır.
 
Kod:
//led tanımlamarı ve millis değerini tutacak değişken tanımları
int ledPin = 13, potPin = A0;
unsigned long zaman = 0, zamanx = 0;
int sayac = 0; //3 örneği sayacak sayaç
double ortalama, deger = 0; //ortalama için değişkenler

void setup() {

pinMode(ledPin, OUTPUT);
pinMode(potPin, INPUT);

}

void loop() {

ana kodu buraya yazıyoruz

//8 örneği 50 ms arlıklarla alalım
if (millis() – zaman > 50)
{
deger += analogRead(potPin);
sayac++;
if (sayac == 8) //sayaç değeri 8 olmuşsa ortalamayı al
{
ortalama = (double)deger / 8.0;
sayac = 0; //değerleri sıfırla
deger = 0;
}
zaman = millis();
}

//eğer ortalama 512 den büyükse ledi yakıp söndür

if (ortalama > 512)
{
if (millis() – zamanx> 200)
{
digitalWrite(ledPin, !digitalRead(ledPin));
zamanx = millis();
}
}
}





ortalama derken buna benzer bir kodmu olucak (yukarıdakı kodlar alıntıdır )

hafta sonu ısı kontrolu icin mcp4725 ile bir kod düzenlicem denemesını yapıp sızınle paylasıcam eksıklıklerim olacak galiba ögrenme aşamasındayım
yardımcı olursanız sevinirim
 
Evet tam olarak böyle birşey olması lazım. Yaptığını paylaşırsan yardımcı olurum
 
Evet tam olarak böyle birşey olması lazım. Yaptığını paylaşırsan yardımcı olurum





fgrr.jpg








merhaba calıstırdım kodlar derlemede sorunsuz yapmak istenen cizimle tam olarakta cizdim pcb kart benım tasarırmım promını tabı program yuklenmeyınce hıc bı ıse yaramıyor

ortalama almaya gerEk yok sanırım ilk okuma dan sonra sistemi tamamen millisle yapmak mumukunmu hıc delay olmuycak
(roleac A6 OKUMA komutu sadece 200ms de bir okuma yenıleme yapsın yeterlı


bu işinde üstesınden gelıcez insallah yardımcı ustalar sayesınde bu kart kendıne gelecek derlenen kodlar calısıyor fakat cok ıyı bir revizyona ıhtıyacı var tek sihirli bir dokunusa ıhtıyacı var

otomatik kazanc ptc direnci a2 ye gore azalıp artacaktı yetiştiremedim
A3 İLE D1 KOD ILAVE EDEMEDİM buton ile manuel calısır d0 kullandım a3 ve d1 aktıf olur gırısler yetmedi birde daha iyi anlasılması ıcın bır cızım paylastım
eproma hangı kazancdaysa o kazancı hep kayıtlı tutarak acılıp kapanmada aynı kalıyor

program atılan 10 11 12 13 gırısleri aynı zamanda giriş cıkıs olarak atanıyormu bır kere yaptım olmadı





fgrr.jpg








merhaba calıstırdım yapmak istenen cizimle tam olarakta cizdim pcb kart benım tasarırmım promını tabı program yuklenmeyınce hıc bı ıse yaramıyor bu işinde üstesınden gelıcez insallah yardımcı ustalar sayesınde bu kart kendıne gelecek derlenen kodlar calısıyor fakat cok ıyı bir revizyona ıhtıyacı var tek sihirli bir dokunusa ıhtıyacı var







Kod:
#include<Wire.h>                   //Include kutuphane ı2 data Wire
#define MCP4725 0X60
#include <EEPROM.h>  // kayıt:
unsigned long adc;
unsigned long karsilastir;
unsigned long buffer[3];

unsigned int rdt=0;
unsigned int rdtx=0;

unsigned int rdtmax=50;  
unsigned int rdtorta=250;

unsigned int x=0;
unsigned int roleac=50;


unsigned long  sensor = A6 ;   //  input  :
unsigned long  sensorPin = A7 ;   //  input  :
unsigned int rdtgiris = A2 ;  // input  swic :
unsigned long compr1 = A0 ;   //  input  ccommp:
unsigned long  compr2 = A1 ;  // input  cmp:

const byte  LED2Pin=1;
const byte  LED3Pin  =A3;
const byte ButtonPin =0;

byte kazancled=4; //  led  output:
byte npoutled=5; //   led cıkısı:
byte pwrled=6; //   led  cıkış :
byte trp=2; //  tr out:
byte trn=3; //   tr cıkış :
byte outcompv=8; // ao-a1 karsılastırma cıkış :
byte setswic=10; //   led cıkısı:
byte incompy = 7; // buton opamp 1-0 gırış:
byte incompx = 9; // 8 out koprusu 1-0 gırış:

byte Mode;     // kayıt hangi ledlerin olması gerektiğini gösteren mod tanıtım:


void setup()
         {



Mode = EEPROM[0];      // mod geçersizse (örn. fabrikada yeni eeprom 0xFF içeriyorsa), 0'a sıfırlayın:
  if (Mode > 2)
  {
    Mode = 0;   // set modları kayıt:
  }
      setLeds();   // ledleri eeprom değerine göre güncelleme:

pinMode  ( LED2Pin   , OUTPUT );  // s :
pinMode  (   LED3Pin , OUTPUT );  // s :
pinMode( ButtonPin , INPUT);   //  modlar :
pinMode(incompx, INPUT);   //  modlar :
pinMode(incompy, INPUT);   //  modlar :
pinMode  ( kazancled, OUTPUT );  // s :
pinMode  ( setswic, OUTPUT );  // s :
pinMode  ( trp, OUTPUT );  // s :
pinMode  ( trn , OUTPUT ); //  s :
pinMode  ( outcompv , OUTPUT ); //  s :
pinMode  (npoutled,OUTPUT);  //   sinyal cıkış NPN ve PNP out  :
pinMode  (pwrled,OUTPUT);  //  power ve rdt flaşör ve otomatik kazanc  düşürme  :
Wire.begin(0x60);
Wire.setClock (400000);

}

void loop()                
               {
               karsilastir  = analogRead(sensor);
                if ( x <= roleac )
                     {digitalWrite(setswic, 1);} delay (12);
                                           
     {                  
        adc = analogRead(sensorPin);
        adc = map(adc, 0 ,1023 ,0,4095);
   buffer[0] = 0b01000000;      
  buffer[1] = adc >> 4;        
  buffer[2] = adc << 4;        
  Wire.beginTransmission (0x60);  
  Wire.write(buffer[0]);      
  Wire.write(buffer[1]);      
  Wire.write(buffer[2]);      
  Wire.endTransmission();

                                                     
  {


    rdtx = analogRead(rdtgiris);
  if (rdt<= rdtmax )
  {digitalWrite(pwrled, 1);}
  else if  ( rdt >= rdtorta )
  {digitalWrite(pwrled, 0);}
  else
   {digitalWrite(pwrled, 1);}
   delay (50);
   {digitalWrite(pwrled, 0);}
  }
{
   unsigned long compr1 ,compr2 ;
   compr1 = analogRead ( A0) ;
   compr2 = analogRead ( A1) ;
   if (compr1 <= compr2 )
      {digitalWrite (outcompv ,1);}
      else
      {digitalWrite (outcompv ,0);
      delay (10);}
}
{
bool incompx = digitalRead(7);
  bool incompy = digitalRead(9);
  if (incompx == 1 &&  incompy == 1)
  {digitalWrite(trp, 1);
  digitalWrite(trn, 1);
  digitalWrite(npoutled, 1);
  delay (10); }
  else
     {digitalWrite(trp, 0);
     digitalWrite(trn, 0);
     digitalWrite(npoutled, 0);
     delay (10); }  
 
}

  unsigned long currentTime = millis();
  static boolean buttonWasPressed = false;      // son düğme durumunu hatırlamak için değişken:
  boolean buttonIsPressed = digitalRead(ButtonPin) == HIGH;
  static unsigned long lastStateChangeTime = 0;
  if (buttonIsPressed != buttonWasPressed && currentTime - lastStateChangeTime > 25)
  {    // düğme durumu değiştiyse ve son durum değişikliğine çok yakın değilse (geri dönme)
    buttonWasPressed = buttonIsPressed;  // buton durumunu hatırlı :
    lastStateChangeTime = currentTime;
    if (buttonIsPressed)             // Düğmeye basıldı:
    {
      Mode = (Mode + 1) % 3;  //sonraki mode :
        setLeds();
       EEPROM.put(0, Mode);  //  kaydet  mode 0 adrese :
    }
  }
  }
  }

       


void setLeds()
{
  digitalWrite (LED2Pin, (Mode == 1) ? HIGH : LOW);   // kayıt cıkıs ları adreslerın aktarılması:
  digitalWrite (LED3Pin, (Mode == 0) ? HIGH : LOW);
}
Kod:
fgrr.jpg








merhaba calıstırdım yapmak istenen cizimle tam olarakta cizdim pcb kart benım tasarırmım promını tabı program yuklenmeyınce hıc bı ıse yaramıyor

ortalama almaya gerEk yok sanırım ilk okuma dan sonra sistemi tamamen millisle yapmak mumukunmu hıc delay olmuycak
(roleac A6 OKUMA komutu sadece 200ms de bir okuma yenıleme yapsın yeterlı


bu işinde üstesınden gelıcez insallah yardımcı ustalar sayesınde bu kart kendıne gelecek derlenen kodlar calısıyor fakat cok ıyı bir revizyona ıhtıyacı var tek sihirli bir dokunusa ıhtıyacı var








Kod:
#include<Wire.h>                   //Include kutuphane ı2 data Wire
#define MCP4725 0X60
#include <EEPROM.h>  // kayıt:
unsigned long adc;
unsigned long karsilastir;
unsigned long buffer[3];

unsigned int rdt=0;
unsigned int rdtx=0;

unsigned int rdtmax=50; 
unsigned int rdtorta=250;

unsigned int x=0;
unsigned int roleac=50;


unsigned long  sensor = A6 ;   //  input  :
unsigned long  sensorPin = A7 ;   //  input  :
unsigned int rdtgiris = A2 ;  // input  swic :
unsigned long compr1 = A0 ;   //  input  ccommp:
unsigned long  compr2 = A1 ;  // input  cmp:

const byte  LED2Pin=1;
const byte  LED3Pin  =A3;
const byte ButtonPin =0;

byte kazancled=4; //  led  output:
byte npoutled=5; //   led cıkısı:
byte pwrled=6; //   led  cıkış :
byte trp=2; //  tr out:
byte trn=3; //   tr cıkış :
byte outcompv=8; // ao-a1 karsılastırma cıkış :
byte setswic=10; //   led cıkısı:
byte incompy = 7; // buton opamp 1-0 gırış:
byte incompx = 9; // 8 out koprusu 1-0 gırış:

byte Mode;     // kayıt hangi ledlerin olması gerektiğini gösteren mod tanıtım:


void setup()
         {



Mode = EEPROM[0];      // mod geçersizse (örn. fabrikada yeni eeprom 0xFF içeriyorsa), 0'a sıfırlayın:
  if (Mode > 2)
  {
    Mode = 0;   // set modları kayıt:
  }
      setLeds();   // ledleri eeprom değerine göre güncelleme:

pinMode  ( LED2Pin   , OUTPUT );  // s :
pinMode  (   LED3Pin , OUTPUT );  // s :
pinMode( ButtonPin , INPUT);   //  modlar :
pinMode(incompx, INPUT);   //  modlar :
pinMode(incompy, INPUT);   //  modlar :
pinMode  ( kazancled, OUTPUT );  // s :
pinMode  ( setswic, OUTPUT );  // s :
pinMode  ( trp, OUTPUT );  // s :
pinMode  ( trn , OUTPUT ); //  s :
pinMode  ( outcompv , OUTPUT ); //  s :
pinMode  (npoutled,OUTPUT);  //   sinyal cıkış NPN ve PNP out  :
pinMode  (pwrled,OUTPUT);  //  power ve rdt flaşör ve otomatik kazanc  düşürme  :
Wire.begin(0x60);
Wire.setClock (400000);

}

void loop()               
               {
               karsilastir  = analogRead(sensor);
                if ( x <= roleac )
                     {digitalWrite(setswic, 1);} delay (12);
                                          
     {                 
        adc = analogRead(sensorPin);
        adc = map(adc, 0 ,1023 ,0,4095);
   buffer[0] = 0b01000000;     
  buffer[1] = adc >> 4;       
  buffer[2] = adc << 4;       
  Wire.beginTransmission (0x60); 
  Wire.write(buffer[0]);     
  Wire.write(buffer[1]);     
  Wire.write(buffer[2]);     
  Wire.endTransmission();

                                                    
  {


    rdtx = analogRead(rdtgiris);
  if (rdt<= rdtmax )
  {digitalWrite(pwrled, 1);}
  else if  ( rdt >= rdtorta )
  {digitalWrite(pwrled, 0);}
  else
   {digitalWrite(pwrled, 1);}
   delay (50);
   {digitalWrite(pwrled, 0);}
  }
{
   unsigned long compr1 ,compr2 ;
   compr1 = analogRead ( A0) ;
   compr2 = analogRead ( A1) ;
   if (compr1 <= compr2 )
      {digitalWrite (outcompv ,1);}
      else
      {digitalWrite (outcompv ,0);
      delay (10);}
}
{
bool incompx = digitalRead(7);
  bool incompy = digitalRead(9);
  if (incompx == 1 &&  incompy == 1)
  {digitalWrite(trp, 1);
  digitalWrite(trn, 1);
  digitalWrite(npoutled, 1);
  delay (10); }
  else
     {digitalWrite(trp, 0);
     digitalWrite(trn, 0);
     digitalWrite(npoutled, 0);
     delay (10); } 

}

  unsigned long currentTime = millis();
  static boolean buttonWasPressed = false;      // son düğme durumunu hatırlamak için değişken:
  boolean buttonIsPressed = digitalRead(ButtonPin) == HIGH;
  static unsigned long lastStateChangeTime = 0;
  if (buttonIsPressed != buttonWasPressed && currentTime - lastStateChangeTime > 25)
  {    // düğme durumu değiştiyse ve son durum değişikliğine çok yakın değilse (geri dönme)
    buttonWasPressed = buttonIsPressed;  // buton durumunu hatırlı :
    lastStateChangeTime = currentTime;
    if (buttonIsPressed)             // Düğmeye basıldı:
    {
      Mode = (Mode + 1) % 3;  //sonraki mode :
        setLeds();
       EEPROM.put(0, Mode);  //  kaydet  mode 0 adrese :
    }
  }
  }
  }

      


void setLeds()
{
  digitalWrite (LED2Pin, (Mode == 1) ? HIGH : LOW);   // kayıt cıkıs ları adreslerın aktarılması:
  digitalWrite (LED3Pin, (Mode == 0) ? HIGH : LOW);
}
Kod:
 

Ekli dosyalar

  • hgjghjgh.png
    hgjghjgh.png
    83.4 KB · Görüntüleme: 13
Son düzenleme:
Evet tam olarak böyle birşey olması lazım. Yaptığını paylaşırsan yardımcı olurum
merhaba üstad

mcp 4725 cıkış kısmını

4095/5 bolmek ıcın ugrasıyorum cesıtlı deneme yaptım calısmadı

5v/4095 =0.001221001221 v cıkıyor
bunu 5 x 0.001221001221 yaptım 4095 = 5 degerinin voltaj karsılıgı
sonuc = 0,00610500610 cıktı

map fonksıyonuna bu işlemi yaptırabılırmıyım farklı denedım olmadı

adc = map(adc, 0 ,1023 ,0,4095/ 5 x 0,00610500610 ); derlıyor fakat voltaj işlemı yok bu konuda yardımcı olabılırmısın bunu nasıl yaptırırım
 
Analog değeri voltaja mı dönüştürmeye çalışıyorsun? Yani 0-4095 arası olan değeri 0-5 arasına mı dönüştürmeye çalışıyorsun. Eğer öyleyse map fonksiyonu float değer vermez yani 2.35 alamazsın o yüzden parametre olarak float değer de giremezsin. Şunu dene

Kod:
float yeni_adc = fmap(adc, 0, 4095, 0.0, 5.0); 

//En alta da bunfonksiyonu gir

float fmap(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
 
Son düzenleme:

Forum istatistikleri

Konular
128,118
Mesajlar
915,149
Kullanıcılar
449,823
Son üye
bulday

Yeni konular

Geri
Üst