hey

ik heb een mooie print gemaakt met een nodemcu ESP8266 op. Programmeren doe ik via arduino programma. Verschillende dingen werken reeds.

MAAR... ik wil alle GPIO's gebruiken. Zoals bvb GPIO6. Ik heb de manual gedownload van expressif. Maar ik geraak er niet wijs uit.

Ik moet vlngs mij GPIO.h hebben om dan de GPIO's in te stellen als output, input, pull up, high, low

GPIO_OUTPUT_SET(GPIO_ID_PIN(6, 1);

Heeft er iemand een simpele, uitleg en voorbeeldprogramma ??

Groet Microman

De standaard arduino commando’s blijven werken toch als digitalwrite?

Heb je wat aan dit voorbeeld?

https://randomnerdtutorials.com/esp32-digital-inputs-outputs-arduino/

[Bericht gewijzigd door rudig76 op (41%)]

Zoals bvb GPIO6

GPIO6 is in Arduino D14 of gewoon 14

Zo staat GPIO6 in een vakje met roze achtergrond en dat is de naam zoals die in de datasheet staat. Echter heeft arduino ervoor gekozen om daar andere namen aan te geven. De Arduino pinnummer is wat er als eerste direct naast de pin staat in het vakje met donkerbruin. Het is wat verwarrend maar als je de namen in het donker bruine vakje aanhoud dat zou het gewoon moeten werken

pinMode(14, output)
DigitalWrite(14, HIGH)

Hou er wel rekening mee dat D14 ook in gebruik is als SPI inbterfase. Dus als je SPI gebruikt dan ken je D14 niet voor iets anders gebruiken. Zo hebben de meeste pinnen ook ander functie en die staan in het groen, geel, grijs of blauw weer gegeven

PS. Complimenten voor je openingspost met het meesturen van alle informatie en de extra link mbt tot de pinnummers van de ESP8266

Geen succes.. heb alles geprobeerd.
Ik heb me vooral bezig gehouden met BEEPER op GPIO9.

Maar 9 of D9 of GPIO9. Hij doet het niet.
De functie van de output moet vlgns mij eerst aangepast worden naar GPIO

Geef mij maar Mikrobasic hoor, dat werkt altijd..

internet klok.ino

 

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <gpio.h>


#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define DATA_PIN     D3        //  OUT 1           =  data output pin voor de ledstrip 
#define LED_UP       D6        // Led Enter button =  power ON led 
#define LED_ENTER    D5        // Led Up button    =  internet verbinding OK led
#define LED_DOWN     D7        // Led Down  button
#define BUTTON_UP    21
#define BUTTON_ENTER 22
#define BUTTON_DOWN  D8
#define RELAY_1      D11
#define RELAY_2      D13
const int BEEPER =   9;


const char *ssid      = "telenet-AC36D28";   //  kkkk
const char *password  = "******";
 
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org",0,60000);     // 2 uur bijtellen 3600 

void setup() {

  display.begin(SSD1306_SWITCHCAPVCC,0x3C);     	                          // oled display aanzetten
	display.clearDisplay();
  display.display() ;

  //pinMode(RELAY_1,      OUTPUT);
  //pinMode(RELAY_2,      OUTPUT);
  pinMode(BUTTON_UP,    INPUT);
  pinMode(BUTTON_ENTER, INPUT);
  pinMode(BUTTON_DOWN,  INPUT);
  pinMode(LED_UP,       OUTPUT); // Initialize the LED pin as an output
  pinMode(LED_ENTER,    OUTPUT); // Initialize the LED pin as an output
  pinMode(LED_DOWN,     OUTPUT); // Initialize the LED pin as an output
  pinMode(BEEPER,       OUTPUT);

  //digitalWrite(RELAY_1,   LOW);
  //digitalWrite(RELAY_2,   LOW);

  

  display.setTextSize(2);                                            // Oled scherm   uur:minuten:seconden  weergeven
	display.setTextColor(WHITE);   

  display.setCursor(0,20);
  display.println("Zoekt WiFi" );      

  display.display() ;
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED ) {
    delay ( 200 );
    digitalWrite(LED_ENTER,    HIGH);
    digitalWrite(LED_UP,       LOW);
    digitalWrite(LED_DOWN,     HIGH);
    digitalWrite(BEEPER,       HIGH); 

    delay ( 200 );

    digitalWrite(LED_ENTER,    LOW);
    digitalWrite(LED_UP,       HIGH);     }
    digitalWrite(LED_DOWN,     LOW);
    digitalWrite(BEEPER,       LOW);     

    digitalWrite(LED_ENTER,    HIGH);
    digitalWrite(LED_UP,       HIGH);
    digitalWrite(LED_DOWN,     HIGH);

    display.clearDisplay();
    display.setTextSize(2);                                            // Oled scherm   uur:minuten:seconden  weergeven
	  display.setCursor(10,20);
    display.println("Connected" ); 
    display.display() ;
    timeClient.begin();
        
    delay(2000);       
    

}
String weekDays[7]={"Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag"};

