Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Arduino - přidání displeje do fčního projektu

si hraju s krámama zakoupenejma v číně, vůbec tomu nerozumím, ale znalosti nahrazuju nadšením.

Mám tu arduino a k němu nějaké senzory a funguje mi předávání přes wifi na thingspeak a rád bych teď dobastlil displej, abych hodnoty nemusel vyčítat z netu ale viděl je pěkně před sebou.

Když si rozchodím displej samostatně na vedlejším arduinu, tak mi vše funguje, ale pokud ten kod displeje pak zakomponuju do kodu zbývajícího, displej už se nerozsvítí.

Tak nějak mlhavě tuším, že by mohl být problém tady -

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

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
mojeDHT.begin();
espSerial.begin(115200);

vypsani_hodnot_na_display(); // Draw 'stylized' characters

espData("AT+RST", 1000, DEBUG); //Reset the ESP8266 module
espData("AT+CWMODE=1", 1000, DEBUG); //Set the ESP mode as station mode
espData("AT+CWJAP=\""+ mySSID +"\",\""+ myPWD +"\"", 1000, DEBUG); //Connect to WiFi network
/*while(!esp.find("OK"))
{
//Wait for connection
}*/
delay(1000);

}

Kdyby někdo měl náladu mi poradit co tam mám blbě, budu moc rád..V příloze kdyžtak komplet zdroják..

Řešení:

Pravděpodobně se knihovna pro SSD1306 přetahuje s SoftwareSerial (knihovny Wire, SPI, Adafruit_GFX jsou mimo podezření, volá si je SSD1306 sama).
Zkus místo ní U8glib.

