• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z OLED 128x64 (Adafruit_SSD1306 & Adafruit_GFX)
#1
Cześć,

piszę w tym dziale, ale nie jestem pewien czy to problem wyświetlacza. Jestem nawet pewien, że to problem nie samego wyświetlacza ale wyszedł mi podczas prób jego użycia więc opiszę go tutaj.

Generalnie program jest prosty: jest 5 czujników deszczu. Jeśli którykolwiek z nich wskaże pomiar powyżej oczekiwanego uruchamiana jest pompa, oraz otwierany jest zawór powiązany z tym czujnikiem. Jeśli ani jeden nie wskaże pomiarów poniżej jakiejś wartości pompa jest wyłączana. 

Kod to realizujący:
 
Kod:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define OLED_ADDR 0x3C  //defince OLED addres. Default was 0x3D and i thik it was adafruit default. But from aliexpress has onother athres. To find I2C address use I2Scanncer
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


#define RAIN_SENSOR_OPEN 1000
#define RAIN_SENSOR_CLOSE 400
int rainSensorPin[] = {A0, A1, A2, A3, A6}; //rain sesnors pins
int rainSensorValue[] = {0, 0, 0, 0, 0}; //rain sensor values

#define VALVE_OPEN 1
#define VALVE_CLOSE 0
int valvePin[] = {2, 3, 4, 5, 6};
int valveState[] = {VALVE_CLOSE, VALVE_CLOSE, VALVE_CLOSE, VALVE_CLOSE, VALVE_CLOSE};

#define PUMP_PIN 7

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

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) { // Address OLED
    Serial.println(F("SSD1306 allocation failed"));
  }

  for(int i = 0; i < 5; i++){
    pinMode(valvePin[i], OUTPUT);
  }
  pinMode(PUMP_PIN, OUTPUT);

  // Clear the buffer
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 32);
  display.println("Auto Garden v 0.1.");
  display.display();
  delay(500);
 
}

void printTableOnLCD(){
 
  //vertical lines for dashboard
  display.drawLine(01, 01, 01, 31, SSD1306_WHITE);
  display.drawLine(16, 01, 16, 31, SSD1306_WHITE);
  display.drawLine(31, 01, 31, 31, SSD1306_WHITE);
  display.drawLine(46, 01, 46, 31, SSD1306_WHITE);
  display.drawLine(61, 01, 61, 31, SSD1306_WHITE);
  display.drawLine(76, 01, 76, 31, SSD1306_WHITE);
  display.drawLine(91, 01, 91, 31, SSD1306_WHITE);
  //horizontal lines for dashboard
  display.drawLine(01, 01, 91, 01, SSD1306_WHITE);
  display.drawLine(01, 11, 91, 11, SSD1306_WHITE);
  display.drawLine(01, 21, 91, 21, SSD1306_WHITE);
  display.drawLine(01, 31, 91, 31, SSD1306_WHITE);
 
  //draw water lvl symbol
  display.setCursor(04, 13);
  display.print("W");
  //display.drawBitmap(02, 12, image_water, 5, 5, SSD1306_WHITE);
 
  //draw valve symbol
  display.setCursor(04, 23);
  display.print("P");
  //display.drawBitmap(02, 22, image_valve, 5, 5, SSD1306_WHITE);
 
  //draw pupmp symbol
  //display.drawBitmap(65, 1, image_pump, 21, 16, SSD1306_WHITE);
 
}

void fillTableByData(){
  for(int i = 0; i < 5; i++){
    Serial.print("Loop Sensor ");
    Serial.print(i, DEC);
    Serial.print(" value: ");
    Serial.println(rainSensorValue[i]);
    display.setCursor(18 + 15 * i, 13);
    display.print(rainSensorValue[i]/10, DEC);
    display.setCursor(18 + 15 * i, 23);
    display.print(valveState[i] == VALVE_OPEN ? 1 : 0, DEC);
    //display.drawBitmap(12 + 10 * i, 22, valveState[i] == VALVE_OPEN ? image_on : image_off, 5, 5, SSD1306_WHITE);
  }
}

void loop() {
  int val = 0;
  bool isAnyOpenedValve = false;
  for(int i = 0; i < 5; i++){
    rainSensorValue[i] = analogRead(rainSensorPin[i]); //read value of 'i' sensor
    Serial.print("First Sensor ");
    Serial.print(i, DEC);
    Serial.print(" value: ");
    Serial.println(rainSensorValue[i]);
    if(rainSensorValue[i] >= RAIN_SENSOR_OPEN){ //if value greater or equal open valve thrshole
      openValve(valvePin[i]); //open valve and save them state
      isAnyOpenedValve = true; //indicate that valve is opened
    }
    if(rainSensorValue[i] <= RAIN_SENSOR_CLOSE){
      closeValve(valvePin[i]);
    }
    Serial.print("Sensor ");
    Serial.print(i, DEC);
    Serial.print(" value: ");
    Serial.println(rainSensorValue[i]);
  }

  if(isAnyOpenedValve){ //let's check if is any valve opened
    turnOnPump(); //if so then powe up pump! even if was switched on
  }else{
    turnOffPump(); //if no thet power off pump, even if was switched off
  }
  display.clearDisplay();
  printTableOnLCD();
  fillTableByData();
 
  display.display();      // Show initial text
  delay(5000);
}