String months[12]={"Januari", "February", "   Maart", "  April", "  Mei", "  Juni", "  Juli", "Augustus", "September", "Oktober", "November", "December"};


void loop() {

display.clearDisplay();
timeClient.update();
time_t epochTime = timeClient.getEpochTime();          // ruwe data klok
struct tm *ptm = gmtime ((time_t *)&epochTime);

int zomerwinter = ptm->tm_isdst;                      // winteruur = 1  ;  zomeruur = 0
if (zomerwinter == 1)
{timeClient.setTimeOffset(3600); }      // winteruur = 3600 seconden minder
else
{timeClient.setTimeOffset(7200); }      // zomeruur  = 7200 seconden bij ntp-tijd bijtellen
 
String formattedTime = timeClient.getFormattedTime();                   
display.setCursor(12, 0);                              // tijd in HH:MM:SS    
display.println(formattedTime);

display.setCursor(15,20);
String weekDay = weekDays[timeClient.getDay()];         // bvb Donderdag
display.println(weekDay); 

int currentMonth = ptm->tm_mon+1;                      // welke maand: 0 = Januari ,       4 = Mei,  11 = December

int monthDay = ptm->tm_mday;
display.setCursor(0,40);                               // welke dag:  bvb 24
display.println(monthDay);

String currentMonthName = months[currentMonth-1];
display.setCursor(30,40);                              // welke maand:  bvb November
display.println(currentMonthName);

int currentYear = ptm->tm_year+1900;                   // welk jaar // 

display.display();

}

die linkse GPIO pinnen kan je maar beperkt gebruiken omdat ze ook gebruikt worden tussen chip en memory

Als BEEPER een simpel piezo speakertje is dan moet je die pin met de frequentie die je wilt horen hoog en laag maken. Nog beter werkt het als je de piezo tussen twee pinnen aansluit en deze steeds omwisselt, dus 1/0 en 0/1.

Ik heb me vooral bezig gehouden met BEEPER op GPIO9.

Maar 9 of D9 of GPIO9. Hij doet het niet.

Ja ook logisch dat het niet werkt. want ik heb het eerder fout uitgelegd. Sorry daarvoor. Maar dat komt ook omdat NodeMCU er een zooitje van heeft gemaakt.

De namen en nummer die je in arduino moet gebruiken staan direct op de PCB naast de pin.

Io9 - GPIO9 - 9 = S2 en niet bruikbaar in arduino

https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/

Volgens bovenstaande website zijn er maar heel weinig pinnen bruikbaar. Dit komt niet door arduino zelf maar door hoe nodeMCU het bordje gemaakt heeft. Dit komt omdat chip extern geheugen gebruikt en omdat veel pinnen in gebruik zijn voor het opstarten en dus lezen uit dat externe geheugen

De bruikbare pinnen zijn
D1, D2, D3, D4, D5, D6, D7 en A0

D8 is na het opstarten bruikbaar maar alleen als output

De pinnen Rx en TX zijn ook bruikbaar. Rx alleen als input en Tx alleen als output.

Dus nogmaals dit zijn de namen die direct op de PCB staan

Hey benleentje

Wat je zegt klopt helemaal. Dit zijn de enige pinnen die werken. Zo werkt mijn oled en die geeft de datum en tijd weer via internet. Nu heb ik via jlcpcb een mooie pcb gemaakt waar ik niets meer mee ben. Ik had na het lezen van de expressif pdf dat online te vinden is toch het idee voor een mogelijkheid om 17 gpio's te hebben. Er staat te lezen dat je de gpio's of predefined zoals spi comm. Of io. Maar het programma van arduino moet dit wel aankunnen natuurlijk. Dus?? Ik geef voorlopig nog niet op ?

display.clearDisplay();
timeClient.update();

Zou ik al zeker niet elke loop doen. Je gaat een heel flikkerend display verkrijgen. De ESP is ook niet zo slecht dat hij niet enkele minuten zonder sync kan. Sync 1 keer per uur en dat is meer dan genoeg.

Wijzig op je display alleen wat gewijzigd moet worden.

"February"

Typo?

int zomerwinter = ptm->tm_isdst;                      // winteruur = 1  ;  zomeruur = 0
if (zomerwinter == 1)
{timeClient.setTimeOffset(3600); }      // winteruur = 3600 seconden minder
else
{timeClient.setTimeOffset(7200); }

