Создание кнопок на экране ILI9341 с библиотекой Adafruit

Talion
Offline
Зарегистрирован: 12.01.2017

Здравствуйте.

Подскажите пожалуйста, проблема такая. Вот кусочек скетча:

#include <SPI.h>
#include <Wire.h>     
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <Adafruit_STMPE610.h>
//#include <EEPROM.h>
//#include "korrektur.h"
 
// For the Adafruit TFT shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10
 
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
 
// The STMPE610 uses hardware SPI on the shield, and #8
#define STMPE_CS 8
Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);
 
// This is calibration data for the raw touch data to the screen coordinates
#define TS_MINX 150
#define TS_MINY 130
#define TS_MAXX 3800
#define TS_MAXY 4000
 
//BUTTRN UI-------------------------------
#define BUTTON_X 50
#define BUTTON_Y 30
#define BUTTON_W 70
#define BUTTON_H 30
#define BUTTON_SPACING_X 2
#define BUTTON_SPACING_Y 2
#define BUTTON_TEXTSIZE 2
 
unsigned long milliold = 0;  
unsigned long millinew = 0;  
//korrekturwert(DK2JK)--------
//Korrektor_im_eeprom eeprom;
//int korrekturwert;
//DDS PIN---------------------
const int FQ_UD=7;
const int SDAT=6;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ;
const int SCLK=8;
const int RESET=5;
 
//Desplay Set(DG7EAO)----------
double vswrArray[110]; //Array Array für SWR
int z = 0;            // Index Index für Array
double SwrFreq = 1;  // Variable Variable für Freq. mit SWR Min.
double SwrMin = 0;   //  Variable für SWR Min.
double Freq1 = 1;     // Freq. Links unterste Zeile Display
double Freq2 = 15;    // Freq. Mitte unterste Zeile Display
double Freq3 = 30;    // Freq. Mitte unterste Zeile Display
 
int flag = 0; 
 
// wir auf 1 gesetzt bei Interrupt, in void Loop perform_sweep
double counter = 0;  // Zähler um erste Interrupts zu ignorieren
 
// Variablen
double Fstart_MHz = 1;  // Start Frequency for sweep
double Fstop_MHz = 30;  // Stop Frequency for sweep
double current_freq_MHz; // Temp variable used during sweep
long serial_input_number; // Used to build number from serial stream
int num_steps = 100; // Number of steps to use in the sweep
char incoming_char; // Character read from serial stream
 
unsigned long previousMillis = 0;  // will store last time LED was updated
 
// constants won't change :
const long interval = 1000;  
 
// create buttons---------------------
char buttonlabels[9][5] = { "3.5","7", "10", "14", "21", "28", "All", "Clr", "Scan"};
uint16_t buttoncolors[9] = {ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, 
                             ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, 
                             ILI9341_BLUE, ILI9341_GREEN, ILI9341_RED};
Adafruit_GFX_Button buttons[9];
 
Все библиотеки подключены. При компиляции спотыкается на строчке Adafruit_GFX_Button buttons[9];
При этом выдает ошибку:
ad9850adafuilt:95: error: 'Adafruit_GFX_Button' does not name a type
ad9850adafuilt.ino: In function 'void setup()':
ad9850adafuilt:116: error: 'buttons' was not declared in this scope
ad9850adafuilt.ino: In function 'void loop()':
ad9850adafuilt:150: error: 'buttons' was not declared in this scope
 
То есть предлагает объявить переменную buttons.
Но этот скетч писал не я, он целиком был скачан тут http://nyan.ldblog.jp/ad9850adafuilt.ino и у автора работал. В то же время я пересмотрел много подобных скетчей в интернете, и нигде эта переменная buttons не объявляется отдельно.
 
В чем может быть проблема, подскажите пожалуйста.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii и это обязательно.

2. Код целиком

3. Текст сообщения(й) компилятора целиком - прямым копи-пастом.

Talion
Offline
Зарегистрирован: 12.01.2017
/***************************************************************************
*  Name    : DDS_Sweeper.BAS                                                *
*  Author  : Beric Dunn (K6BEZ)                                             *
*  Notice  : Copyright (c) 2013  CC-BY-SA                                   *
*          : Creative Commons Attribution-ShareAlike 3.0 Unported License   *
*  Date    : 9/26/2013                                                      *
*  Version : 1.0                                                            *
*  Notes   : Written using for the Arduino Micro                            *
*          :   Pins:                                                        *
*          :   A0 - Reverse Detector Analog in                              *
*          :   A1 - Forward Detector Analog in                              *
*          : Modified by Norbert Redeker (DG7EAO) 07/2014                   *
*          : Modified by Heribert Schulte dk2jk 09/2014 //(hs)              *
*          : Modified by S.Nagou (JR5IZI) 10/2015                           *
*          : TFT Display adafruit-2-8-tft-touch-shield-V2                   *
*          : https://learn.adafruit.com/adafruit-2-8-tft-touch-shield-v2    *
****************************************************************************/
#include <SPI.h>
#include <Wire.h>     
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <Adafruit_STMPE610.h>
//#include <EEPROM.h>
//#include "korrektur.h"

