3. Sposób programowania
Samo programowanie modułu jest bardzo proste, ponieważ sprowadza się do wybrania trybu uruchomienia płytki. W tym celu zwieramy pin GPIO0 do masy. Następnie podłączamy zasilania modułu i możemy programować. Po zaprogramowaniu odłączamy ten pin od masy i restartujemy moduł, zwierając pin EN do masy. Gotowe nasz układ wykonuje program
Sam schemat minimalnego zestawu połączeń dla modułu WROOM-32 przedstawiam poniżej:
Dobra to skoro wiem co i jak podłączyć to zróbmy pierwszy test :)
4. Obliczanie liczby pi – milion iteracji
Takim najprostszym sposobem do sprawdzenia mocy obliczeniowej jakiegokolwiek układu, a w szczególności układów IoT jest test obliczenia liczby przy milionie iteracji. Na potrzeby testu modułu skorzystałem ze środowiska Arduino IDE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#define ITERATIONS 1000000L // number of iterations #define FLASH 10000 // blink LED every 1000 iterations void setup() { pinMode(2, OUTPUT); // set the LED up to blink every 1000 iterations Serial.begin(115200); } void loop() { unsigned long start, time; unsigned long niter=ITERATIONS; int LEDcounter = 0; boolean alternate = false; unsigned long i, count=0; float x = 1.0; float temp, pi=1.0; Serial.print("Beginning "); Serial.print(niter); Serial.println(" iterations..."); Serial.println(); start = millis(); for ( i = 2; i < niter; i++) { x *= -1.0; pi += x / (2.0f*(float)i-1.0f); if (LEDcounter++ > FLASH) { LEDcounter = 0; if (alternate) { digitalWrite(2, HIGH); alternate = false; } else { digitalWrite(2, LOW); alternate = true; } delay(1); } } time = millis() - start; pi = pi * 4.0; Serial.print("# of trials = "); Serial.println(niter); Serial.print("Estimate of pi = "); Serial.println(pi, 10); Serial.print("Time: "); Serial.print(time); Serial.println(" ms"); delay(3000); } |
A tak ukazują się wyniki w porównaniu do innych układów (każdy test był wykonany po 5 razy):
Jak widać wyniki mówią same za siebie, moduł ESP32 jest ponad 3 razy szybszy od swojego poprzednika ESP8266. Możemy tu gołym okiem stwierdzić, że podwojona ilość rdzeni pozytywnie wpływa na moc obliczeniową układu. Co najważniejsze wyniki są powtarzalne. Nie są to jakieś „lepsze momenty” działania układu. On cały czas tak działa !
5. Przykładowe aplikację dla IoT
Teraz chciałbym przedstawić parę programów, którymi posprawdzałem podstawowe funkcję ESP32:
ADC
ze względu na to, że PWM nie mogłem sprawdzić to podzielę się „wynikami” z testu ADC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void setup() { pinMode(32, INPUT); Serial.begin(115200); } int var = 0; void loop() { var = analogRead(32); Serial.print("Wartosc ADC: "); Serial.println(var); delay(200); } |
Jak widać po logach z terminala- ADC jest 12 bitowe, czyli wszystko się zgadza, to lecimy dalej :)
One-Wire
Teraz przetestujemy zwykły czujnik temperatury DS18B20 działający na magistrali 1W:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <DallasTemperature.h> #include <OneWire.h> int one_wire = 2; OneWire oneWire(one_wire); DallasTemperature sensors(&oneWire); void setup(void) { sensors.begin(); Serial.begin(115200); } void loop(void) { sensors.requestTemperatures(); Serial.print("Temperatura: "); Serial.print(sensors.getTempCByIndex(0)); Serial.println(" C"); delay(50); } |
Przy programowaniu układu występowały, co którąś próbę problemy z zapisem do układu. Udało mi się ustalić, że prawdopodobną przyczyną tego stanu rzecz były konflikty z czujnikiem temperatury. Nie wiem na ile procent jest trafne to stwierdzenie, lecz przy odłączonym czujniku, wgrywanie programu szło bez większych problemów: