Gönderen Konu: AD8318 ile RF Power meter  (Okunma sayısı 6028 defa)

Çevrimdışı TA1AYH

AD8318 ile RF Power meter
« : 03 Kasım 2022, 12:59:47 »
Merhaba,
anten çalışmalarında kullanmak üzere ihtiyacım olan RF Power metre için bir süredir beklediğim AD8318 modülü gelince projeyi bitirmek lazımdı, bitti ve güzel çalışıyor.
iki önyüz kullandım, üzerinde on off harici switch olmadığından cihaz her açılışında diğer önyüz ile açılıyor.
eklerde 3D çizim ve arduino kodunu aşağıda bulabilirsiniz. 73



#include "U8glib.h"
U8GLIB_SH1106_128X64_2X u8g(U8G_I2C_OPT_NO_ACK);

#if defined(ESP8266) || defined(ESP32) || defined(AVR)
#include <EEPROM.h>
#endif
const int eepromWindowAdress = 4;
const int Buzzer_PIN = 10;
const int Sensor_PIN = A0;  //A0
int eepromWindow = 0;

// arc
int xmax = 131;
int ymax = 64;
int xcenter = xmax / 2;
int ycenter = ymax / 2 + 10;
int arc = ymax / 2;
char* label[] = { "TA1AYH", "RF POWER", "dBm" };
int labelXpos[] = { 46, 45, 56 };
int maxf = 10;
uint8_t Angle = 0;
volatile int bilink = 0;
unsigned long bilinkTime = 0;

// graph
const int WIDTH = 128;
const int HEIGHT = 64;
const int LENGTH = WIDTH;
int x = 19;
int y[LENGTH];
int DisplayType = 0;
float IR_Val = 0;
int Cleared = 1;
unsigned long Max_Time = 0;
float Max_Val = 0;
String Max_ValT;

void setup() {
  pinMode(Buzzer_PIN, OUTPUT);
  //Serial.begin(115200);
  eepromWindow = readIntFromEEPROM(eepromWindowAdress);
  if (eepromWindow == 0) {
    eepromWindow = 1;
  } else {
    eepromWindow = 0;
    clearY();
    drawChart();
  }
  SavetoEEPROM(eepromWindowAdress, eepromWindow);
  /*
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_helvR14r);
    u8g.setPrintPos(18, 25);
    u8g.println("dBi METER");
    u8g.setFont(u8g_font_6x10);
    u8g.setPrintPos(12, 45);
    u8g.println("8Ghz     By TA1AYH");
    u8g.drawRFrame(4, 4, 124, 60, 10);
  } while (u8g.nextPage());
  delay(2000);
 */
}

void loop() {
  IR_Val = map(analogRead(Sensor_PIN), 430, 97, 0, 75);
  //Serial.println(analogRead(IR_Val));

  if (IR_Val < 0) IR_Val = 0;
  else if (IR_Val > 75) IR_Val = 75;

  if (IR_Val > Max_Val) {
    Max_Val = IR_Val;
    Max_Time = millis();
  } else if ((millis() - Max_Time) > 10000) {
    Max_Val = IR_Val;
    Max_Time = millis();
  }
  Max_ValT = String(Max_Val - 70, 0);

  if ((millis() - bilinkTime) > 500) {
    if (bilink == 0) bilink = 1;
    else bilink = 0;
    bilinkTime = millis();
  }
  if (eepromWindow == 0) {
    Graph();
    delay(50);
  } else {
    if (IR_Val >= 70) {
      digitalWrite(Buzzer_PIN, HIGH);
    } else if (IR_Val > 37) {
      digitalWrite(Buzzer_PIN, HIGH);
      delay(240 - IR_Val * 3);
      digitalWrite(Buzzer_PIN, LOW);
    } else {
      digitalWrite(Buzzer_PIN, LOW);
    }
    Arcer();
  }
}
void Arcer() {
  Angle = map(IR_Val, 0, 75, 0, 90);

  if (Angle < 45) {
    Angle = Angle + 135;
  } else {
    Angle = Angle - 45;
  }

  u8g.firstPage();
  do {
    gauge(Angle);
  } while (u8g.nextPage());
}
// ------------------------------------------------- void gauge() ------------------------------------------