// For the Adafruit TFT shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

// The STMPE610 uses hardware SPI on the shield, and #8
#define STMPE_CS 8
Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);

// This is calibration data for the raw touch data to the screen coordinates
#define TS_MINX 150
#define TS_MINY 130
#define TS_MAXX 3800
#define TS_MAXY 4000

//BUTTRN UI-------------------------------
#define BUTTON_X 50
#define BUTTON_Y 30
#define BUTTON_W 70
#define BUTTON_H 30
#define BUTTON_SPACING_X 2
#define BUTTON_SPACING_Y 2
#define BUTTON_TEXTSIZE 2

unsigned long milliold = 0;  
unsigned long millinew = 0;  
//korrekturwert(DK2JK)--------
//Korrektor_im_eeprom eeprom;
//int korrekturwert;
//DDS PIN---------------------
const int FQ_UD=7;
const int SDAT=6;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ;
const int SCLK=8;
const int RESET=5;

//Desplay Set(DG7EAO)----------
double vswrArray[110]; //Array Array für SWR
int z = 0;            // Index Index für Array
double SwrFreq = 1;  // Variable Variable für Freq. mit SWR Min.
double SwrMin = 0;   //  Variable für SWR Min.
double Freq1 = 1;     // Freq. Links unterste Zeile Display
double Freq2 = 15;    // Freq. Mitte unterste Zeile Display
double Freq3 = 30;    // Freq. Mitte unterste Zeile Display

int flag = 0; 

// wir auf 1 gesetzt bei Interrupt, in void Loop perform_sweep
double counter = 0;  // Zähler um erste Interrupts zu ignorieren

// Variablen
double Fstart_MHz = 1;  // Start Frequency for sweep
double Fstop_MHz = 30;  // Stop Frequency for sweep
double current_freq_MHz; // Temp variable used during sweep
long serial_input_number; // Used to build number from serial stream
int num_steps = 100; // Number of steps to use in the sweep
char incoming_char; // Character read from serial stream

unsigned long previousMillis = 0;  // will store last time LED was updated

// constants won't change :
const long interval = 1000;  

// create buttons---------------------
char buttonlabels[9][5] = { "3.5","7", "10", "14", "21", "28", "All", "Clr", "Scan"};
uint16_t buttoncolors[9] = {ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, 
                             ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, 
                             ILI9341_BLUE, ILI9341_GREEN, ILI9341_RED, 
                             };
Adafruit_GFX_Button buttons[9];

void setup() {
  Serial.begin(57600);
  pinMode(FQ_UD,OUTPUT);
  pinMode(SCLK,OUTPUT);
  pinMode(SDAT,OUTPUT);
  pinMode(RESET,OUTPUT);
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  analogReference(INTERNAL);
  digitalWrite(RESET,HIGH);
  digitalWrite(RESET,LOW);
  serial_input_number=0;
  //korrekturwert=  eeprom.read();
   
  // clear the screen
  tft.begin();
  tft.fillScreen(ILI9341_BLACK);
  for (uint8_t row=0; row<3; row++) {
    for (uint8_t col=0; col<3; col++) {
      buttons[col + row*3].initButton(&tft, BUTTON_X+col*(BUTTON_W+BUTTON_SPACING_X), 
                 BUTTON_Y+row*(BUTTON_H+BUTTON_SPACING_Y),  
                 BUTTON_W, BUTTON_H, ILI9341_WHITE, buttoncolors[col+row*3], ILI9341_WHITE,
                 buttonlabels[col + row*3], BUTTON_TEXTSIZE); 
      buttons[col + row*3].drawButton();
    }
  }
  
  //touchscreen start------------------
  if (!ts.begin()) {
    Serial.println("Couldn't start touchscreen controller");
    while (1);
  }
  Serial.println("Touchscreen started");
 CreateGrid();
}

