Бегущий (скроллящийся) график влажности

deBeers
Offline
Зарегистрирован: 24.01.2021

Всем привет!

У меня NodeMCU ESP8266 CP2102 с датчиком темп/влаж SHT20 и OLED .96" 128x64.

Я решил выводить на экран график влажности, и когда он достигает края экрана (по оси Х) он сдвигается влево, таким образом он бесконечно скроллится.

Начинается с того, что у нас пустой экран и график начинает потихоньку заполняться и ползти вправо. Всё работает нормально ровно до того момента, как график достигает правого края экрана и запускается цикл, который сдвигает график влево. На фото видно, что происходит — нижняя часть заштриховывается, так быть не должно.

После этого и далее график работает корректно, как и задумано — ползёт влево, вот только площадь под графиком почему-то заштрихована. Ломаю голову не могу понять, как убрать этот глюк. Код ниже.

 

 

Я совершенно не умею программировать, поэтому просьба сильно не матерится, написал код как мог.

Цикл сдвигающий график:

if (counter == 30){
        y_coord[counter]=y;
        for (int i=1; i<=counter; i++){
        int temp_coord;
        temp_coord==y_coord[i-1];
        y_coord[i-1]=y_coord[i];
        display.drawLine((i*4)-4, 64-temp_coord, i*4, 64-y_coord[i], WHITE);
        }
         counter=29;
         
          }

где y это текущие показания датчика влажности, y_coord[counter] это массив, который сохраняет текущие показания в индексе counter.

counter — это счётчик циклов

temp_coord - сохраняется текущее показания перед сдвигом (перед тем как оно будет перезаписано следующим показанием, так как сдвиг идёт справа налево)

Таким образом весь массив y_coord[] (все индексы) сдвигается влево

i*4 — потому что у меня по оси Х показания идут с шагом в 4 пикселя

64-координата - так как у меня 0 по Х и 0 по Y в левом нижнем углу, а в Ардуино нули в верхнем левом углу, нужно инвертировать график, чтобы он парвильно отображался.

 

Где я мог накосячить? Может кто с таким уже сталкивался?

Полный код ниже.

#include <Wire.h>
#include <Sodaq_SHT2x.h>
#include <ThingSpeak.h>
#include "c:\Users\Anderson\Documents\Arduino\sketch_temperatuur\secrets.h"
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "СЕКРЕТ";

#define LED D0
#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)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);



// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "СЕКРЕТ";
char pass[] = "СЕКРЕТ";
int y_coord[32];
int counter = 0;
int y;
WiFiClient  client;
BlynkTimer timer;


void sendSensor()
{
  
  float temperatuur = SHT2x.GetTemperature();
  float vochtigheid = SHT2x.GetHumidity();
  char stemp[7];
  char svoch[7];
  y = round(vochtigheid);
  dtostrf(temperatuur,3, 2, stemp);
  dtostrf(vochtigheid,3, 2, svoch);
  display.clearDisplay();
  delay(1000);
  display.drawLine(0, 0,  0, 64, WHITE);
  display.drawLine(0, 63,  128, 63, WHITE);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(10,10);
  display.print(stemp);
  display.print((char)247);
  display.print("C");
  display.setCursor(75,10);
  display.print(svoch);
  display.print("RH%");
  display.setCursor(10,55);
  display.print(counter);
    
    if (counter == 0) {
     y_coord[counter]=y;
      }
    if (0 < counter < 30){
    y_coord[counter]=y;
    for (int i = 1; i<=counter; i++){
      
    display.drawLine((i*4)-4,64-y_coord[i-1], i*4, 64-y_coord[i], WHITE);
         
     }
    
    }
      if (counter == 30){
        y_coord[counter]=y;
        for (int i=1; i<=counter; i++){
        int temp_coord;
        temp_coord==y_coord[i-1];
        y_coord[i-1]=y_coord[i];
        display.drawLine((i*4)-4, 64-temp_coord, i*4, 64-y_coord[i], WHITE);
        }
         counter=29;
         
          }
        if (counter>=31){
            counter=29;
            display.setCursor(30,55);
  display.print(counter);
            }
       
         
        
  

    // You can send any value at any time.
  // Please don't send more that 10 values per second.
  display.display();
  Blynk.virtualWrite(V5, temperatuur);
  Blynk.virtualWrite(V6, vochtigheid);
  ThingSpeak.setField(1, temperatuur);
  ThingSpeak.setField(2, vochtigheid); 
  float x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  digitalWrite(LED, LOW);
  delay(100);
  digitalWrite(LED, HIGH);
  delay(250);
  digitalWrite(LED, LOW);
  delay(300);
  digitalWrite(LED, HIGH);
  counter++;
}

void setup()
{
  // Debug console
  Serial.begin(115200);
  delay(100);
 
  Wire.begin();
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();  
  
  Blynk.begin(auth, ssid, pass);
  
  ThingSpeak.begin(client);

  pinMode(LED, OUTPUT);
  timer.setInterval(10000L, sendSensor);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
  //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);
}

void loop()
{
  
  Blynk.run();
  timer.run();
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

deBeers пишет:

Я совершенно не умею программировать, поэтому просьба сильно не матерится, написал код как мог.

Так что Вы от нас-то хотите?

Если хотите научиться программировать, то Вам следует начать с проекта попроще.

А если хотите, чтобы Вам кто-то написал правильную программу, так это только в платный раздел "Ищу исполнителя".

На этом форуме помогают только тем, кто хочет научиться.

deBeers
Offline
Зарегистрирован: 24.01.2021

andriano пишет:

Так что Вы от нас-то хотите?

Да, вроде как, всё предельно понятно написано.

Я программу сделал сам, никого не спрашивал и не дёргал, учился сам, как ты пишешь.
Алгоритм по сдвигу графика родил полностью сам, и он, о чудо, даже работает. Но в него где-то закрался досадный баг, который я никак не могу забороть.

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

Так понятнее, что я от вас "хотите"? Не для того ли есть форум, не для того ли есть песочница? И я, вроде, еще пока ничем не выказал своего нежелания учиться или рыть информацию самому.

Ничего в своём посте крамольного я не вижу.

b707
Offline
Зарегистрирован: 26.05.2017

deBeers пишет:

Алгоритм по сдвигу графика родил полностью сам, и он, о чудо, даже работает. Но в него где-то закрался досадный баг, который я никак не могу забороть.

в строке 80 двойное "равно" исправьте

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Я в восхищении, дочитать до 80 строки, это сильно!

Но особенно мне нравится пароль и логин сети... ТС это же англицкий язык , я надеюсь ?

deBeers
Offline
Зарегистрирован: 24.01.2021

П@%!&ц! [facepalm]
Заработало) Спасибо огромное!

brokly пишет:

Я в восхищении, дочитать до 80 строки, это сильно!

b707 красавчик!

Пароли, естественно, в живой прошивке выглядят по-другому))