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.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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
Pravděpodobně se knihovna pro SSD1306 přetahuje s SoftwareSerial (knihovny Wire, SPI, Adafruit_GFX j…
Prim 06.05.2020 19:40
Prim
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

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.

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.

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