void loop() {
 //touch screen control------------- 
 if (ts.bufferEmpty()) {
    return;}
   
 TS_Point p = ts.getPoint();
    p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
    p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
   //  Serial.print("("); Serial.print(p.x); Serial.print(", "); 
   //  Serial.print(p.y); Serial.print(", "); 
   //  Serial.print(p.z); Serial.println(") ");
  
 unsigned long currentMillis = millis();
    if(currentMillis - previousMillis >= interval) {
        previousMillis = currentMillis; 
    
  for (uint8_t b=0; b<9; b++) {
  if (buttons[b].contains(p.x, p.y)) {
     Serial.print("Pressing: "); Serial.println(b);
 //Sirial control --------------------------
  if(Serial.available()>0){
    incoming_char = Serial.read();
    switch(incoming_char){
     /*  case 'k':
      korrekturwert= serial_input_number;
      if ( (korrekturwert >=64) )
      { 
        korrekturwert = 64;
      }
       ist eeprom damit:
      eeprom.write(korrekturwert);
      serial_input_number=0;
      */
     //break;
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
      serial_input_number=serial_input_number*10+(incoming_char-'0');
      break;
    case 'A':
      //Turn frequency into FStart
      Fstart_MHz = ((double)serial_input_number)/1000000;
      serial_input_number=0;
      break;
    case 'B':
      //Turn frequency into FStop
      Fstop_MHz = ((double)serial_input_number)/1000000;
      serial_input_number=0;
      break;
    case 'C':
      //Turn frequency into FStart and set DDS output to single frequency
      Fstart_MHz = ((double)serial_input_number)/1000000;
      //SetDDSFreq(Fstart_MHz);
      SetDDSFreq(Fstart_MHz * 1000000);
      delay(100);
      SetDDSFreq(Fstart_MHz * 1000000);
      serial_input_number=0;    
      break;
    case 'N':
      // Set number of steps in the sweep
      num_steps = serial_input_number;
      serial_input_number=0;
      break;
    case 'S':    
    case 's':    
      Perform_sweep();
      break;
    case '?':
      // Report current configuration to PC    
      Serial.print("Start Freq:");
      Serial.println(Fstart_MHz*1000000);
      Serial.print("Stop Freq:");
      Serial.println(Fstop_MHz*1000000);
      Serial.print("Num Steps:");
      Serial.println(num_steps);
      //Serial.print("Korrekturwert:");
      break;
    }
    Serial.flush();     
  }
   //freq control--------------------------
           tft.setTextSize(2);
       if  (b==0){tft.setTextColor (ILI9341_CYAN);tft.fillRect(195,150,35,15,ILI9341_BLUE);
           tft.setCursor(195, 150);tft.setTextColor (ILI9341_RED);tft.println("3.5");
           Fstart_MHz = 3.0;Fstop_MHz =4.0;Freq1 = 3.0; Freq2 =3.5;Freq3=4.0;}
        if (b==1){tft.setTextColor (ILI9341_RED);tft.fillRect(195,150,35, 15,ILI9341_BLUE);
           tft.setCursor(210, 150);tft.setTextColor (ILI9341_RED);tft.println("7");
           Fstart_MHz = 6.0;Fstop_MHz =8.0;Freq1 = 6.0; Freq2 =7.0;Freq3=8.0;}
        if (b==2){tft.setTextColor (ILI9341_RED);tft.fillRect(195,150,35, 15,ILI9341_BLUE);
           tft.setCursor(200, 150);tft.setTextColor (ILI9341_RED);tft.println("10");
           Fstart_MHz = 9.0;Fstop_MHz =11.0;Freq1 =9.0; Freq2 =10.0;Freq3=11.0;}
        if (b==3){tft.setTextColor (ILI9341_RED);tft.fillRect(195,150,35, 15,ILI9341_BLUE);
           tft.setCursor(200, 150);tft.setTextColor (ILI9341_RED);tft.println("14");
           Fstart_MHz = 12.0;Fstop_MHz =16.0;Freq1 =12.0; Freq2 =14.0;Freq3=16.0;}
        if (b==4){tft.setTextColor (ILI9341_RED);tft.fillRect(195,150,35, 15,ILI9341_BLUE);
           tft.setCursor(200, 150);tft.setTextColor (ILI9341_RED);tft.println("21");
           Fstart_MHz = 19.0;Fstop_MHz =23.0;Freq1 =19.0; Freq2 =21.0;Freq3=23.0;}
        if (b==5){tft.setTextColor (ILI9341_RED);tft.fillRect(195,150,35, 15,ILI9341_BLUE);
           tft.setCursor(200, 150);tft.setTextColor (ILI9341_RED);tft.println("28");
           Fstart_MHz = 26.0;Fstop_MHz =30.0;Freq1 =26.0; Freq2 =28.0;Freq3=30.0;}
        if (b==6){tft.setTextColor (ILI9341_RED);tft.fillRect(195,150,35, 15,ILI9341_BLUE);
           tft.setCursor(195, 150);tft.setTextColor (ILI9341_RED);tft.println("All");Fstart_MHz = 1;
            Fstop_MHz = 30;Freq1 = 1; Freq2 = 15;Freq3 = 30;}
        if (b==7){counter=0;SwrMin=0;SwrFreq=0;
            Fstop_MHz = 30;Freq1 = 1; Freq2 = 15;Freq3 = 30;CreateGrid();}
        if (b==8){key2();}
      //     Serial.print("flag: "); Serial.println(flag);
      //     Serial.print("counter: "); Serial.println(counter);
     }  
  }
    } 
    delay(10);
          if (flag == 1 && counter <=1)
     if (flag == 1)
{
 flag = 0;Perform_sweep();}
}
       
//sub--------------------------------