Předmět Autor Datum
Arduinu vobec nerozumiem, ale co si pamatam tak mlhavo z inych problemov a podla toho, co pises, ze…
fleg 06.05.2020 09:00
fleg
Knihovny by to být neměly, protože to všechno programuju přes jeden počítač a tak jsou knihovny obsa…
Redsnake 06.05.2020 09:07
Redsnake
Rad bych ti pomohl, ale nerozomim kolik tech arduin tedy mas, jestli jde o ty samé arduina a jestli…
HPET 06.05.2020 11:37
HPET
Mám arduino Uno a arduino Nano. Na Uno mám prakticky celou "meteostanici", tedy uno, k němu připoje…
Redsnake 06.05.2020 11:42
Redsnake
display je připojený k nano a funguje to dobře pak display odpojíš od nano a zapojíš ho do uno (nano…
sso 06.05.2020 12:08
sso
Ano, displej je připojen k nano a funguje. Jsem to teda ještě přepíchal na samostatný breadboard ab…
Redsnake 06.05.2020 12:16
Redsnake
nejdříve bych vyzkoušel že ti funguje display na unu bez dht a bez připojení na internet
sso 06.05.2020 12:21
sso
jojo, to mi funguje... [90068-img-0677-jpeg]
Redsnake 06.05.2020 14:55
Redsnake
tak postupně přidávej kod ze stanice, problém je v kombinaci wifi+display nebo čidla + display nemu…
Ssp 06.05.2020 16:08
Ssp
Hehe, to se dostáváme prakticky na začátek, psal jsem to jako svou doměnku hned v původním dotazu.…
Redsnake 06.05.2020 16:24
Redsnake
Tak zkus: (tep a vlh je uvedeneja jako h / t) void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0…
HPET 06.05.2020 17:12
HPET
tam ti ovšem vypadl úplně kod pro espčko... EDIT: Ok, můžu zkusit odstavit wifi a jen vypsat teploty…
Redsnake 06.05.2020 17:16
Redsnake
Podivej se do SZ zprav (tva Pošta na poradne)
HPET 06.05.2020 17:18
HPET
To mi je úplně k prdu, s displejem samotným pracovat umím a meteostanice mi taky funguje, tohle mi f…
Redsnake 06.05.2020 17:28
Redsnake
a tu hlášku allocation failed na serial dostaneš nebo ne?
Ssp 06.05.2020 17:28
Ssp
Tak pardon, dostanu.
Redsnake 06.05.2020 17:35
Redsnake
a odesílání na thingspeak nefunguje a čtení teploty funguje?
Ssp 06.05.2020 18:02
Ssp
a co ti po kompilaci píše IDE o volné paměti?
Ssp 06.05.2020 18:07
Ssp
Pravděpodobně se knihovna pro SSD1306 přetahuje s SoftwareSerial (knihovny Wire, SPI, Adafruit_GFX j…
Prim 06.05.2020 19:40
Prim
Dík, musím si od toho trochu odpočinout a pak to zkusím..
Redsnake 06.05.2020 19:42
Redsnake
Pane! Vy se vyznáte! Paráda, už to funguje, skutečně po změně knihovny na U8glib se posouvám dále. M…
Redsnake 06.05.2020 20:04
Redsnake
Jsem rád, že ti to funguje, U8glib byla trochu střelba od boku. Už jsem párkrát na takový konflikt n… poslední
Prim 06.05.2020 21:15
Prim
Na UNO vse funguje a NANO to nejde ? Mam v tom trochu zmatek. Odpoj uplne to UNO a zapoj jen to NANO…
HPET 06.05.2020 12:18
HPET
evidentně si vůbec nerozumím, možná se nevyjadřuju srozumitelně. 90063-meteostanice-bez-displeje-fcn…
Redsnake 06.05.2020 12:27
Redsnake
Aha, meaculpa spatne jsem to pochopil. V podstate chces tedy jen ten Serial.print(tep); a (vlh) zoba…
HPET 06.05.2020 12:28
HPET

Arduinu vobec nerozumiem, ale co si pamatam tak mlhavo z inych problemov a podla toho, co pises, ze na vedlajsom ti to ide normalne nebude problem s verziami kniznic napriklad?
A neda sa na Arduine spustit nejak debuger, ktory ti ukaze, kde konkretne je chyba?

Knihovny by to být neměly, protože to všechno programuju přes jeden počítač a tak jsou knihovny obsaženy v obou kódech stejné.

Debuger to nemá, resp má to seriový monitor, který může vypisovat různé informace, ale to musí obsahovat samotný kód. Nic co by nějak debugovalo za tebe.

Já si trochu myslím, možná jsem úplně mimo, že vadí, jak tam zkouším přes serial.begin komunikovat postupně s displejem, pak dht čidlem a nakonec na jiné rychlosti ještě s ESP8266. Ale nevím jestli se to smí nebo nesmí...Každopádně v tom kousku kódu čuju zradu.

Rad bych ti pomohl, ale nerozomim kolik tech arduin tedy mas, jestli jde o ty samé arduina a jestli né, jestli pouzivas stejny kod pro oba dva nebo jestli jsi vubec na tom druhém ten diplay vubec nekdy spustil.
Vsechny cinské nejsou kramy, pouzivam je bezne a jsou v podstate identické pocitaje stejne osazeny Atmel.
(podivej se do console / monitor_serie CTRL+MAJ+M co se deje)

Mám arduino Uno a arduino Nano.

Na Uno mám prakticky celou "meteostanici", tedy uno, k němu připojené ESP8266 pro připojení k internetu a dht11 jako senzor. Tady mi stabilně běží kód pro tuto "meteostanici" a ten získává hodnoty z čidla a odesílá je na thingspeak.

Na nano jsem si cvičně zapojil displej pro ověření jestli funguje a rozjel na něm příklad z knihovny, displej funguje, příklad jsem ořezal na nutné minimum a zůstal mi tak jen kousek kódu který vypisoval na displej statickou hlášku, pro příklad třeba "Ahoj PC poradno".

Tento malý kód s displejem jsem chtěl implementovat do kódu meteostanice a v ten moment mi to přestává fungovat.

Ještě sem za chviličku dám ty dva kódy které se snažím spojit :)

EDIT: to že jsem to nazval čínskejma krámama ber jako nadsázku, mě to na nich všechno taky funguje a když nefunguje je to jednoznačně moje chyba :)
EDIT2: to že si musím se změnou desky změnit desku i v ide a případně port vím, nahrát mi ten kod jde:)
EDIT3: přiloženy dva zdrojové kody, do "meteostanice" se snažím přiroubovat ten displej. Statický text si už pak lehce změním na zobrazování konkrétní proměnné.

[90064-img-0675-jpeg]