void turnOnPump(){
  Serial.println("Pump switch on");
  digitalWrite(PUMP_PIN, HIGH);
}

void turnOffPump(){
  Serial.println("Pump switch off");
  digitalWrite(PUMP_PIN, LOW);
}


void openValve(int pin){
  valveChangeState(pin, VALVE_OPEN);
}

void closeValve(int pin){
  valveChangeState(pin, VALVE_CLOSE);
}

void valveChangeState(int pin, int state){
  valveState[pin] = state;
  digitalWrite(pin, state == 1 ? HIGH : LOW);
}

I teraz niby wszytko pięknie i ładnie, ale na serialu mam:
Cytat:23:03:21.901 -> First Sensor 0 value: 429
23:03:21.901 -> Sensor 0 value: 429
23:03:21.935 -> First Sensor 1 value: 440
23:03:21.968 -> Sensor 1 value: 440
23:03:22.002 -> First Sensor 2 value: 384
23:03:22.002 -> Sensor 2 value: 384
23:03:22.036 -> First Sensor 3 value: 452
23:03:22.070 -> Sensor 3 value: 452
23:03:22.104 -> First Sensor 4 value: 421
23:03:22.104 -> Sensor 4 value: 421
23:03:22.137 -> Pump switch off
23:03:22.171 -> Loop sensor 0 value: 429
23:03:22.171 -> Loop sensor 1 value: 440
23:03:22.204 -> Loop sensor 2 value: 384
23:03:22.238 -> Loop sensor 3 value: 452
23:03:22.271 -> Loop sensor 4 value: 421
23:03:27.295 -> First Sensor 0 value: 365
23:03:27.295 -> Sensor 0 value: 365
23:03:27.328 -> First Sensor 1 value: 362
23:03:27.362 -> Sensor 1 value: 362
23:03:27.396 -> First Sensor 2 value: 375
23:03:27.396 -> Sensor 2 value: 375
23:03:27.430 -> First Sensor 3 value: 395
23:03:27.464 -> Sensor 3 value: 395
23:03:27.498 -> First Sensor 4 value: 405
23:03:27.498 -> Sensor 4 value: 405
23:03:27.532 -> Pump switch off
23:03:27.567 -> Loop sensor 0 value: 0
23:03:27.567 -> Loop sensor 1 value: 362
23:03:27.567 -> Loop sensor 2 value: 375
23:03:27.602 -> Loop sensor 3 value: 395
23:03:27.636 -> Loop sensor 4 value: 405
23:03:32.652 -> First Sensor 0 value: 400
23:03:32.652 -> Sensor 0 value: 400
23:03:32.685 -> First Sensor 1 value: 398
23:03:32.719 -> Sensor 1 value: 398
23:03:32.754 -> First Sensor 2 value: 382
23:03:32.754 -> Sensor 2 value: 382
23:03:32.787 -> First Sensor 3 value: 405
23:03:32.820 -> Sensor 3 value: 405
23:03:32.854 -> First Sensor 4 value: 394
23:03:32.854 -> Sensor 4 value: 394
23:03:32.888 -> Pump switch off
23:03:32.922 -> Loop sensor 0 value: 400
23:03:32.922 -> Loop sensor 1 value: 0
23:03:32.956 -> Loop sensor 2 value: 382
23:03:32.989 -> Loop sensor 3 value: 405
23:03:33.024 -> Loop sensor 4 value: 394`

Zwróćcie proszę uwagę na to, że w niektórych okolicznościach rainSensorValue w funkcji fillTableByData pokazuje 0 (np. odczyt 23:03:27.567). Tak samo jest to prezentowane na wyświetlaczu. Z początku myślałem, że problem z wyświetlaczem, dlatego zdebugowałem wartości odczytywane z tejże zmiennej w funkcji i już one wskazują na 0. 

Moje pytanie jest: dlaczego? Nie jestem w stanie tego zrozumieć.

Płytka to arduino nano
 
Odpowiedź
  


Wiadomości w tym wątku
Problem z OLED 128x64 (Adafruit_SSD1306 & Adafruit_GFX) - przez manwe - 06-03-2020, 00:51

Skocz do:


Przeglądający: 1 gości