void Perform_sweep(){
  double FWD=0;
  double REV=0;
  double VSWR;
  double Fstep_MHz = (Fstop_MHz-Fstart_MHz)/num_steps;
  
  z = 0;
  SwrMin = 100;
  tft.setTextColor(ILI9341_GREEN);    tft.setTextSize(1);
  
   tft.setCursor(10, 150);
   tft.println("Scan Start..."); 
   
  // Start loop 
  for(int i=0;i<=num_steps;i++){
    // Calculate current frequency
    current_freq_MHz = Fstart_MHz + i*Fstep_MHz;
    // Set DDS to current frequency
    SetDDSFreq(current_freq_MHz*1000000);
    // Wait a little for settling
    delay(10);
    //delay(100);
    // Read the forward and reverse voltages
    REV = analogRead(A0);
    FWD = analogRead(A1);
    
    //Offset Korrektur
    //REV = REV-korrekturwert;
    REV = REV-5;
     
     
    if(REV>=FWD){REV = FWD-1;}
    
    if (REV <1) {REV = 1;}
  
    VSWR = (FWD+REV)/(FWD-REV);
          
    
    VSWR = VSWR * 1000;
    
    
    // Send current line back to PC over serial bus
    Serial.print(current_freq_MHz*1000000);
    Serial.print(",0,");
    Serial.print(VSWR);
    Serial.print(",");
    Serial.print(FWD);
    Serial.print(",");
    Serial.println(REV);
    
 //Dsiplay graph(DG7EAO)------------------------
    // Übergebe SWR an Array
    // ERmittele Freq bei niedrigsten SWR
    vswrArray[z] = VSWR/1000;
     if (vswrArray[z] > 10) vswrArray[z] = 10;
        if (vswrArray[z] < SwrMin && vswrArray[z] > 1) 
    {
    SwrMin = vswrArray[z];
    SwrFreq = current_freq_MHz;
        }    
        z = z + 1;
      }
 // Send "End" to PC to indicate end of sweep
  Serial.println("End");
  Serial.flush(); 
  CreateGrid();
  tft.setTextColor(ILI9341_RED);

   // Draw Line
  
    // 30 = swr 10    210 = swr 0
    // Diff swr 10 = 180
    // swr 2 = 18 * 2
  
   double last = 10;
   double xx = 6;
   int j = 1;

    for (int i = 1 ;i < 103; i++){
    xx = vswrArray[i];
  
  tft.drawLine(j,300-last*16, j+1, 300-xx*16,ILI9341_RED);
  tft.drawLine(j+1,300-last*16, j+2, 300-xx*16,ILI9341_RED);
 
  j = j + 3;
  last = xx;  
  }     
}

void CreateGrid(){
   double maxSwr = 10;
   flag = 0;
   tft.fillRect(0,120,250,200,ILI9341_BLACK);
   tft.drawRect(0,140,240,150,ILI9341_WHITE);  
   tft.drawLine(0,275,239,275,ILI9341_WHITE);
   tft.drawLine(0,210,239,210,ILI9341_WHITE);
   tft.drawLine(60,140,60,289,ILI9341_WHITE);
   tft.drawLine(120,140,120,289,ILI9341_WHITE);
   tft.drawLine(180,140,180,289,ILI9341_WHITE);
   tft.setTextSize(2);tft.setTextColor(ILI9341_WHITE);
        tft.setCursor(0, 300);
	tft.println(Freq1,1);
        tft.setCursor(100,300);
	tft.println(Freq2,1);
 	tft.setCursor(190,300);
	tft.println(Freq3,1);
        tft.setCursor(5,120);
	tft.println("SWR");
        tft.setTextColor(ILI9341_YELLOW);
        tft.setCursor(150, 120);
	//tft.print((freqCenter/1000000*1.05),3);
        tft.println(SwrFreq,3);           
	tft.setCursor(50, 120);
   	tft.println(SwrMin,2);       
}
//DDS Control------------------ 
void SetDDSFreq(double Freq_Hz){
   // Calculate the DDS word - from AD9850 Datasheet
   int32_t f = Freq_Hz * 4294967295/125000000;
  // alculate the DDS word - from AD9851------------
  // int32_t f = Freq_Hz * 4294967296.0 / 180.0e6;
  // Send one byte at a time
  for (int b=0;b<4;b++,f>>=8){
    send_byte(f & 0xFF);
  }
  // 5th byte needs to be zeros
  send_byte(0);
  //AD9851--------------------
  //send_byte(01);
  // Strobe the Update pin to tell DDS to use values
  digitalWrite(FQ_UD,HIGH);
  digitalWrite(FQ_UD,LOW);
}

// Sende Daten an DDS
  void send_byte(byte data_to_send){
  // Bit bang the byte over the SPI bus
  for (int i=0; i<8; i++,data_to_send>>=1){
    // Set Data bit on output pin
    digitalWrite(SDAT,data_to_send & 0x01);
    // Strobe the clock pin
    digitalWrite(SCLK,HIGH);
    digitalWrite(SCLK,LOW);
  }
}
  void key2(){
   counter = counter + 1; 
    Serial.print(counter);
   //Entprellen mit millis()
   millinew = millis();
 
   if (millinew - milliold < 1000)
   {
    milliold = millinew;
   return; 
}
    milliold = millinew;
    num_steps = 102; // Steps
flag = 1;
}

 