void gauge(uint8_t angle) {
  u8g.drawCircle(xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_RIGHT);
  u8g.drawCircle(xcenter, ycenter, arc + 4, U8G_DRAW_UPPER_RIGHT);
  u8g.drawCircle(xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_LEFT);
  u8g.drawCircle(xcenter, ycenter, arc + 4, U8G_DRAW_UPPER_LEFT);

  float x1 = sin(2 * angle * 2 * 3.14 / 360);
  float y1 = cos(2 * angle * 2 * 3.14 / 360);

  u8g.drawLine(xcenter, ycenter, xcenter + arc * x1, ycenter - arc * y1);
  u8g.drawLine(xcenter, ycenter, xcenter + arc * sin(2 * 38.5 * 2 * 3.14 / 360), ycenter - arc * cos(2 * 38.5 * 2 * 3.14 / 360));

  u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_LEFT);
  u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_RIGHT);

  u8g.setFont(u8g_font_chikita);
  u8g.setFont(u8g_font_6x10);
  u8g.setPrintPos(1, 10);

  if (bilink == 0)
    u8g.print("dBm");
  else
    u8g.print("   ");

  u8g.setPrintPos(labelXpos[0], 29);
  u8g.print(label[0]);
  u8g.drawStr(6, 42, "-70");
  u8g.drawStr(16, 18, "-51");
  u8g.drawStr(54, 16, "-32");
  u8g.drawStr(97, 18, "-14");
  u8g.drawStr(110, 42, "5");

  int DBM_Val = map(IR_Val, 0, 75, -70, 5);

  u8g.setFont(u8g_font_profont22);
  if (DBM_Val >= 0) {
    u8g.setPrintPos(57, 62);
  } else {
    u8g.setPrintPos(47, 62);
  }
  u8g.print(DBM_Val);
  if (maxf == 0) u8g.setFont(u8g_font_6x10);
  else u8g.setFont(u8g_font_helvR14r);
  u8g.setPrintPos(95, 62);
  u8g.print(Max_ValT.c_str());
}
void Graph() {
  if (Cleared == 0) {
    x = 19;
    clearY();
    Cleared = 1;
  }

  y[x] = map(IR_Val, 0, 75, HEIGHT - 4, 13);

  u8g.firstPage();
  do {
    drawChart();
    drawY();
    u8g.drawStr(0, y[x] + 2, String(IR_Val - 70, 0).c_str());  //
    //u8g.drawRFrame(0, 0, 94, 13, 2);  // draws frame with rounded edges
    u8g.setFont(u8g_font_6x10);
    u8g.setPrintPos(60, 10);
    u8g.print("Max");
    u8g.setPrintPos(85, 10);
    u8g.print(Max_ValT.c_str());
    u8g.print(" dBm");
  } while (u8g.nextPage());

  x++;
  if (x >= WIDTH - 1) {
    Cleared = 0;
  } else if (y[x] >= HEIGHT - 13) {
    Cleared = 0;
  }
}
void drawChart() {
  u8g.drawLine(19, 14, 19, 63);  // Y ax
                                 //  u8g.drawLine(19, 20, 128, 20);  // X ax

  for (int i = 14; i <= WIDTH; i = i + 10) {
    if (i <= LENGTH) {
      if (i > 20) {
        //u8g.drawPixel(i, 19);
        u8g.drawPixel(i, 20);
      }
      u8g.drawPixel(20, i);
      u8g.drawPixel(21, i);
    } else if (i <= WIDTH) {
      //u8g.drawPixel(i, 19);
      u8g.drawPixel(i, 20);
    }
  }
}
void drawY() {
  for (int i = 20; i < LENGTH; i++) {
    if (y != -1) {
      //u8g.drawPixel(i - 1, y[i - 1]);
      u8g.drawLine(i - 1, y[i - 1], i, y);
    } else {
      break;
    }
  }
}

void clearY() {
  for (int i = 0; i < LENGTH; i++) {
    y = -1;
  }
}


void SavetoEEPROM(int address, int number) {
  byte byte1 = number >> 8;
  byte byte2 = number & 0xFF;
  EEPROM.write(address, byte1);
  EEPROM.write(address + 1, byte2);
}
int readIntFromEEPROM(int address) {
  return (EEPROM.read(address) << 8) + EEPROM.read(address + 1);
}

Çevrimdışı TA1AYH

Ynt: AD8318 ile RF Power meter
« Yanıtla #1 : 03 Kasım 2022, 13:42:45 »
Şeması ekte olup,

****************************        ÖNEMLİ NOT        ************************************

***************   PİLLERİ AYNI ANDA İKİ ÇIKIŞLI USB İLE ŞARJ ETMEYİNİZ !!!..... **************

    ****************  ÖNCE BİRİNİ SONRA DİĞERİNİ ŞARJ EDİNİZ ***************************

***********************************************************************************
« Son Düzenleme: 03 Kasım 2022, 13:53:02 Gönderen: TA1AYH »

Çevrimdışı TA3BC

Ynt: AD8318 ile RF Power meter
« Yanıtla #2 : 03 Kasım 2022, 13:49:24 »
Mehmet bey elinize sağlık güzel olmuş ..

