Schupp icon

netzfrequenz

Schupp | PRO | 04/08/22 08:20:59 AM UTC (Edited) | 0 ⭐ | 405 👁️ | Never ⏰ | []
Arduino |

5.62 KB

|

None

|

0 👍

/

0 👎

#define TRUE 1
#define FALSE 0
#define SPI2_NSS_PIN 28
#include "SPI.h"
#include "winbondflash.h"
#include <Adafruit_GFX.h>
#include <ILI9488.h>
#include <Average.h>
 
HardwareTimer pulseTimer(4);
// Use hardware SPI (on Uno, #13, #12, #11) and the above for Enable,CS/DC,Reset
ILI9488 tft = ILI9488(28, PA8 , PB10);
winbondFlashSPI mem;
volatile uint16_t pulse_timer_overflow_counter = 0;
volatile uint32_t lastpulse = 0;
volatile uint32_t interval = 0;
volatile float frequency = 0;
boolean toggle = false;
int mescount = 0;
uint32_t cycleinteval = 0;
Average<float> ave(20);
uint8_t chartnow[480];
uint8_t chartlast[480];
void pulse_isr(void)
{
  uint32_t current_time = (pulse_timer_overflow_counter << 16) | pulseTimer.getCount();
  if (current_time < lastpulse)
  {
    interval = 0xFFFFFFFF - lastpulse + current_time;
  }
  else
  {
    interval = current_time - lastpulse;
  }
  if (toggle) {
 
    lastpulse = current_time;
    frequency = (float)(1000000UL / (float)interval);
    if (frequency > 49 && frequency < 51)
      ave.push(frequency);
    toggle = false;
  } else {
    toggle = true;
  }
}
uint8_t *buf;
uint8_t buffarr[8401];
 
void setup() {
  buf = buffarr;
 
  SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order
  SPI.setDataMode(SPI_MODE0); //Set the  SPI_2 data mode 0
  SPI.setClockDivider(SPI_CLOCK_DIV2);
 
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  pinMode(4, OUTPUT);
  Serial1.begin(115200);
  tft.begin();
  //  SPI.setFrequency(SPI_36MHZ)
  Serial1.println("Init Chip...");
  if (mem.begin(_W25Q64, SPI, 4))
    Serial1.println("OK");
  else
  {
    Serial1.println("FAILED");
 
  }
  //flash.begin();
  //flash.setClock(16000000);
 
  pulseTimer.pause();
  pulseTimer.setOverflow(65535);
  pulseTimer.setPrescaleFactor(72);
  pulseTimer.setMode(1, TIMER_OUTPUT_COMPARE);
  pulseTimer.setCompare(1, 65535);
  pulseTimer.attachInterrupt(1, pulse_overflow_isr);
  pulseTimer.refresh();
  pulseTimer.resume();
  pinMode(PB11, INPUT);
  attachInterrupt(PB11, pulse_isr, RISING);
  tft.setRotation(3);
  tft.fillScreen(ILI9488_BLACK);
  uint8_t x = tft.readcommand8(ILI9488_RDMODE);
  //Serial1.print("Display Power Mode: 0x"); //Serial1.println(x, HEX);
  x = tft.readcommand8(ILI9488_RDMADCTL);
  //Serial1.print("MADCTL Mode: 0x"); //Serial1.println(x, HEX);
  x = tft.readcommand8(ILI9488_RDPIXFMT);
  //Serial1.print("Pixel Format: 0x"); //Serial1.println(x, HEX);
  x = tft.readcommand8(ILI9488_RDIMGFMT);
  Serial1.print("Image Format: 0x"); Serial1.println(x, HEX);
  x = tft.readcommand8(ILI9488_RDSELFDIAG);
  String test = "Netzfrequenz";
  drawString(test, 1, 480 / 2 - (12 * 35 / 2), 0);
  drawmyimage(2084300, 0, 0, 480, 320);
 
 
}
 
void pulse_overflow_isr(void)
{
  pulse_timer_overflow_counter++;
}
 
//
 
int z = 0;
int p = 0;
void loop() {
  memcpy(chartlast, chartnow, 480);
  for (int i = 1; i < 480; i++) {
    chartnow[i - 1] = chartnow[i];
  }
  float floattemp = ave.mean();
  chartnow[479] = map((int)floattemp * 1000, 49700, 50300, 0, 100);
  Serial1.println(chartnow[479]);
  String freq = String(floattemp, 3);
  drawString(freq, 0, 480 / 2 - (12 * 35 / 2), 80);
 
  delay(200);
}
//skalierung
String oldstring = "";
 
void drawString(String mystring, uint8_t fontsize,  uint16_t x, uint16_t y  )
{
  int mywidth = 0;
  if (fontsize == 0)
    mywidth = 70;
  else  if (fontsize == 1)
    mywidth = 35;
  for (int i = 0; i < mystring.length(); i++)
  {
    char mychar = (char)mystring.charAt(i);
    if (mychar != (char)oldstring.charAt(i))
      drawChar(fontsize, mychar, x + mywidth * i, y);
  }
  oldstring = mystring;
}
 
void drawChar(uint8_t fontsize, char mychar, uint16_t x, uint16_t y) {
 
  int mywidth, myheight, mysize, frac1, frac2;
  unsigned long startpoint = 0;
  uint8_t ascii = (uint8_t)mychar;
  ascii = ascii - 32;
  //  Serial1.println(ascii);
  if (fontsize == 0 || fontsize == 5)
  {
    startpoint = 0;
    mywidth = 70;
    myheight = 119;
    frac1 = 8400;
    frac2 = 8400;
    //Serial1.println("font0");
 
  }
  else if (fontsize == 1)
  {
    startpoint = 1582700;
    mywidth = 35;
    myheight = 60;
    mem.read(startpoint + (ascii * mywidth * myheight * 2), buf, mywidth * myheight * 2 );
    buf[0] = 0;
    tft.drawImage(buf, x, y, mywidth, myheight );
  } else if (fontsize == 2)
  {
    startpoint = 1981700;
    mywidth = 18;
    myheight = 30;
  }
  mysize = mywidth * myheight;
  uint32_t time1 = 0;
  uint32_t time2 = 0;
  unsigned long timemics = micros();
  if (fontsize == 0)
  {
    mem.read(startpoint + (ascii * mywidth * myheight * 2), buf, frac1 );
    time1 = micros() - timemics;
    buf[0] = 0;
    tft.drawImage(buf, x, y, 70, 60 );
    time2 = micros() - timemics;
    mem.read(startpoint + frac1 + (ascii * mywidth * myheight * 2), buf, frac2);
    buf[0] = 0;
    tft.drawImage(buf, x, y + 59, 70, 59 );
 
  } else if (fontsize == 5)
  {
    int steps = 10;
    for (int i = 0; i < myheight; i += steps)
    {
      mem.read(startpoint + ((ascii * mywidth * myheight * 2) + i * mywidth * 2), buf, steps * 2 * mywidth );
      buf[0] = 0;
      tft.drawNewImage(buf, x, y + i, 70, steps );
    }
 
  }
  // Serial1.print(time1);
  // Serial1.print("-");
  // Serial1.println(time2 - time1);
 
}
uint8_t *bufimg = new uint8_t[961];
void drawmyimage(int startpoint, int x, int y, int picwidth, int picheight) {
  for (int i = 0; i < picheight; i++)
  {
    mem.read(startpoint + (i * picwidth * 2), bufimg, 960);
    buf[0] = 0;
    tft.drawImage(bufimg, 0, y + i, picwidth, 1 );
  }
}

Comments