Skocz do zawartości

Shield V2 wyświetlacz dotykowy LCD TFT 3,2'


Piotr8801

Pomocna odpowiedź

Witam, posiadam nakładkę do arduino Shield V2 wyświetlacz dotykowy LCD TFT 3,2' i chciałbym na niej zrobić proste wyświetlanie temperatury oraz ciśnienia z czujnika BMP280. Jestem początkującym i nie nie wiem jak za bardzo mam się wziąć za ogarnianie kodu. Potrzebuje podpowiedz jakiś zarys kodu aby wyświetlić tekst. Temperatura będzie wyświetlana z magistrali i2C. Czy ktoś coś mi pomoże?? Bo w necie ciężko znaleźć jakiś przykład. 

Z góry wielkie dzieki

Link do komentarza
Share on other sites

@Piotr8801 witam na forum 🙂 Chętnie pomożemy, ale raczej nie masz co liczyć na gotowca 😉 Na czym dokładnie utknąłeś? Masz już opanowaną obsługę samego czujnika i wyświetlacza?

  • Lubię! 1
Link do komentarza
Share on other sites

Czujnik mam opanowany i oczywiście magistrale I2C. Wyświetlacz podłączony do arduino uno przez magistrale SPI. Wyświetlacz działa bo zapuszczam jakiegoś gotowca z biblioteki.  Ogólnie takie rzeczy wyświetlanie temp itp umiem na wyświetlaczu oled 0.96 cala/ 0.91 cała sd1306. LCD 16x2/16x04 tymi operuje i jest dobrze. A chciałbym wyswiwtlic podobne dane na tym LCD TFT 3.2 Shield V2. Oczywiście, żadnego gotowca, potrzebuje jakiś początek, napisanie prostych parę słów...jak do tego podejść przy takim wyświetlaczu 😉😄

Link do komentarza
Share on other sites

@Piotr8801 w takim programowaniu dobrze jest porównać to co z danego przykładu potrzebujesz. Wyświetlacz - przykład pisania tekstu. Zamiast tekstu podstaw sobie zmienne które reprezentują temperature itp. Jak będzie działać to uzupełniaj te zmienne prawdziwymi pomiarami wykonywanymi co jakiś odstęp czasu. Wyświetlanie co jakiś odstęp czasu, użyj funkcję millis

Też poczytaj temat o dzieleniu programu i testowaniu:

Nie wiem czy do czegoś Ci się to przyda ale możesz przeanalizować jak tu wygląda obsługa wyświetlacza, tak zwanej maszyny stanów i wykonywania cyklicznych operacji. Program ten napisałem niedawno do sterownika do mojego auta. Masz tu wyświetlacz, 2 dallasy, przekaźniki, wentylator i jakiśpotencjometr

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define DHT_PIN              A0
#define POTENTIOMETER_PIN    A1
#define RELAY_12_V_PIN       A2
#define RADIO_RIGHT_PIN      A3
#define IGN_ANALOG_FEED_PIN  A6

#define DALLAS_BUS_PIN       10
#define RADIO_MIDDLE_PIN     9
#define FAN_PIN              8
#define SWITCH_PIN           7
#define LED_PIN              6
#define RELAY_5_V_PIN        5

//CONSTANT POWER - 12 V directly from aku
//IGN POWER - 12 V from ignition

#define IGN_VOLTAGE_ADC_THRSHOLD 320

#define STATE_IGN_OFF 0
#define STATE_STARTING 1
#define STATE_IGN_ON 2
#define STATE_SHUTTING 3

#define IGN_OFF 0
#define IGN_ON 1

#define FAN_ON HIGH
#define FAN_OFF LOW

#define START_INTERVAL 2000
#define SHUT_MINIMAL_INTERVAL 3000

#define INTERVAL_SLOW 60001
#define INTERVAL_MODERATE 1013
#define INTERVAL_FAST 207

#define TEMPERATURE_PRECISION 9
#define ERROR_READING_TEMPERATURE DEVICE_DISCONNECTED_C