Çevrimdışı TA1AYH

AD8307 RF Power meter Arduino kodu
« Yanıtla #3 : 03 Kasım 2022, 16:06:21 »
Teşekkürler Kemal bey.
.
.
.
.
Merhaba aşağıdaki kod AD8307 için yazıldı, 73

#include "U8glib.h"
U8GLIB_SH1106_128X64_2X u8g(U8G_I2C_OPT_NO_ACK);
#include <EEPROM.h>
const int eepromWindowAdress = 4;
const int Buzzer_PIN = 10;
const int Sensor_PIN = A0;  //A0
int eepromWindow = 0;

// arc
int xmax = 131;
int ymax = 64;
int xcenter = xmax / 2;
int ycenter = ymax / 2 + 10;
int arc = ymax / 2;
int maxf = 10;
uint8_t Angle = 0;
volatile int bilink = 0;
unsigned long bilinkTime = 0;

// graph
const int WIDTH = 128;
const int HEIGHT = 64;
const int LENGTH = WIDTH;
int x = 19;
int y[LENGTH];
int DisplayType = 0;
float IR_Val = 0;
int Cleared = 0;
unsigned long Max_Time = 0;
float Max_Val = 0;
String Max_ValT;

void setup() {
  pinMode(Buzzer_PIN, OUTPUT);
  //Serial.begin(115200);
  eepromWindow = readIntFromEEPROM(eepromWindowAdress);
  if (eepromWindow == 0) {
    eepromWindow = 1;
  } else {
    eepromWindow = 0;
  }
  SavetoEEPROM(eepromWindowAdress, eepromWindow);
}

void loop() {
  IR_Val = map(analogRead(Sensor_PIN), 61, 515, 0, 87);

  if (IR_Val < 0) IR_Val = 0;
  else if (IR_Val > 87) IR_Val = 87;

  if (IR_Val > Max_Val) {
    Max_Val = IR_Val;
    Max_Time = millis();
    maxf = 1;
  } else if ((millis() - Max_Time) > 10000) {
    Max_Val = IR_Val;
    Max_Time = millis();
    maxf = 0;
  }
  Max_ValT = String(Max_Val - 70, 0);

  if ((millis() - bilinkTime) > 500) {
    if (bilink == 0) bilink = 1;
    else bilink = 0;
    bilinkTime = millis();
  }

  if (eepromWindow == 0) {
    Graph();
    delay(50);
  } else {
    if (IR_Val >= 69) {
      digitalWrite(Buzzer_PIN, HIGH);
    } else if (IR_Val > 43) {
      digitalWrite(Buzzer_PIN, HIGH);
      delay(270 - IR_Val * 2.5);
      digitalWrite(Buzzer_PIN, LOW);
    } else if (IR_Val < 69) {
      digitalWrite(Buzzer_PIN, LOW);
    }
    Arcer();
  }
}
void Arcer() {
  Angle = map(IR_Val, 0, 87, 0, 90);

  if (Angle < 45) {
    Angle = Angle + 135;
  } else {
    Angle = Angle - 45;
  }

  u8g.firstPage();
  do {
    gauge(Angle);
  } while (u8g.nextPage());
}
// ------------------------------------------------- void gauge() ------------------------------------------