Hehe, to se dostáváme prakticky na začátek, psal jsem to jako svou doměnku hned v původním dotazu.

Prakticky mi celý kód funguje až do přidání zvýrazněné části:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h> //Software Serial library
#include "DHT.h" // připojení knihovny DHT
SoftwareSerial espSerial(10, 11); //Pin 2 and 3 act as RX and TX. Connect them to TX and RX of ESP8266

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define DEBUG true
#define pinDHT 5
#define typDHT11 DHT11 // DHT 11

// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI 8
#define OLED_CLK 9
#define OLED_DC 7
#define OLED_CS 6
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

String mySSID = "****"; // WiFi SSID
String myPWD = "******"; // WiFi Password
String myAPI = "*****"; // API Key
String myHOST = "api.thingspeak.com";
String myPORT = "80";
String tepFIELD = "field1";
String humField = "field2";
int teplota;
int vlhkost;

DHT mojeDHT(pinDHT, typDHT11);

void setup()
{
Serial.begin(9600);
mojeDHT.begin();
espSerial.begin(115200);

espData("AT+RST", 1000, DEBUG); //Reset the ESP8266 module
espData("AT+CWMODE=1", 1000, DEBUG); //Set the ESP mode as station mode
espData("AT+CWJAP=\""+ mySSID +"\",\""+ myPWD +"\"", 1000, DEBUG); //Connect to WiFi network
/*while(!esp.find("OK"))
{
//Wait for connection
}*/
delay(1000);

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}

vypsani_hodnot_na_display(); // Draw 'stylized' characters

}

void loop(){
/* Here, I'm using the function random(range) to send a random value to the
ThingSpeak API. You can change this value to any sensor data
so that the API will show the sensor data
*/
// cidloDHT11
float tep = mojeDHT.readTemperature();
float vlh = mojeDHT.readHumidity();
// kontrola, jestli jsou načtené hodnoty čísla pomocí funkce isnan
if (isnan(tep) || isnan(vlh)) {
// při chybném čtení vypiš hlášku
Serial.println("Chyba při čtení z DHT senzoru!");
} else {
// pokud jsou hodnoty v pořádku,
// vypiš je po sériové lince
Serial.print("Teplota: ");
Serial.print(tep);
Serial.print(" stupnu Celsia, ");
Serial.print("vlhkost: ");
Serial.print(vlh);
Serial.println(" %");
}
// pauza pro přehlednější výpis
delay(2000);
// cidlo DHT11
teplota = (tep); // Send a random number between 1 and 1000
vlhkost = (vlh);
String sendData = "GET /update?api_key="+ myAPI +"&"+ tepFIELD +"="+String(teplota) +","+ "&field2" +"=" +String(vlhkost);
// String sendData = "GET /update?api_key="+ myAPI + "&field1" +"="+String(t) +","+ "&field2" +"=" +String(h);
Serial.print(sendData);
espData("AT+CIPMUX=1", 1000, DEBUG); //Allow multiple connections
espData("AT+CIPSTART=0,\"TCP\",\""+ myHOST +"\","+ myPORT, 1000, DEBUG);
espData("AT+CIPSEND=0," +String(sendData.length()+4),1000,DEBUG);
espSerial.find(">");
espSerial.println(sendData);
Serial.print("Value to be sent: ");
Serial.println(teplota);
Serial.println(vlhkost);

espData("AT+CIPCLOSE=0",1000,DEBUG);
delay(10000);
}

void vypsani_hodnot_na_display(void) {
display.clearDisplay();

display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.println(F("Ahoj PC poradno!"));

/*display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
display.println(3.141592);

display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.print(F("0x")); display.println(0xDEADBEEF, HEX);
*/

display.display();
delay(2000);
}

String espData(String command, const int timeout, boolean debug)
{
Serial.print("AT Command ==> ");
Serial.print(command);
Serial.println(" ");

String response = "";
espSerial.println(command);
long int time = millis();
while ( (time + timeout) > millis())
{
while (espSerial.available())
{
char c = espSerial.read();
response += c;
}
}
if (debug)
{
//Serial.print(response);
}
return response;
}

Pak se rozbije jak upload na thingspeak, tak není funkční displej.

Tak zkus:
(tep a vlh je uvedeneja jako h / t)