Компилятор выдает только это:

 
ad9850adafuilt:96: error: 'Adafruit_GFX_Button' does not name a type
ad9850adafuilt.ino: In function 'void setup()':
ad9850adafuilt:117: error: 'buttons' was not declared in this scope
ad9850adafuilt.ino: In function 'void loop()':
ad9850adafuilt:151: error: 'buttons' was not declared in this scope
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Основная ошибка в строке 96. Остальные - производные от этой.

Что до строки 96.

1. Где находятся библиотеки "Adafruit_GFX.h" и "Adafruit_ILI9341.h". Если в стандартном для библиотек месте, то замените " на угловые скобки в строках 20-21.

2. Тип Adafruit_GFX_Button определяется в файле Adafruit_GFX.h. Убедитесь, что он там действительно определяется, а то может версия файла не та.

Напишите. что у Вас получилось.

Если ничего не поменяется. сообщите заодно точно где Вы брали Adafruit_GFX.h чтобы мы на одну и ту же версию смотрели.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Библиотеки должны быть в папке скетча, мы радиолюбители так пишем и, это не обсуждается )))

Talion
Offline
Зарегистрирован: 12.01.2017

Библиотеки в стандартном месте, заменил на угловые - ничего не поменялось.

Библиотеку брал тут https://github.com/adafruit/Adafruit-GFX-Library

73! R0JAB

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, ну что, класс определён в строке 107 файла Adafruit_GFX.h. Должно работать. Знаете, так не бывает. Вы уверены, что скинули мне ВСЕ сообщения компилятора? Боюсь, что Вы что-то оставили, посчитав неважным. И ещё, думаю, что библиотеки у Вас лежат всё-таки в неправильном месте или конфликтуют с другими. Такой вывод сделан из следующего: я скачал все библиотеки и запустил компиляцию у себя. Вот результаты

IDE 1.6.5 - вообще никаких проблем. Много предупреждений о неиспользуемых параметрах, но в целом - всё отлично компилируется.
 
IDE 1.6.12 - сначала изругалась на неправильный порядок функций, но это известная проблема. Переставил функции и, после перестановки, опять же много предупреждений о неиспользуемых параметрах, но в целом - всё отлично компилируется.
 
