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:
I teraz niby wszytko pięknie i ładnie, ale na serialu mam:
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
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