void setup()   {                
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //0x3C popripade nahrad tim, jak je iniciilizovan ten tvuj
  display.display(); // show splashscreen
  delay(2000);
  display.clearDisplay();  
  
  dht.begin();
  delay(2000);
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t) {
    delay(2000);
  } else{
    // prevod  temp/hum floats do char arrays
    char temp_buff[5]; char hum_buff[5];
    char temp_disp_buff[11] = "Tmp:";
    char hum_disp_buff[11] = "Hum:";
       
    dtostrf(t,2,1,temp_buff);
    strcat(temp_disp_buff,temp_buff);
    dtostrf(h,2,1,hum_buff);
    strcat(hum_disp_buff,hum_buff);   
    
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.println(temp_disp_buff);
    display.println(hum_disp_buff);
    display.display();
    delay(2000);
  }
}

Jsem rád, že ti to funguje, U8glib byla trochu střelba od boku.
Už jsem párkrát na takový konflikt narazil. Ty jsi dobře diagnostikoval tu část, která způsobí chybu. Prohlédl jsem si proto výpis knihovny a štěstí bylo, že SSD1306 má na začátku vypsané tři z těch co používáš, ty byly mimo podezření (DHT žádný časovač nepoužívá).
U8glib pak byla trochu střelba od boku, kdyby to nefungovalo, tak by se musel projít kód knihoven. A do toho bych už nešel.
Jestli se to smí, doporučím konkurenční fórum.

Na UNO vse funguje a NANO to nejde ?
Mam v tom trochu zmatek. Odpoj uplne to UNO a zapoj jen to NANO a zkus to znova, jinak to zkus postupne jedno podruhém :
1) Snimani teplot
2) Zapojeni dipleje + zobrazeni informaci ze snimace ne nem.
3) Zobrazit je pres ESP8266
V pripade, ze to nejde na tom NANO, zkus zacit jen tim snimanim teploty a vlhkosti, budo vychazet z toho, ze pouzivas Arduino IDE.


#include "DHT.h"
DHT dht;
void setup()
{
 Serial.begin(9600);
 dht.setup(2); // data pin zvol dle pouzitého pin snimace na tom NANO
}
void loop()
{
 delay(2000); // minimalni vzorkova frekvence,  tu mas pro DH11 spravne
 Serial.print("Vlhkost: ");
 Serial.print(dht.getHumidity()); // Vypis hodnost vlhkosti 
 Serial.print(("Teplota: "));
 Serial.println(dht.getTemperature()); // Zobrazeni teplot
}

V IDE mas polozku "serial port" nebo pouzij CTRL+SHIFT+M, vidis spravne zobrazené informace jako na obrazku ?
[90065-hpt-temp-jpg]

Jestli uz to mas vyzkousene a vis ze to funguje, tak to preskoc, a podivej se jestli spravne komunikuje s tim modulem ESP8266 :
https://www.exploreembedded.com/wiki/Arduino_Support_for_ESP8266_with_simple_test_code
(mmodul ESP8266 nepouzivam, jestli ti jde jen o slepeni kodu s timto modulem, s tim ti nepomuzu, jen bych hadal)

evidentně si vůbec nerozumím, možná se nevyjadřuju srozumitelně.
90063-meteostanice-bez-displeje-fcni-txt kompletně mi funguje meteostanice s čidlem dht11 a odesíláním na thingspeak. Takže vyčítání hodnot, připojení na wifi a prostě vše kolem ESP8266 mi šlape jak má.

Jen se do toho existujícího, funkčního kodu snažím dobastlit ten display. Abych si ověřil, že je display funkční, rozchodil jsem ho na Nano (abych nemusel rozebírat funkční stanici) a vzorový kód který jsem použil na ověření funkčnosti displeje jsem ořezal na kost a zůstal mi jen kód který zobrazuje statický text.

Takže kód funkční meteostanice a kód funkčního displeje se snažím spojit v jeden funkční celek, aby pro začátek, klidně meteostanice fungovala + vypisovala statický text na displej. Tento statický text si pak už zvládnu změnit za proměnné dle potřeby a případně dále dle potřeby rozvíjet. Prostě na tomhle jsem se zasekl..

Zpět do poradny Odpovědět na původní otázku Nahoru