Вот здесь скетч после перестановки функций (может пригодится)
/***************************************************************************
*  Name    : DDS_Sweeper.BAS                                                *
*  Author  : Beric Dunn (K6BEZ)                                             *
*  Notice  : Copyright (c) 2013  CC-BY-SA                                   *
*          : Creative Commons Attribution-ShareAlike 3.0 Unported License   *
*  Date    : 9/26/2013                                                      *
*  Version : 1.0                                                            *
*  Notes   : Written using for the Arduino Micro                            *
*          :   Pins:                                                        *
*          :   A0 - Reverse Detector Analog in                              *
*          :   A1 - Forward Detector Analog in                              *
*          : Modified by Norbert Redeker (DG7EAO) 07/2014                   *
*          : Modified by Heribert Schulte dk2jk 09/2014 //(hs)              *
*          : Modified by S.Nagou (JR5IZI) 10/2015                           *
*          : TFT Display adafruit-2-8-tft-touch-shield-V2                   *
*          : <a href="https://learn.adafruit.com/adafruit-2-8-tft-touch-shield-v2" title="https://learn.adafruit.com/adafruit-2-8-tft-touch-shield-v2" rel="nofollow">https://learn.adafruit.com/adafruit-2-8-tft-touch-shield-v2</a>    *
****************************************************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Adafruit_STMPE610.h>
//#include <EEPROM.h>
//#include "korrektur.h"

// For the Adafruit TFT shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

// The STMPE610 uses hardware SPI on the shield, and #8
#define STMPE_CS 8
Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS);

// This is calibration data for the raw touch data to the screen coordinates
#define TS_MINX 150
#define TS_MINY 130
#define TS_MAXX 3800
#define TS_MAXY 4000

//BUTTRN UI-------------------------------
#define BUTTON_X 50
#define BUTTON_Y 30
#define BUTTON_W 70
#define BUTTON_H 30
#define BUTTON_SPACING_X 2
#define BUTTON_SPACING_Y 2
#define BUTTON_TEXTSIZE 2

unsigned long milliold = 0;
unsigned long millinew = 0;
//korrekturwert(DK2JK)--------
//Korrektor_im_eeprom eeprom;
//int korrekturwert;
//DDS PIN---------------------
const int FQ_UD = 7;
const int SDAT = 6;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ;
const int SCLK = 8;
const int RESET = 5;

//Desplay Set(DG7EAO)----------
double vswrArray[110]; //Array Array für SWR
int z = 0;            // Index Index für Array
double SwrFreq = 1;  // Variable Variable für Freq. mit SWR Min.
double SwrMin = 0;   //  Variable für SWR Min.
double Freq1 = 1;     // Freq. Links unterste Zeile Display
double Freq2 = 15;    // Freq. Mitte unterste Zeile Display
double Freq3 = 30;    // Freq. Mitte unterste Zeile Display

int flag = 0;

// wir auf 1 gesetzt bei Interrupt, in void Loop perform_sweep
double counter = 0;  // Zähler um erste Interrupts zu ignorieren

// Variablen
double Fstart_MHz = 1;  // Start Frequency for sweep
double Fstop_MHz = 30;  // Stop Frequency for sweep
double current_freq_MHz; // Temp variable used during sweep
long serial_input_number; // Used to build number from serial stream
int num_steps = 100; // Number of steps to use in the sweep
char incoming_char; // Character read from serial stream

unsigned long previousMillis = 0;  // will store last time LED was updated

// constants won't change :
const long interval = 1000;

// create buttons---------------------
char buttonlabels[9][5] = { "3.5", "7", "10", "14", "21", "28", "All", "Clr", "Scan"};
uint16_t buttoncolors[9] = {ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
                            ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,
                            ILI9341_BLUE, ILI9341_GREEN, ILI9341_RED,
                           };
Adafruit_GFX_Button buttons[9];

//sub--------------------------------

void CreateGrid() {
  double maxSwr = 10;
  flag = 0;
  tft.fillRect(0, 120, 250, 200, ILI9341_BLACK);
  tft.drawRect(0, 140, 240, 150, ILI9341_WHITE);
  tft.drawLine(0, 275, 239, 275, ILI9341_WHITE);
  tft.drawLine(0, 210, 239, 210, ILI9341_WHITE);
  tft.drawLine(60, 140, 60, 289, ILI9341_WHITE);
  tft.drawLine(120, 140, 120, 289, ILI9341_WHITE);
  tft.drawLine(180, 140, 180, 289, ILI9341_WHITE);
  tft.setTextSize(2); tft.setTextColor(ILI9341_WHITE);
  tft.setCursor(0, 300);
  tft.println(Freq1, 1);
  tft.setCursor(100, 300);
  tft.println(Freq2, 1);
  tft.setCursor(190, 300);
  tft.println(Freq3, 1);
  tft.setCursor(5, 120);
  tft.println("SWR");
  tft.setTextColor(ILI9341_YELLOW);
  tft.setCursor(150, 120);
  //tft.print((freqCenter/1000000*1.05),3);
  tft.println(SwrFreq, 3);
  tft.setCursor(50, 120);
  tft.println(SwrMin, 2);
}

// Sende Daten an DDS
void send_byte(byte data_to_send) {
  // Bit bang the byte over the SPI bus
  for (int i = 0; i < 8; i++, data_to_send >>= 1) {
    // Set Data bit on output pin
    digitalWrite(SDAT, data_to_send & 0x01);
    // Strobe the clock pin
    digitalWrite(SCLK, HIGH);
    digitalWrite(SCLK, LOW);
  }
}
void key2() {
  counter = counter + 1;
  Serial.print(counter);
  //Entprellen mit millis()
  millinew = millis();

  if (millinew - milliold < 1000)
  {
    milliold = millinew;
    return;
  }
  milliold = millinew;
  num_steps = 102; // Steps
  flag = 1;
}


//DDS Control------------------
void SetDDSFreq(double Freq_Hz) {
  // Calculate the DDS word - from AD9850 Datasheet
  int32_t f = Freq_Hz * 4294967295 / 125000000;
  // alculate the DDS word - from AD9851------------
  // int32_t f = Freq_Hz * 4294967296.0 / 180.0e6;
  // Send one byte at a time
  for (int b = 0; b < 4; b++, f >>= 8) {
    send_byte(f & 0xFF);
  }
  // 5th byte needs to be zeros
  send_byte(0);
  //AD9851--------------------
  //send_byte(01);
  // Strobe the Update pin to tell DDS to use values
  digitalWrite(FQ_UD, HIGH);
  digitalWrite(FQ_UD, LOW);
}


void Perform_sweep() {
  double FWD = 0;
  double REV = 0;
  double VSWR;
  double Fstep_MHz = (Fstop_MHz - Fstart_MHz) / num_steps;

  z = 0;
  SwrMin = 100;
  tft.setTextColor(ILI9341_GREEN);    tft.setTextSize(1);

  tft.setCursor(10, 150);
  tft.println("Scan Start...");

  // Start loop
  for (int i = 0; i <= num_steps; i++) {
    // Calculate current frequency
    current_freq_MHz = Fstart_MHz + i * Fstep_MHz;
    // Set DDS to current frequency
    SetDDSFreq(current_freq_MHz * 1000000);
    // Wait a little for settling
    delay(10);
    //delay(100);
    // Read the forward and reverse voltages
    REV = analogRead(A0);
    FWD = analogRead(A1);

    //Offset Korrektur
    //REV = REV-korrekturwert;
    REV = REV - 5;


    if (REV >= FWD) {
      REV = FWD - 1;
    }

    if (REV < 1) {
      REV = 1;
    }

    VSWR = (FWD + REV) / (FWD - REV);


    VSWR = VSWR * 1000;


    // Send current line back to PC over serial bus
    Serial.print(current_freq_MHz * 1000000);
    Serial.print(",0,");
    Serial.print(VSWR);
    Serial.print(",");
    Serial.print(FWD);
    Serial.print(",");
    Serial.println(REV);

    //Dsiplay graph(DG7EAO)------------------------
    // Übergebe SWR an Array
    // ERmittele Freq bei niedrigsten SWR
    vswrArray[z] = VSWR / 1000;
    if (vswrArray[z] > 10) vswrArray[z] = 10;
    if (vswrArray[z] < SwrMin && vswrArray[z] > 1)
    {
      SwrMin = vswrArray[z];
      SwrFreq = current_freq_MHz;
    }
    z = z + 1;
  }
  // Send "End" to PC to indicate end of sweep
  Serial.println("End");
  Serial.flush();
  CreateGrid();
  tft.setTextColor(ILI9341_RED);

  // Draw Line

  // 30 = swr 10    210 = swr 0
  // Diff swr 10 = 180
  // swr 2 = 18 * 2

  double last = 10;
  double xx = 6;
  int j = 1;

  for (int i = 1 ; i < 103; i++) {
    xx = vswrArray[i];

    tft.drawLine(j, 300 - last * 16, j + 1, 300 - xx * 16, ILI9341_RED);
    tft.drawLine(j + 1, 300 - last * 16, j + 2, 300 - xx * 16, ILI9341_RED);

    j = j + 3;
    last = xx;
  }
}



void setup() {
  Serial.begin(57600);
  pinMode(FQ_UD, OUTPUT);
  pinMode(SCLK, OUTPUT);
  pinMode(SDAT, OUTPUT);
  pinMode(RESET, OUTPUT);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  analogReference(INTERNAL);
  digitalWrite(RESET, HIGH);
  digitalWrite(RESET, LOW);
  serial_input_number = 0;
  //korrekturwert=  eeprom.read();

  // clear the screen
  tft.begin();
  tft.fillScreen(ILI9341_BLACK);
  for (uint8_t row = 0; row < 3; row++) {
    for (uint8_t col = 0; col < 3; col++) {
      buttons[col + row * 3].initButton(&tft, BUTTON_X + col * (BUTTON_W + BUTTON_SPACING_X),
                                        BUTTON_Y + row * (BUTTON_H + BUTTON_SPACING_Y),
                                        BUTTON_W, BUTTON_H, ILI9341_WHITE, buttoncolors[col + row * 3], ILI9341_WHITE,
                                        buttonlabels[col + row * 3], BUTTON_TEXTSIZE);
      buttons[col + row * 3].drawButton();
    }
  }

  //touchscreen start------------------
  if (!ts.begin()) {
    Serial.println("Couldn't start touchscreen controller");
    while (1);
  }
  Serial.println("Touchscreen started");
  CreateGrid();
}

void loop() {
  //touch screen control-------------
  if (ts.bufferEmpty()) {
    return;
  }

  TS_Point p = ts.getPoint();
  p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
  p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
  //  Serial.print("("); Serial.print(p.x); Serial.print(", ");
  //  Serial.print(p.y); Serial.print(", ");
  //  Serial.print(p.z); Serial.println(") ");

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    for (uint8_t b = 0; b < 9; b++) {
      if (buttons[b].contains(p.x, p.y)) {
        Serial.print("Pressing: "); Serial.println(b);
        //Sirial control --------------------------
        if (Serial.available() > 0) {
          incoming_char = Serial.read();
          switch (incoming_char) {
            /*  case 'k':
             korrekturwert= serial_input_number;
             if ( (korrekturwert >=64) )
             {
               korrekturwert = 64;
             }
              ist eeprom damit:
             eeprom.write(korrekturwert);
             serial_input_number=0;
             */
            //break;
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
              serial_input_number = serial_input_number * 10 + (incoming_char - '0');
              break;
            case 'A':
              //Turn frequency into FStart
              Fstart_MHz = ((double)serial_input_number) / 1000000;
              serial_input_number = 0;
              break;
            case 'B':
              //Turn frequency into FStop
              Fstop_MHz = ((double)serial_input_number) / 1000000;
              serial_input_number = 0;
              break;
            case 'C':
              //Turn frequency into FStart and set DDS output to single frequency
              Fstart_MHz = ((double)serial_input_number) / 1000000;
              //SetDDSFreq(Fstart_MHz);
              SetDDSFreq(Fstart_MHz * 1000000);
              delay(100);
              SetDDSFreq(Fstart_MHz * 1000000);
              serial_input_number = 0;
              break;
            case 'N':
              // Set number of steps in the sweep
              num_steps = serial_input_number;
              serial_input_number = 0;
              break;
            case 'S':
            case 's':
              Perform_sweep();
              break;
            case '?':
              // Report current configuration to PC
              Serial.print("Start Freq:");
              Serial.println(Fstart_MHz * 1000000);
              Serial.print("Stop Freq:");
              Serial.println(Fstop_MHz * 1000000);
              Serial.print("Num Steps:");
              Serial.println(num_steps);
              //Serial.print("Korrekturwert:");
              break;
          }
          Serial.flush();
        }
        //freq control--------------------------
        tft.setTextSize(2);
        if  (b == 0) {
          tft.setTextColor (ILI9341_CYAN); tft.fillRect(195, 150, 35, 15, ILI9341_BLUE);
          tft.setCursor(195, 150); tft.setTextColor (ILI9341_RED); tft.println("3.5");
          Fstart_MHz = 3.0; Fstop_MHz = 4.0; Freq1 = 3.0; Freq2 = 3.5; Freq3 = 4.0;
        }
        if (b == 1) {
          tft.setTextColor (ILI9341_RED); tft.fillRect(195, 150, 35, 15, ILI9341_BLUE);
          tft.setCursor(210, 150); tft.setTextColor (ILI9341_RED); tft.println("7");
          Fstart_MHz = 6.0; Fstop_MHz = 8.0; Freq1 = 6.0; Freq2 = 7.0; Freq3 = 8.0;
        }
        if (b == 2) {
          tft.setTextColor (ILI9341_RED); tft.fillRect(195, 150, 35, 15, ILI9341_BLUE);
          tft.setCursor(200, 150); tft.setTextColor (ILI9341_RED); tft.println("10");
          Fstart_MHz = 9.0; Fstop_MHz = 11.0; Freq1 = 9.0; Freq2 = 10.0; Freq3 = 11.0;
        }
        if (b == 3) {
          tft.setTextColor (ILI9341_RED); tft.fillRect(195, 150, 35, 15, ILI9341_BLUE);
          tft.setCursor(200, 150); tft.setTextColor (ILI9341_RED); tft.println("14");
          Fstart_MHz = 12.0; Fstop_MHz = 16.0; Freq1 = 12.0; Freq2 = 14.0; Freq3 = 16.0;
        }
        if (b == 4) {
          tft.setTextColor (ILI9341_RED); tft.fillRect(195, 150, 35, 15, ILI9341_BLUE);
          tft.setCursor(200, 150); tft.setTextColor (ILI9341_RED); tft.println("21");
          Fstart_MHz = 19.0; Fstop_MHz = 23.0; Freq1 = 19.0; Freq2 = 21.0; Freq3 = 23.0;
        }
        if (b == 5) {
          tft.setTextColor (ILI9341_RED); tft.fillRect(195, 150, 35, 15, ILI9341_BLUE);
          tft.setCursor(200, 150); tft.setTextColor (ILI9341_RED); tft.println("28");
          Fstart_MHz = 26.0; Fstop_MHz = 30.0; Freq1 = 26.0; Freq2 = 28.0; Freq3 = 30.0;
        }
        if (b == 6) {
          tft.setTextColor (ILI9341_RED); tft.fillRect(195, 150, 35, 15, ILI9341_BLUE);
          tft.setCursor(195, 150); tft.setTextColor (ILI9341_RED); tft.println("All"); Fstart_MHz = 1;
          Fstop_MHz = 30; Freq1 = 1; Freq2 = 15; Freq3 = 30;
        }
        if (b == 7) {
          counter = 0; SwrMin = 0; SwrFreq = 0;
          Fstop_MHz = 30; Freq1 = 1; Freq2 = 15; Freq3 = 30; CreateGrid();
        }
        if (b == 8) {
          key2();
        }
        //     Serial.print("flag: "); Serial.println(flag);
        //     Serial.print("counter: "); Serial.println(counter);
      }
    }
  }
  delay(10);
  if (flag == 1 && counter <= 1)
    if (flag == 1)
    {
      flag = 0; Perform_sweep();
    }
}
Как видите, раз у меня компилируетя, значит у Вас что-то не так с конфигруацией. Скорее всего с библиотеками что-то не так. Может быть у Вас есть много библиотек от Adafruit и они подрались или ещё что - ищите. Текст нормальный.
 
Talion
Offline
Зарегистрирован: 12.01.2017

Компилятор больше ничего не выдал, я скопировал все что было в нижнем черном окне.

Библиотеки лежат в правильном месте, он их нормально подцепил. Я вообще думаю а не слишком старая ли у меня версия IDE. Проверить правда смогу только в понедельник.

Спасибо за помощь!

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, смотрите. Мои версии IDE в которых нормально компилируется я Вам написал.

Talion
Offline
Зарегистрирован: 12.01.2017

Большое спасибо за помощь!!!

Дело действительно было в версии Arduino IDE, у меня стояла еще 1.0.5 :) скачал с сайта последнюю и все прекрасно скомпилировалось.