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;
}
}
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;
}
}
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; } }
//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();
}
}
}
Evet tam olarak böyle birşey olması lazım. Yaptığını paylaşırsan yardımcı olurum
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
#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);
}
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:
merhaba üstadEvet tam olarak böyle birşey olması lazım. Yaptığını paylaşırsan yardımcı olurum
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; }
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?