void gauge(uint8_t angle) {
  u8g.drawCircle(xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_RIGHT);
  u8g.drawCircle(xcenter, ycenter, arc + 4, U8G_DRAW_UPPER_RIGHT);
  u8g.drawCircle(xcenter, ycenter, arc + 6, U8G_DRAW_UPPER_LEFT);
  u8g.drawCircle(xcenter, ycenter, arc + 4, U8G_DRAW_UPPER_LEFT);

  float x1 = sin(2 * angle * 2 * 3.14 / 360);
  float y1 = cos(2 * angle * 2 * 3.14 / 360);

  u8g.drawLine(xcenter, ycenter, xcenter + arc * x1, ycenter - arc * y1);
  u8g.drawLine(xcenter, ycenter, xcenter + arc * sin(2 * 26 * 2 * 3.14 / 360), ycenter - arc * cos(2 * 26 * 2 * 3.14 / 360));

  u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_LEFT);
  u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_RIGHT);

  u8g.setFont(u8g_font_chikita);
  u8g.setFont(u8g_font_6x10);
  u8g.setPrintPos(2, 10);

  if (bilink == 0)
    u8g.print("dBm");
  else
    u8g.print("   ");

  u8g.setPrintPos(45, 29);
  u8g.print("TA1AYH");

  u8g.drawStr(8, 40, "-70");
  u8g.drawStr(18, 14, "-48");
  u8g.drawStr(54, 18, "-26");
  u8g.drawStr(93, 14, "-5");
  u8g.drawStr(108, 40, "+17");

  int DBM_Val = map(IR_Val, 0, 87, -70, 17);

  u8g.setFont(u8g_font_profont22);
  if (DBM_Val >= 0) {
    u8g.setPrintPos(57, 62);
  } else {
    u8g.setPrintPos(47, 62);
  }
  u8g.print(DBM_Val);
  if (maxf == 0) u8g.setFont(u8g_font_6x10);
  else u8g.setFont(u8g_font_helvR14r);
  u8g.setPrintPos(95, 62);
  u8g.print(Max_ValT.c_str());
}
void Graph() {
  if (Cleared == 0) {
    x = 19;
    clearY();
    Cleared = 1;
  }

  y[x] = map(IR_Val, 0, 87, HEIGHT - 4, 13);

  u8g.firstPage();
  do {
    drawChart();
    drawY();
    u8g.drawStr(0, y[x] + 2, String(IR_Val - 70, 0).c_str());
    u8g.setFont(u8g_font_6x10);
    u8g.setPrintPos(2, 10);
    u8g.print("TA1AYH");
    u8g.setPrintPos(60, 10);
    u8g.print("Max");
    u8g.setPrintPos(85, 10);
    u8g.print(Max_ValT.c_str());
    u8g.print(" dBm");
  } while (u8g.nextPage());

  x++;
  if (x >= WIDTH - 1) {
    Cleared = 0;
  } else if (y[x] >= HEIGHT - 13) {
    Cleared = 0;
  }
}
void drawChart() {
  u8g.drawLine(19, 14, 19, 63);  // Y ax
  //u8g.drawLine(19, 20, 128, 20);  // X ax

  for (int i = 14; i <= WIDTH; i = i + 10) {
    if (i <= LENGTH) {
      if (i > 20) {
        //u8g.drawPixel(i, 19);
        u8g.drawPixel(i, 23);
      }
      u8g.drawPixel(20, i);
      u8g.drawPixel(21, i);
    } else if (i <= WIDTH) {
      //u8g.drawPixel(i, 19);
      u8g.drawPixel(i, 23);
    }
  }
}

void drawY() {
  for (int i = 20; i < LENGTH; i++) {
    if (y != -1) {
      //u8g.drawPixel(i - 1, y[i - 1]);
      u8g.drawLine(i - 1, y[i - 1], i, y);
    } else {
      break;
    }
  }
}

void clearY() {
  for (int i = 0; i < LENGTH; i++) {
    y = -1;
  }
}

void SavetoEEPROM(int address, int number) {
  byte byte1 = number >> 8;
  byte byte2 = number & 0xFF;
  EEPROM.write(address, byte1);
  EEPROM.write(address + 1, byte2);
}
int readIntFromEEPROM(int address) {
  return (EEPROM.read(address) << 8) + EEPROM.read(address + 1);
}

Çevrimdışı TA2GC

Ynt: AD8318 ile RF Power meter
« Yanıtla #4 : 05 Kasım 2022, 00:02:30 »
ilginç ve güzel projenizi daha iyi anlayabilmemiz için ,video türü bir şey ile çalışmasınıda görmek isteriz,elinize ,klavyenize sağlık..

Çevrimdışı TA1AYH

Ynt: AD8318 ile RF Power meter
« Yanıtla #5 : 05 Kasım 2022, 22:16:57 »
ilginç ve güzel projenizi daha iyi anlayabilmemiz için ,video türü bir şey ile çalışmasınıda görmek isteriz,elinize ,klavyenize sağlık..

Engin bey teşekkürler,

https://youtu.be/RoExsI9XssI

Çevrimdışı TA3BC

Ynt: AD8318 ile RF Power meter
« Yanıtla #6 : 06 Kasım 2022, 14:15:18 »
Mehmet bey  tekrar selamlar pil şarj modüllerinin tam numarası nedir ?

Çevrimdışı TA1AYH

Ynt: AD8318 ile RF Power meter
« Yanıtla #7 : 06 Kasım 2022, 14:56:54 »
Mehmet bey  tekrar selamlar pil şarj modüllerinin tam numarası nedir ?
Kemal bey, " TP4056 lityum pil şarj cihazı modülü " olarak aratırsanız bulabilirsiniz, 73's

Çevrimdışı TA1AYH

Ynt: AD8318 ile RF Power meter
« Yanıtla #8 : 07 Kasım 2022, 14:25:55 »
Merhaba,
yukarıda yolladığım kodu test ettiğimde, kopyala yapıştır sebebi ile, iki hata buldum. düzeltilmiş v1.1 'i ekli zip klasöründe bulabilirsiniz.
73's