#define SCENE_DEBUG -1
#define SCENE_TEMPERATURE 0
#define SCENE_RELAY 1
#define SCENE_ANALOG 2

OneWire oneWire(DALLAS_BUS_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress internalThermometer = { 0x28, 0xFF, 0xF5, 0x65, 0x31, 0x17, 0x03, 0x38 };
DeviceAddress externalThermometer = { 0x28, 0x0D, 0x8C, 0xF2, 0x16, 0x13, 0x01, 0xB4 };
Adafruit_SSD1306 display(4);


long timeDelayMillis = 0;
long fastDelayMillis = 0;
long moderateDelayMillis = 0;
long slowDelayMillis = 0;

int ignState;
int state = STATE_IGN_OFF;
bool canShut = true; //to jest feedback np od RPi
int fanSpeedPercent = 70;
float externalTemperature = -200;
float internalTemperature = -200;

int checkIgnState() {
  return analogRead(IGN_ANALOG_FEED_PIN) > IGN_VOLTAGE_ADC_THRSHOLD;
}

int setBlueLED(int state) {
  digitalWrite(LED_PIN, state);
}

int useConstantSupply() {
  digitalWrite(RELAY_12_V_PIN, HIGH);
  delay(500);
}

int useIgnSupply() {
  digitalWrite(RELAY_12_V_PIN, LOW);
  delay(500);
}

void setFan(int state) {
  digitalWrite(FAN_PIN, state);
}


void readTermometers() {
  sensors.requestTemperatures();
  internalTemperature = sensors.getTempC(internalThermometer);
  externalTemperature = sensors.getTempC(externalThermometer);
}

int selectScene() {
  return map(analogRead(POTENTIOMETER_PIN), 0, 1024, 0, 6);
}

void displaySceneTemperature() {
  display.print("Wewnatrz: "); display.println(internalTemperature);
  display.print("Zewnatrz: "); display.println(externalTemperature);
}

void displaySceneRelay() {
  display.print("Relay 5V: "); display.println(digitalRead(RELAY_5_V_PIN) == HIGH ? "ON" : "OFF");
  display.print("Relay 12V: "); display.println(digitalRead(RELAY_12_V_PIN) == HIGH ? "ON" : "OFF");
}

void displaySceneDebug() {
  for (int i = 0; i < 10; ++i) {
    display.setCursor(0, i * 8);
    display.print(i); display.print(" ABCDEFGHIJKLMNO");
  }
}

void displaySceneAnalog() {
  display.print("Supply: "); display.println(analogRead(IGN_ANALOG_FEED_PIN));
  display.print("Pot: "); display.println(analogRead(POTENTIOMETER_PIN));
}

void displaySplash() {
  display.clearDisplay();
  display.setCursor(0, 4);
  display.print("Skoda MCU v3");
  display.display();
}

void displayEnding() {
  display.clearDisplay();
  display.setCursor(0, 4);
  display.print("Shutting...");
  display.display();
}

/*
   procedury
*/

void fanCoolingProcedure() {
  //wlaczaj i wylaczaj wiatrak z histereza na bazie temperatury wewnatrz pudelka, np pomierzona przez CPU RPi
}

void fastUpdateProcedure() {
  display.clearDisplay();
  int selectedScene = selectScene();
  const int offset = 8;

  display.fillRect(0, 0, offset, 32, WHITE);
  display.fillRect(128 - offset, 0, offset, 32, WHITE);
  display.setTextColor(BLACK);
  display.setCursor(128 - offset, 0);
  display.print(selectedScene);
  display.setTextColor(WHITE);
  display.setCursor(8, 0);

  switch (selectedScene) {
    case SCENE_TEMPERATURE:
      displaySceneTemperature();
      break;

    case SCENE_RELAY:
      displaySceneRelay();
      break;

    case SCENE_ANALOG:
      displaySceneAnalog();
      break;

    default:
      displaySceneDebug();
      break;
  }
  display.display();
}

void moderateUpdateProcedure() {
  fanCoolingProcedure();
}

void slowUpdateProcedure() {
  readTermometers();
  //  Serial.print("Internal temp: "); Serial.print(internalTemperature); Serial.print(", external temp: "); Serial.println(externalTemperature);
}

void regularUpdateProcedure() {
  while (millis() - fastDelayMillis > INTERVAL_FAST) {
    fastDelayMillis += INTERVAL_FAST;
    fastUpdateProcedure();
  }

  while (millis() - moderateDelayMillis > INTERVAL_MODERATE) {
    moderateDelayMillis += INTERVAL_MODERATE;
    moderateUpdateProcedure();
  }

  while (millis() - slowDelayMillis > INTERVAL_SLOW) {
    slowDelayMillis += INTERVAL_SLOW;
    slowUpdateProcedure();
  }
}

void setup() {
  Serial.begin(9600);

  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  pinMode(RELAY_12_V_PIN, OUTPUT);
  digitalWrite(RELAY_12_V_PIN, LOW);

  pinMode(FAN_PIN, OUTPUT);
  setFan(FAN_OFF);



  if (!oneWire.search(externalThermometer)) {
    Serial.println("Unable to find address for internalThermometer");
  } else {
    sensors.setResolution(internalThermometer, TEMPERATURE_PRECISION);
    Serial.print("Device 0 internalThermometer resolution: ");
    Serial.print(sensors.getResolution(externalThermometer), DEC);
    Serial.println();
  }

  if (!oneWire.search(externalThermometer)) {
    Serial.println("Unable to find address for externalThermometer");
  } else {
    sensors.setResolution(externalThermometer, TEMPERATURE_PRECISION);
    Serial.print("Device 1 externalThermometer resolution: ");
    Serial.print(sensors.getResolution(externalThermometer), DEC);
    Serial.println();
  }

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setRotation(2);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.display();

  readTermometers();

  timeDelayMillis = millis();
  fastDelayMillis = millis();
  moderateDelayMillis = millis();
  slowDelayMillis = millis();
}

void loop() {
  ignState = checkIgnState();
  switch (state) {

    /*
       Stan początkowy, rozpoczyna odliczanie do ustabilizowania napięcia na zapłonie
    */
    case STATE_IGN_OFF:
      if (ignState == IGN_ON) {
        setBlueLED(HIGH);
        state = STATE_STARTING;
        timeDelayMillis = millis();
      }
      break;

    /*
       Stan odliczania do ustalenia napięcia na zapłonie, gdy nastepi załączy zasilanie od akumulatora
    */
    case STATE_STARTING:
      displaySplash();

      if (ignState == IGN_OFF) {
        state = STATE_IGN_OFF;
        setBlueLED(LOW);
      }
      else if (millis() - timeDelayMillis > START_INTERVAL) {
        state = STATE_IGN_ON;
        setBlueLED(LOW);
        useConstantSupply();
      }
      break;

    /*
       Stan stabilny normalnej pracy, zasilanie stałe z akumulatora. Wyciągnięcie kluczyka zapłonu rozpoczyna odliczanie.
    */
    case STATE_IGN_ON:
      if (ignState == IGN_OFF) {
        state = STATE_SHUTTING;
        timeDelayMillis = millis();
        setBlueLED(HIGH);
      }

      //normalna praca poniżej:
      regularUpdateProcedure();
      break;

    /*
       Odliczanie do wyłączenia, ponowne włączenie zapłonu zresetuje. Po upływie czasu wróci do stanu wyłączonego, ale pewnie i tka straci już zasilanie i się zresetuje.
    */
    case STATE_SHUTTING:
      displayEnding();
      if (ignState == IGN_ON) {
        state = STATE_IGN_ON;
        setBlueLED(LOW);
      }
      if (millis() - timeDelayMillis > SHUT_MINIMAL_INTERVAL) {
        if (canShut == true) {
          state = STATE_IGN_OFF;
          setBlueLED(LOW);
          display.clearDisplay();
          display.display();
          useIgnSupply();
        }
      }
      break;
  }

  delay(5);
}

 

 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.