3600 seconden meer zal je bedoelen. Het is UTC + 3600 of UTC + 7200. Een goede library (ik gebruik ESPDateTime.h en TimeLib.h) stel je in en die doet de omschakeling zelf. Meestal in setup iets van


  DateTime.setServer("europe.pool.ntp.org");
  DateTime.setTimeZone("CET-1CEST,M3.5.0,M10.5.0/3");
  DateTime.begin();
  DateTime.forceUpdate();

Een ESP32 lijkt me beter met deze IO.

Nu heb ik via jlcpcb een mooie pcb gemaakt waar ik niets meer mee ben.

Hebben we (bijna) allemaal al gehad. Is leergeld.

Maar het programma van arduino moet dit wel aankunnen natuurlijk.

Je kan maar kleuren binnen de lijnen van de ESP8266 en deze verlangt nu eenmaal dat bepaalde IO hoog zijn bij het opstarten en andere net laag. Het is altijd goed opletten. Alleen wat in de link van benleentje als groen OK staat kan je probleemloos gebruiken. De rest is goed uitkijken en alleen als het niet anders kan.

edit:

int currentMonth = ptm->tm_mon+1; 

en

String currentMonthName = months[currentMonth-1];

Waarom eerst 1 optellen en dat er daarna terug aftrekken. Je doet voor de rest niks met currentMonth

display.println(currentMonthName);

Vervangen door

display.println(months[ptm->tm_mon])

Zou hetzelfde moeten doen en waarschijnlijk kleiner compileren.

Hier wordt het jaar opgehaald en je doet er niks meer mee.

int currentYear = ptm->tm_year+1900;

[Bericht gewijzigd door buckfast_beekeeper op (15%)]

hey

ter info: klokje op oled werkt perfect -- geen geflikker -- klokje telt ook seconden -- daarmee wat meer updates nodig.

ik heb de manual van expressif de maker van de ESP8266 even in de bijlage gezet.

Met wat ik daar lees over de GPIO's zegt mijn gevoel het nog niet op te geven zodat ik alle 17 gpios kan gebruiken.

Enja, zoniet.. jammer dan ;)

Bijkomende vraag uit onwetendheid.. Heeft de ESP32 betere of meerdere functies of gpios. Anders is de oplossing... STOP met de roommel and move on

groet Microman

ter info: klokje op oled werkt perfect -- geen geflikker -- klokje telt ook seconden -- daarmee wat meer updates nodig.

Voor het display zelf wel natuurlijk (minstens 1x per seconde... ;) )
Voor updaten van de tijd zelf is 1x per uur (of per dag) ruim voldoende.

Zoals Arco ook al zegt, je hebt die updates niet nodig voor het correcte uur. Wat de ESP8266 of ESP32 mis loopt kunnen wij op 1 uur niet zien. Dan heb je toch wel enkele dagen nodig. Ga je elke loop de NTS server pollen, kan het zijn dat ze je blokken. Het neemt ook gewoon elke loop tijd in beslag.

Laat het display gewoon aan en ververs elke seconde de seconden. Elke minuut de minuten. Elk uur de uren. 1 keer per dag wijzig je de datum.

Nu flikkert het display nog niet. Je wil echter ook een ledstrip toevoegen.

#define DATA_PIN     D3        //  OUT 1           =  data output pin voor de ledstrip 

Afhankelijk van de lengte van de strip gaat ook dat tijd nemen in je loop. Waardoor de kans op flikkering vergroot.

Op zondag 28 april 2024 14:53:53 schreef microman:
hey

[...]

Bijkomende vraag uit onwetendheid.. Heeft de ESP32 betere of meerdere functies of gpios. Anders is de oplossing... STOP met de roommel and move on

groet Microman

ESP32.
ESP32 32 160 of 240MHz. ESP8266 80 of 160MHz. Bij een ESP32 is er ook meer geheugen aan boord. In deze waarschijnlijk niet de doorslaggevende factor.

ESP8266 is geen rommel. Voor bepaalde zaken kan die best voldoen. Ik heb die ook in gebruik voor alleen een eenvoudig display of het sturen van enkele IO. Ga je echter richting TFT en Bodmer TFT_eSPI en takkaO OpenFontRender, dan heeft de ESP8266 te weinig RAM.

ESP 32 met 4" TFT met TFT_eSPI en OpenFontRender. De dubbele punt wisselt elke seconde aan/uit. Minuten worden elke minuut ververst. Omdat de nieuwe cijfers de oude niet geheel overschrijven wordt eerst de vorige minuut in het zwart geschreven. Uren elk uur en de datum 1 keer per dag. Tijd update 1 keer om middernacht.

Bodmer OpenWeather. Ook hier weer hetzelfde. Alleen wat wijzigt, wordt geschreven. De weersverwachting wordt na 15 seconden vervangen door de verwachting voor de volgende uren. In de laatste versie hangt er een GPS aan om zo plaats afhankelijke weersverwachtingen te verkrijgen.