Hi Andreas, this is by far your best and most exciting video yet! I also wrote assembler in the late 70's and 80's so I hope I can meet your challenge. This feature of the esp32 was what interested me most when it came out. Thank you so much for opening the door for me.
"Most playtime per dollar" 😹 ich musste sehr lachen, Danke! Danke, endlich mal "aktuelle" Videos über low-level Sprachen und Microcontroller 😻👍 Endlich kann man wieder auf Effizienz programmieren, wie im Studium gelernt :) Wusste gar nicht dass ESP diese Schnittstelle hat 💗 danke!
Moved all my senior design code from atmega to the esp. Got the display working,moved peripherals. Using your guide for the rtos. I can't believe this thing is under 10$. You are awesome. Thank you for this, sincerely from Texas.
Aweseome! I've played around with the ULP using ESP-IDF, but it's a hassle to get it set up and integrated into the build system. Glad to have this video, the ULP is a really cool part of the hardware that hasn't been talked about as much.
you would think espressif would want to strongly encourage support of this feature. someone should make a C compiler for the ulp. the 8kb of the ulp is quite adequate for some reasonable code.
I would say that the target audience for this feature is comfortable with using assembler, so they see no need for a compiler. The code is minimal anyway.
Espressif guy here: The issue is that the ULP barely is a microcontroller. It originated from a few digital people trying to build a somewhat programmable state machine to do some sensor sampling in deep sleep mode, then added in enough logic to make it turing-complete. Porting C to it would be a pretty tall order. We have something in mind that will make that possible for the ULP in our next chips, if that's a comfort.
@@Spritetm I agree. Some processors just weren't made to support a C compiler. For example, 8 bit PIC chips. This "CPU" smells more like an FPGA state machine. Being a long time assembly language lover, I will be looking into this architecture.
Great video as always, thank you. I use another method which works in C without programming the ULP. There is a wake up hook function when the ESP32 wakes up. It gets called before booting the ESP32, before the flash is activated. C functions can be placed into the RTC memory for little processing. This function can continue to boot the ESP32 (which takes 0.3 secs) or put it into deeplseep again. This hook requires only 3 ms to check some processing. The advantage is can it can be programmed in C, the disadvantage is that only low-level IO can be done because program functions (FLASH) are not available. However all registers and ESP32 ROM functions can be used, or own functions marked with IRAM_ATTR will also work. This is pretty much low level like the ULP, however programmed in C with proper print debugging, etc. Regards Helmut (Arduino Hannover & RadioShuttle.de)
Interesting idea. I did not know that it exists. Maybe there is a small difference: The ULP clocks quite slow but still is quite fast because of its simplicity (microseconds) and only needs "full throttle" 2mA. So you can run it every few ms and still hardly consume any energy. Might be interesting for faster moving signals where you have to check quite frequently.
The main reason I use the wakeup hook is that the deepsleep timer does not last long, therefore it wakes up the ESP32 too often which consumes energy, now I can just re-enter into deepsleep (3 ms versus 300 ms).@@AndreasSpiess
Great info! I spent many years in assembly language on DG Nova's and early micros (6502 and 8080). Glad to get to use it again. The ESP32 has a lot of hidden power. Looks like fun.
Hi Mr Spiess, another well documented video just to get the juices flowing. The ESP32 is becoming more and more an IoT contender because of the ultra low power capability. and now with the ULP processor even more so! Thank you for the video.
Good to see this finally get some airtime :) I tried it last summer but ended up running into problems with the ADC at the time. Nevertheless, thanks for expanding the audience and hopefully the number of available working projects
@@aspzx I had problems expanding to use the other pins at the time. I was using the same examples from Duff2t013. They are good examples but I was short of the brain cells and it was hard work to get it all working. As I recall, I got there in the end but it wasn't straightforward... In the end I kept on using the ADS1115.
Thank you for introducing me to these super useful & very practical capabilities of the Esp32 especially for battery application. The ability to do things with out troubling the main processor has extraordinary potential for extending battery life which is always something that is useful for end users. Thanks for sharing!
Hi Andreas. At minute 2:00 you tell that the esp32 can wake out of deep sleep if a pin is touched. I thought it was only possible what a timer was reached. Does that mean that for example for a simple door sensor (with magnetic reed contact) I don't have to use this ULP core and I can somehow put the esp32 in deep sleep and only let him wake up when the reed contact gives a signal ? Can I do this on SIGNAL CHANGE? Or is it only on UP or DOWN but not on CHANGE ? Kind regards from Belgium
I'm not sure about signal change, but you can set up a trigger for the ESP32 to wake from deep sleep when an IO pin goes high. Here is more info: pcbreflux.blogspot.com/2017/02/esp32-deep-sleep-example.html
Hi Andreas, the Voodoo you are talking about allows the compiler to calculate the size for all the ULP programs (which is why you have two arrays that contain pointers to the begin and end of the ULP program, respectively). But as always a fantastic video. One idea for the challenge: Read 1-Wire sensors...
@Mai Mariarti I tried the I2C example yesterday, and it does not work with Arduino out of the box (it won't even build). Although the adc code from their github doesn't work either, but Andreas's code works great. So there's some more voodoo to figure out. The list of operations has I2C_RD and I2C_WR, so I believe at least one of the pins has hardware support builtin. I'm going to try to tackle this today.
Wow! Been waiting for this for a long time. Amazing stuff. Now I can finally make my mqtt door sensors. I have boards for a trigboard-based design just for this task, but now I will try it with just an ESP32. Great stuff!
This was exactly my thought. Wake on state change to report door open and door close events via MQTT without the need for complex supporting circuitry. Exciting.
For some version of "until recently"... The MPLAB X IDE has been available for the last 5 years, for free with a C compiler :) That said I had fun with the 12-bit words and reduced instruction set in the older PICs in the 90s. That was a different level of fun.
PIC has been programmable in both C and assembly years before Arduino even existed at all and still can. Also, while C is obviously more convenient there are still times when it is useful to use assembly. That is mostly the case when you need fast acting realtime operation such as precise timing signals, dealing with stepper motors running at high step rates and so on.
Fascinating challenge... I would recommend mentioning the prize challenge in the video title (or making another video to link to this one) as I’m sure folks who relish such problems might miss it with the sleepwalking title.
Yes,the good old times. Programming a Z80 with an Manual(a real paper book!), and then calculate the bits by hand( yes, also on paper.....) to hex values. Then type all Values by hand into the dev.board , which only have some switches, 7segment led and a small keypad! And if it loose the power, all is gone. Young people couldn't understand, how amazing the first blinky on those projects make me so Lucky, to get it running.....
I had a lovely hand written ready reckoner for the Z80 with the instructions laid out in a 16 by 16 grid. Fond memories, but the good times started for me with emulators, break points, swiftly followed by C. Debugging assembler without JTAG sounds hard work.
I dont miss those days, but I still think it was a fun and educational process to toggle in the bootloader on an Imsai 8080 via the front panel! Thankfully, I'm not so old I had to enter the whole program that way.
Yeah these were the days. In the late 70's without an assembler I developed a four pole linear circuit simulator on a ZX spectrum. Everything was developed on paper and very little debugging was necessary because you had to think rigorous with attention to detail. Still have a binder full of hand written assembly and it's hand-translated machine code. Unthinkable for today's standards. For back in these days this was the fastest code. But you had to do everything even design your floating point arithmetic. This program could deal with up to 200 nodes and had FFT for time domain output. Amazing how little memory we were forced to use.
Dear Mr. Spiess, congratulations for the topic and the fantastic video... I am also one of z80 assembly trained... I hope to have more advanced video for the ESP32 I think it deserves. Thanks again.
It is good to see these features being implemented for Arduino and thus made available to many more people. I've been using ESP-IDF rather than Arduino, but then again I've been a professional programmer for a while. I willhave a go at your competition if I come across something interesting to do.
Awesome introduction, this opens a lot of possible use as battery powered security sensor for the ESP32. I have a garage that can't be connected to the alarm plant, but I can reach it via WiFi: I can now use a battery powered ESP32 to probe the environment and receive alerts if needed. Thanks!
Great video Andreas, I had read about this but had not gone down the rabbit hole per se, as I had no vision for a use case currently. Il be going over this video again in detail as a solar project could perhaps do with this update.
Hi, I hope you are well during this tough time in the world. I have come across this video after searching online a way to keep counts of a pulse interrupt from a dds353 kwh meter and periodically send the counts over mqtt. I had not realized that esp was different from arduino in the way ISRs are handled during low power operations. Now I am convinced I need this approach shown in this video. Kindly point to how I can listen to interrupts and maintain a count for it then wakeup the main processor say after 10 minutes and pass the data over for Serialprinting( Mqtt transmission in my use case which I can do after I have figured out the ulp interrupt and periodic waking up of the main processor). This is very useful stuff thank you
Very interesting. Lots of possibilities using these techniques. Assembler coding isn’t really that hard but I’m sure some people will come up with some more friendly libraries.
No call or return instructions, but it seems likely that implementing them as macros would be fairly easy. This is based upon the 30 minutes I spent looking at their amazingly clear documentation on the "instruction set".
Thank you again Andreas! I still don't understand the Python kerfluffel. The craftsman chooses the tool most fitted for each job. I have a number of ESP smart sensors around the house that could just as easily be running Python. C++ just happens to be my go-to hammer. It was a lazy choice.
I have a similar opinion. And if you came from the RPI your go-to hammer most probably would be Python. That was the point of my question. Anyway: I learned a new word: kerfluffel ;-)
Habe nicht so viel Hoffnung. Mal sehen. Vielleicht täusche ich mich ja. Deshalb habe ich auch den Termin relativ kurz angesetzt. So wird es mindestens keine "Never Ending Story". Das Tema selbst ist sehr spannend finde ich.
Hi Andreas, again a great video! I would like to know if it is possible to have interrupts in ULP, I would like to have my 3D printed weather station working with ULP to save energy. So I would need to count rain drops and wind speed in ultra low power while main processor is in deep sleep and after a minute wake it up and send all the information using LoRa TTN.
The ULP does not use interrupts. As described it starts every few ms. So it should be possible to measure both, wind speed and rain. At least my sensors create a relatively slow squarewave which can be read with the ULP.
(just sayin'...we may pronounce "one hundred dollars", but when written, currency symbols go before the number, such as "$100") This sort of thing is so great to know. Hardly anyone wants to spend more on energy than they should. If you have only one of these things, not so bad, but when you have a (smart) house full of them, it really adds up!
Watching this video eating ice-cream! Good time! Excellent subject as always, mr. Spiess! Just recently I got an ESP32-CAM and start learning ESP-IDF. Its so much better than Arduino environment IMO. Sure is a bit more complicated but RTOS is neat! And now I'm looking for a epaper display to mess around but they seem to be hiding in the market. What is going on?
Great time frame! Some people will not be able to receive their parts in time to complete their projects by your deadline. I would give it at least 60 days.
Hi folks, I'm really busy. But maybe writing a CLang LLVM backend is not as hard as we all assume? github.com/llvm-mirror/llvm/tree/master/lib/Target/RISCV
I've spent probably 10 hours today working the i2c angle on this thing, and the compiler is starting to sound much easier. We have a C preprocessor and an assembler. The only layer missing is stitching together operations into assembly. After today, it doesn't seem so bad to get something rudimentary thrown together.
How can I have missed this video? Ah, I see, I was abroad. Must have been 30 years when I was still doing stuff in Assembler (6502 and 8051 series) I disagree with you comparing it to a somnambulist: After your explanation of the pin numbers and hold commands, I prefer to see it as 'undead' or 'living dead'
Maybe it's called touch_pad_7 because it's the 7th pin having the touch functionality? bad naming anyways xD thanks for this video! i was looking into that but never really had the motivation :)
Excellent video! Maybe a low power solar powered version of the Geiger-counter? Now it draws a lot of power because the ESP has to be always on to count the pings. I started to think about to do it with an ATTINY85 and an ESP yesterday. Where the ATTINY does the counting, and wakes up the ESP every few minutes, passes the ping number to the ESP and the ESP uploads the values to Thingspeak or similar. But maybe the ULP of the ESP32 could do the counting?
Can a uBlox GPS wake up the ESP32 with ULP? Can the ESP32 receive LoRa packages while sleeping? Could it be used as a QRP beacon (Lewis library) and a 3$ QRP Pixie transceiver and a transistor for say a weather balloon?
GPS units work with Serial, but some do have a led that turns on when they aquire a signal. You could monitor the led with the ULP and only wake if there is a valid lock.
@@AndreasSpiess I have managed to switch the 'key' of the QRP-Pixie transceiver using a transistor and the ESP32. I am working on receiving from the Pixie on the ESP32 data bits at a very slow rate using a modified SoftwareSerial library. This could allow two ESP32 to communicate with an unbelievable range on lower frequencies such as 7.020 Mhz (crystal in the QRP kits). About the weather balloon it just seems like a good candidate for a long antenna and long range, low data transmission.
Grüetzi Andreas, A great video as usual. A little while ago you reviewed ESP32 boards and noted that all of them draw pretty high quiescent currents. What is the breakout board you are using in this video? Thanks a lot for your good work, David
As others have said, this is SO exciting! Thank you for spurring the community for more sample code examples for layman like myself. Correct me if I'm wrong, but it looks like the posted example for reading the built in hall effect sensor does not have an upper and lower bound to wake it from sleep? Instead it just wakes up every 3 seconds to print its averaged measurements? Also is it possible for the RTC code to run continuously in the background. I have a project where the main loop scans bluetooth, then deep sleep. It'd be nice if the RTC could continue to poll a sensor even when the chip is awake.
Kleiner Tipp zu deiner Kritik am Labeling der Pins: Durch die Mehrfachbelegung hat Espressif einige Ports eingespart, was wiederum Platz auf dem Chip spart. Das Label "Touch_Pad" scheint nach der Dokumentation von Espressif zu bedeuten, dass dieser Pin ebenfalls einer der kapazitiven touch pins ist. D.h. der Pin kann über den bloßen Kontakt erkennen, ob etwas "touchaktivierendes"(Bsp.: dein Finger) den Kontakt berührt hat. So kann bspw. ein Kabel vom Pin an eine leitfähige Münze angeschlossen werden und durch berühren der Münze kann etwas ausgelöst werden, wenn der pin im Programm verwendet wurde. Sonst, top!
Hi Andreas, Thanks for this very interesting video. I was wondering whether to use an Arduino or an ESP32 for an ULP project. With the Arduino, I found that I'd have to build a very basic one myself for ULP applications while the ESP32 seems to be ready to use as is, which is great. Maybe a comparison of Arduino vs. ESP32 in ULP applications would be an idea for a future video? ;-) Cheers, Christian
Hi Andreas, could you list a few reason on why to still use the Arduino IDE and board on our projects when we can code on the ESPs directly in micropython? Many thanks
Was watching your new video with great interest, Andreas, following your informative, relaxed and interesting walkthrough when at 6:14 you made me laugh out loud ... so I stopped and had to give you a Like. Excellent video as always!
hey can you use the ulp core when the main processors are on? i would to have a third core for things that don't take much processing power. But is something i need to run independently of the main two processors.
Hi Andreas and all other, i was wondering if there is any way to use 2 wake ups source that won't interfere each other - i have situation that i deep sleep the esp32 for 24 hours and would like to count pulse from sensor using ext0 External Wakeup Source during that 24 hours - after 24 hours i would like to report the number of pulse to the cloud - my problem is that the ext0 wakeup resets the 23 timer sleep - i would love to get some suggestions - thank you andreas for your amazing work over the years - you are the best!
Top notch video, in the tough competition of yourself! Will help in my endeavours to have solar powered sensors. together with LoRa, one can probably have very small batteries that last forever with small solar panel. even indoors? Update on competition, or did noone dare?
Hi Andreas Did you measure the accuracy of the wakeup period : /* Set ULP wake up period to 100ms */ ulp_set_wakeup_period(0, 100 * 1000); If you would set it to 60 seconds, how much would it drift after 1 or 2 hours (and maybe more)?
Hi Andreas, I enjoy your videos, I am trying to compile your ulp_adc.ino sketch but gets the following error exec: "python": executable file not found in %PATH% Error compiling for board WEMOS LOLIN32. I am on esp32 version 1.0.4 with a lolin32 Wemos board Any idea what I missed or must do? I went through all the small print on DUFF2013 as well and some of the examples, same error. must be something I did not install? Regards Johann
IDEA FOR THE COMPETITION: Wake the ESP32 (and transmit new value) when the change in a load cell is over 10 grams. Go to deep sleep when the signal is stable for 2 secs (SD below 0,5 grams). Components: load cell, HX711 and ESP32 Dev.Board.
@@AndreasSpiess Raise to to $10k and give me a couple of months and then I'm in! I would like use with an external 32kHz Crystal for good timekeeping in sleep might be interesting... I also need to drive a 5V ultrasonic sensor so I need a bit of hardware design too.
Sorry for my maybe stupid question. Is it possible to use the ulp and keep BLE connected? Maybe sending the esp to deepsleep only for a few milliseconds in a loop?
Hallo Andreas, für mich wird das Energiesparthema auch interessant. Ich will eine LoRa-Wetterstation (erst einmal) mit einem BME280 am Sender und einem Stemedu ATmega328P LoRa board mit 3,7V Akku (Halterung auf dem Board) als LoRa-Sender aufbauen. Dort wird nach dem Messvorgang und dem Senden des Datenpakets an den LoRa-Receiver der Sender in den Sleep-Mode versetzt: LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //Goto sleep 8 sec Durch mehrfaches Aufrufen der Zeile will ich eine Messung alle 60 sec. Ich denke, dass ich da schon gut Akku-Leistung beim Sender sparen kann. Der Receiver steht neben dem PC und hat Stromnetz-Zugang. Gibt es da noch andere Möglichkeiten, Energie des Akkus des Senders zu sparen? Viele Grüße Ulli
Ich hab mal ein video zu diesem Thema gemacht (Für den ESP8266, aber das Prinzip der Strommessung ist dasselbe. Da gibt es einiges zu beachten. Allerdings würde ich für eine Wetterstation ein kleines Solarpanel vorsehen. Dann bist du die Sorgen los...
Hi Andreas, I love your videos and am very impressed by your knowledge. Your ESP-WOOM-32 breakout board looks like just what I have been seeking for over a month. Would you please tell me the model number and manufacturer/seller? Thanks in advance.
Hi Anreas, I want to play with this ultra low power stuff, but I also want to deploy this with battery power where the power lasts a very long time. Any suggestions what board to use? I do not have the design knowledge to build one from scratch using a plain esp32 chip. The available development boards I am aware of use to much power to last very long.
I'm having difficulty with compiling the example code on the GitHub README file of the arduino_ulp repository. I'm trying to use the ULP co-processor of my ESP32 but I'm using Arduino on Windows. When I compile the code I get the following error: exec: "python": executable file not found in %PATH% Error compiling for board ESP32 Dev Module. Any ideas on how I can fix this? I'm worried that I might have messed up step 8 of the setup instructions as I'm not entirely sure what "the folder of the pre-compiled binutils-esp32ulp toolchain" is. Any help will be greatly appreciated!
Hi Andreas, this is by far your best and most exciting video yet! I also wrote assembler in the late 70's and 80's so I hope I can meet your challenge. This feature of the esp32 was what interested me most when it came out. Thank you so much for opening the door for me.
I also waited a long time to get this "missing link" from duff2013.
"Most playtime per dollar" 😹 ich musste sehr lachen, Danke!
Danke, endlich mal "aktuelle" Videos über low-level Sprachen und Microcontroller 😻👍
Endlich kann man wieder auf Effizienz programmieren, wie im Studium gelernt :)
Wusste gar nicht dass ESP diese Schnittstelle hat 💗 danke!
Dann freue ich mich schon über deine Teilnahme am Challenge ;-)
Andreas you are very funny. 😁 I love your videos!
Moved all my senior design code from atmega to the esp. Got the display working,moved peripherals. Using your guide for the rtos. I can't believe this thing is under 10$. You are awesome. Thank you for this, sincerely from Texas.
Glad you have success with the ESPs..
Omg I am so excited to know how to program the ULP. The esp 32 keeps on getting more exciting. Thank you Andreas
You are welcome!
Aweseome! I've played around with the ULP using ESP-IDF, but it's a hassle to get it set up and integrated into the build system. Glad to have this video, the ULP is a really cool part of the hardware that hasn't been talked about as much.
Part of it was because it was no easy way to use it with Arduino. At least that is what I think.
I love the plastic hand. Makes me laugh everytime.
Thank you!
11:32
There is a register that directly controls the rtcio pins output.
WRITE_RTC_REG(RTC_GPIO_OUT_REG, 26, 1, 1)
This line directly controls gpio 2.
Thank you. I will try. I wonder why the examples do not use this simple way :-(
you would think espressif would want to strongly encourage support of this feature.
someone should make a C compiler for the ulp. the 8kb of the ulp is quite adequate for some reasonable code.
Maybe they do. I do not know.
I would say that the target audience for this feature is comfortable with using assembler, so they see no need for a compiler. The code is minimal anyway.
@Mai Mariarti I see your point and I agree, I was only trying to see things from ESP's point of view.
Espressif guy here: The issue is that the ULP barely is a microcontroller. It originated from a few digital people trying to build a somewhat programmable state machine to do some sensor sampling in deep sleep mode, then added in enough logic to make it turing-complete. Porting C to it would be a pretty tall order. We have something in mind that will make that possible for the ULP in our next chips, if that's a comfort.
@@Spritetm I agree. Some processors just weren't made to support a C compiler. For example, 8 bit PIC chips. This "CPU" smells more like an FPGA state machine. Being a long time assembly language lover, I will be looking into this architecture.
Great video as always, thank you. I use another method which works in C without programming the ULP. There is a wake up hook function when the ESP32 wakes up. It gets called before booting the ESP32, before the flash is activated.
C functions can be placed into the RTC memory for little processing. This function can continue to boot the ESP32 (which takes 0.3 secs) or put it into deeplseep again. This hook requires only 3 ms to check some processing. The advantage is can it can be programmed in C, the disadvantage is that only low-level IO can be done because program functions (FLASH) are not available. However all registers and ESP32 ROM functions can be used, or own functions marked with IRAM_ATTR will also work.
This is pretty much low level like the ULP, however programmed in C with proper print debugging, etc.
Regards Helmut (Arduino Hannover & RadioShuttle.de)
Interesting idea. I did not know that it exists. Maybe there is a small difference: The ULP clocks quite slow but still is quite fast because of its simplicity (microseconds) and only needs "full throttle" 2mA. So you can run it every few ms and still hardly consume any energy. Might be interesting for faster moving signals where you have to check quite frequently.
The main reason I use the wakeup hook is that the deepsleep timer does not last long, therefore it wakes up the ESP32 too often which consumes energy, now I can just re-enter into deepsleep (3 ms versus 300 ms).@@AndreasSpiess
That what I understood. It is a goo way to save energy by reducing the on-time.
Another old geezer assembler fan here. Andreas ftw :)
So where is your proposal for the competition ;-)
Great info! I spent many years in assembly language on DG Nova's and early micros (6502 and 8080). Glad to get to use it again. The ESP32 has a lot of hidden power. Looks like fun.
So it will be easy for you. It is already good if you still remember how to calculate with short hex numbers and overflow ;-)
Better than consistently good.
Excelsior!
Thank you!
Hi Mr Spiess, another well documented video just to get the juices flowing. The ESP32 is becoming more and more an IoT contender because of the ultra low power capability. and now with the ULP processor even more so! Thank you for the video.
You are welcome!
Good to see this finally get some airtime :) I tried it last summer but ended up running into problems with the ADC at the time. Nevertheless, thanks for expanding the audience and hopefully the number of available working projects
What problems did you have with the ADC? Does the example Andreas gave here help you?
@@aspzx I had problems expanding to use the other pins at the time. I was using the same examples from Duff2t013. They are good examples but I was short of the brain cells and it was hard work to get it all working. As I recall, I got there in the end but it wasn't straightforward... In the end I kept on using the ADS1115.
I only used this example but did not do thorough testing. It worked for my thresholds.
Thank you for introducing me to these super useful & very practical capabilities of the Esp32 especially for battery application. The ability to do things with out troubling the main processor has extraordinary potential for extending battery life which is always something that is useful for end users. Thanks for sharing!
You are welcome. Please consider participating in the challenge. It would be a good jump-start ;-)
Hi Andreas. At minute 2:00 you tell that the esp32 can wake out of deep sleep if a pin is touched. I thought it was only possible what a timer was reached. Does that mean that for example for a simple door sensor (with magnetic reed contact) I don't have to use this ULP core and I can somehow put the esp32 in deep sleep and only let him wake up when the reed contact gives a signal ? Can I do this on SIGNAL CHANGE? Or is it only on UP or DOWN but not on CHANGE ? Kind regards from Belgium
I'm not sure about signal change, but you can set up a trigger for the ESP32 to wake from deep sleep when an IO pin goes high. Here is more info: pcbreflux.blogspot.com/2017/02/esp32-deep-sleep-example.html
After 20 years, do I really need to go back to assembler. Oh boy :)
I am sure you will remember a few things. And maybe you still find your old hex calculator ;-)
Great video! My friends and I were looking into this "issue" last year and your video is far the best! Thanks again Andreas!
I am only the messenger. The hard work was done by duff2013.
After Lora series, maybe the best video to date.
Thank you. I have to admit, I liked also very much producing it. I waited for a long time until a got this chance...
Nice. This is exactly what i need to make a ULP power management system for a wind turbine project. Thank you for this tip!
Good luck for your project!
Hi Andreas, the Voodoo you are talking about allows the compiler to calculate the size for all the ULP programs (which is why you have two arrays that contain pointers to the begin and end of the ULP program, respectively). But as always a fantastic video.
One idea for the challenge: Read 1-Wire sensors...
1-Wire would be awesome
@Joachim: I thought it will also load the code to RTC memory? And thank you for your nice words!
@Mai Mariarti I tried the I2C example yesterday, and it does not work with Arduino out of the box (it won't even build). Although the adc code from their github doesn't work either, but Andreas's code works great. So there's some more voodoo to figure out. The list of operations has I2C_RD and I2C_WR, so I believe at least one of the pins has hardware support builtin. I'm going to try to tackle this today.
Holly bananas batman!
I thought it would be a simple task to use the ULP!
The links alone saved me hours of googling.
Much appreciated.
It is not easy. This is probably why you do not find a lot of projects using it.
Wow! Been waiting for this for a long time. Amazing stuff. Now I can finally make my mqtt door sensors. I have boards for a trigboard-based design just for this task, but now I will try it with just an ESP32. Great stuff!
It needs a little more than a trigboard. But is probably ok for most battery applications
NS Gaming would like to build and IOT device if we can talk
This was exactly my thought. Wake on state change to report door open and door close events via MQTT without the need for complex supporting circuitry. Exciting.
Great video, Andreas! I accept your challenge to create a cool project with the ULP!
Just send me a message on facebook or on twitter when you are ready...
Andreas thank you for explaining this (cool) feature and willing to spend 100 usd for the open-source competition (thumbs up)
I hope we will get some interesting contributions ;-)
Great video, Andreas ... "until recently" the PICs were programmed in assembler too.
For some version of "until recently"... The MPLAB X IDE has been available for the last 5 years, for free with a C compiler :)
That said I had fun with the 12-bit words and reduced instruction set in the older PICs in the 90s. That was a different level of fun.
Maybe this is why PICs were no more as popular as Arduinos ?
PIC has been programmable in both C and assembly years before Arduino even existed at all and still can. Also, while C is obviously more convenient there are still times when it is useful to use assembly. That is mostly the case when you need fast acting realtime operation such as precise timing signals, dealing with stepper motors running at high step rates and so on.
Love your sense of humor! Great video as always! Brought back memories of 6800, 6502, and 6505. Love voodoo lol!
Thank you!
Fascinating challenge... I would recommend mentioning the prize challenge in the video title (or making another video to link to this one) as I’m sure folks who relish such problems might miss it with the sleepwalking title.
Done. Thank you for your suggestion.
Andreas, Thank you for all of your hard work and iniating this challange to promote support software. You guys are great!
Our pleasure!
Yes,the good old times. Programming a Z80 with an Manual(a real paper book!), and then calculate the bits by hand( yes, also on paper.....) to hex values. Then type all Values by hand into the dev.board , which only have some switches, 7segment led and a small keypad! And if it loose the power, all is gone. Young people couldn't understand, how amazing the first blinky on those projects make me so Lucky, to get it running.....
Not to forget the cassette tape recorder to save the programs. I still prefer the modern tools if I have to get somewhere...
I had a lovely hand written ready reckoner for the Z80 with the instructions laid out in a 16 by 16 grid. Fond memories, but the good times started for me with emulators, break points, swiftly followed by C. Debugging assembler without JTAG sounds hard work.
I dont miss those days, but I still think it was a fun and educational process to toggle in the bootloader on an Imsai 8080 via the front panel! Thankfully, I'm not so old I had to enter the whole program that way.
Yeah these were the days. In the late 70's without an assembler I developed a four pole linear circuit simulator on a ZX spectrum. Everything was developed on paper and very little debugging was necessary because you had to think rigorous with attention to detail. Still have a binder full of hand written assembly and it's hand-translated machine code. Unthinkable for today's standards. For back in these days this was the fastest code. But you had to do everything even design your floating point arithmetic. This program could deal with up to 200 nodes and had FFT for time domain output. Amazing how little memory we were forced to use.
I learned on 1802 by hand assembling. A truly painful experience, but taught me to really think out the project before writing one line of code.
Dear Mr. Spiess, congratulations for the topic and the fantastic video... I am also one of z80 assembly trained... I hope to have more advanced video for the ESP32 I think it deserves. Thanks again.
I do not think I will do an advanced video here. I hope some viewers will "bite the bullet". Maybe somebody writes a tutorial?
It is good to see these features being implemented for Arduino and thus made available to many more people. I've been using ESP-IDF rather than Arduino, but then again I've been a professional programmer for a while. I willhave a go at your competition if I come across something interesting to do.
I would be glad to see your contributions to the competition!
Awesome introduction, this opens a lot of possible use as battery powered security sensor for the ESP32. I have a garage that can't be connected to the alarm plant, but I can reach it via WiFi: I can now use a battery powered ESP32 to probe the environment and receive alerts if needed. Thanks!
You are welcome!
Andreas once again you blow us away with new ideas. Very well done.
Thank you!
Great video Andreas,
I had read about this but had not gone down the rabbit hole per se, as I had no vision for a use case currently. Il be going over this video again in detail as a solar project could perhaps do with this update.
I am sure some examples will pop up over time. Many projects where we use an ATtiny can be done this way.
Hi, I hope you are well during this tough time in the world. I have come across this video after searching online a way to keep counts of a pulse interrupt from a dds353 kwh meter and periodically send the counts over mqtt. I had not realized that esp was different from arduino in the way ISRs are handled during low power operations. Now I am convinced I need this approach shown in this video. Kindly point to how I can listen to interrupts and maintain a count for it then wakeup the main processor say after 10 minutes and pass the data over for Serialprinting( Mqtt transmission in my use case which I can do after I have figured out the ulp interrupt and periodic waking up of the main processor). This is very useful stuff thank you
Nice project! I hope you will get it working.
Very interesting. Lots of possibilities using these techniques. Assembler coding isn’t really that hard but I’m sure some people will come up with some more friendly libraries.
I would hope so. But browsing through the comments I am not sure :-(
Man, ESP, Arduino, LoRa - these are completely IRRELEVANT - what IS relevant is your speech like the one at 4:18 - I died almost! ;-) So lovely ;-)
Exactly. Glad you know what I am talking about ;-)
@@AndreasSpiess I played this part to my wife and her reaction: "what's funny?" ;-)
Wonderful deep dive and very much appreciated by me! Thanks!
You are welcome!
Amazing find, ULP is super useful. Using it to make a battery powered switch board for my home that'll hopefully last a year.
Should be possible.
@@AndreasSpiess yeah, simply recording the previous state of the pins then waking up the main to update mqtt. I'll put it on github :)
No call or return instructions, but it seems likely that implementing them as macros would be fairly easy. This is based upon the 30 minutes I spent looking at their amazingly clear documentation on the "instruction set".
I am curious about the contributions for the contest. I hope we will see some creativity there...
Espressive is a sharp company, they are sending development kits
You are a god. This is presented so incredibly well. No words for it...
Thank you again Andreas! I still don't understand the Python kerfluffel. The craftsman chooses the tool most fitted for each job. I have a number of ESP smart sensors around the house that could just as easily be running Python. C++ just happens to be my go-to hammer. It was a lazy choice.
I have a similar opinion. And if you came from the RPI your go-to hammer most probably would be Python. That was the point of my question. Anyway: I learned a new word: kerfluffel ;-)
I like Python, describing C as a hammer does my head in
So cool, bin sehr gespannt auf die Resultate.
Habe nicht so viel Hoffnung. Mal sehen. Vielleicht täusche ich mich ja. Deshalb habe ich auch den Termin relativ kurz angesetzt. So wird es mindestens keine "Never Ending Story". Das Tema selbst ist sehr spannend finde ich.
Interresting Idea and very generous. I really want to see the outcome....
Or you go into it yourself? After a little assembler programming, you will be the hero in hex arithmetics ;-)
@@AndreasSpiess Yeah thats true.. although im more of the hardware guy it would surely not hurt to try it out and gain some experience....
I was looking for arduino ulp support in platformio but didn't find anything yet, has anyone else been more successful ?
1y later with IDF yes, not Arduino.
Useful AND interesting as always. Thanks Andreas!
You are welcome!
I think being able to monitor a cheap solar panel and battery on its own and change esp wake times based on available sunlight and battery levels
Good idea!
Thanks! I Just bought one, let's test it! 👍🏻
:-)
Hi Andreas, again a great video! I would like to know if it is possible to have interrupts in ULP, I would like to have my 3D printed weather station working with ULP to save energy. So I would need to count rain drops and wind speed in ultra low power while main processor is in deep sleep and after a minute wake it up and send all the information using LoRa TTN.
The ULP does not use interrupts. As described it starts every few ms. So it should be possible to measure both, wind speed and rain. At least my sensors create a relatively slow squarewave which can be read with the ULP.
(just sayin'...we may pronounce "one hundred dollars", but when written, currency symbols go before the number, such as "$100")
This sort of thing is so great to know. Hardly anyone wants to spend more on energy than they should. If you have only one of these things, not so bad, but when you have a (smart) house full of them, it really adds up!
Maybe you are right with the 100$ But asking google there are many ignorants like me ;-)
Smiles at students these days
Watching this video eating ice-cream! Good time! Excellent subject as always, mr. Spiess!
Just recently I got an ESP32-CAM and start learning ESP-IDF. Its so much better than Arduino environment IMO. Sure is a bit more complicated but RTOS is neat!
And now I'm looking for a epaper display to mess around but they seem to be hiding in the market. What is going on?
I do not know of issues concerning e-papers. I recently got two from waveshare
Happy Sunday Morning Andreas 😁🏴 what a start to 2019😀😁😁😁😁😁😁😁😁😁😁
Happy Sunday to you, too!
Great time frame! Some people will not be able to receive their parts in time to complete their projects by your deadline. I would give it at least 60 days.
You are right. It is short. I thought that people not owning an ESP32 will anyway not be interested. And I wanted to keep the momentum.
Your videos are really interesting. I appreciate your effort on sharing valuable information.
Thank you!
Nice video, thanks for the internals. Assembler was never my world but i like the idea to speak computer language:)
For short sequences Assembler is ok, I think
This is the man. 🌹 Absoluty amazing
:-)
"the chance you'll get it right the first time is pretty small." :-D. right on!
:-)
Hi Andreas! I would also add 50$ for a C ULP compiler. Why not pool together in BountySource?
As you might have seen in one of my last videos I will not start a community project in the near time. So somebody else has to do it.
If there would be a pool for an open-source c2ulp compiler, I'd also add $50 to it 😸
Hi folks, I'm really busy. But maybe writing a CLang LLVM backend is not as hard as we all assume?
github.com/llvm-mirror/llvm/tree/master/lib/Target/RISCV
Maybe this manual is helpful: it talks about linking and memory layout:
docs.espressif.com/projects/esp-idf/en/latest/api-guides/ulp.html
I've spent probably 10 hours today working the i2c angle on this thing, and the compiler is starting to sound much easier. We have a C preprocessor and an assembler. The only layer missing is stitching together operations into assembly. After today, it doesn't seem so bad to get something rudimentary thrown together.
Hello Andreas, When will you make a video about ULP challenge results? Thank you for your answer. I Love your work!
Unfortunately, I did not get enough participants.
After hearing your cat purr, Mogg E has carried out a frantic search of Schloss Biffo to see where her rival is hiding. :)
So "wireless cat communication" exists ;-)
@@AndreasSpiess :)
5:39 - is that you doing a voice over? Great info - thanks for sharing!
The whole video is a voice over. But you are correct. There I had to correct something ;-)
For those curious, I just measured my ESP32 DevKit C at 2.8uA in regular deep sleep - and that includes the tiny built-in LED!
Thank you for your feedback!
Measured ESP32-Wroom-D Dev. Board in regular deep sleep at 4.1mA.
How can I have missed this video? Ah, I see, I was abroad.
Must have been 30 years when I was still doing stuff in Assembler (6502 and 8051 series)
I disagree with you comparing it to a somnambulist: After your explanation of the pin numbers and hold commands, I prefer to see it as 'undead' or 'living dead'
I will not start a fight for the right wording;-)
Aaaah assembler, back to the roos :-D
Thanks for video.
You are welcome!
This video rocks!
Thank you!
Maybe it's called touch_pad_7 because it's the 7th pin having the touch functionality? bad naming anyways xD
thanks for this video! i was looking into that but never really had the motivation :)
I think so. But I just want to know where I have to solder my poor wire on ;-) And there I only find 27
Excellent video!
Maybe a low power solar powered version of the Geiger-counter? Now it draws a lot of power because the ESP has to be always on to count the pings. I started to think about to do it with an ATTINY85 and an ESP yesterday. Where the ATTINY does the counting, and wakes up the ESP every few minutes, passes the ping number to the ESP and the ESP uploads the values to Thingspeak or similar. But maybe the ULP of the ESP32 could do the counting?
Counting the Geiger pulses would be a good example. Only trigger the ESP if an alarm occurs and your ESP runs for a long time ;-)
Can a uBlox GPS wake up the ESP32 with ULP? Can the ESP32 receive LoRa packages while sleeping? Could it be used as a QRP beacon (Lewis library) and a 3$ QRP Pixie transceiver and a transistor for say a weather balloon?
Good questions. Is this your project idea? Then maybe you have to add a little info.
GPS units work with Serial, but some do have a led that turns on when they aquire a signal. You could monitor the led with the ULP and only wake if there is a valid lock.
@@AndreasSpiess I have managed to switch the 'key' of the QRP-Pixie transceiver using a transistor and the ESP32. I am working on receiving from the Pixie on the ESP32 data bits at a very slow rate using a modified SoftwareSerial library. This could allow two ESP32 to communicate with an unbelievable range on lower frequencies such as 7.020 Mhz (crystal in the QRP kits).
About the weather balloon it just seems like a good candidate for a long antenna and long range, low data transmission.
uBlox GPS should have a square wave pin that can be programmed.
@@AndreasSpiess nice answer
Danke für das super Video. Überlege mir gerade mit Was für einem Projekt ich mitmachen kann.
Super! Freut mich.
Grüetzi Andreas, A great video as usual. A little while ago you reviewed ESP32 boards and noted that all of them draw pretty high quiescent currents. What is the breakout board you are using in this video? Thanks a lot for your good work, David
It is just a PCB. You get it on Aliexpress.
@@AndreasSpiess I found it. 😀
As others have said, this is SO exciting! Thank you for spurring the community for more sample code examples for layman like myself. Correct me if I'm wrong, but it looks like the posted example for reading the built in hall effect sensor does not have an upper and lower bound to wake it from sleep? Instead it just wakes up every 3 seconds to print its averaged measurements?
Also is it possible for the RTC code to run continuously in the background. I have a project where the main loop scans bluetooth, then deep sleep. It'd be nice if the RTC could continue to poll a sensor even when the chip is awake.
You are right: The ULP should decide on when to wake the main cores.
Kleiner Tipp zu deiner Kritik am Labeling der Pins: Durch die Mehrfachbelegung hat Espressif einige Ports eingespart, was wiederum Platz auf dem Chip spart. Das Label "Touch_Pad" scheint nach der Dokumentation von Espressif zu bedeuten, dass dieser Pin ebenfalls einer der kapazitiven touch pins ist. D.h. der Pin kann über den bloßen Kontakt erkennen, ob etwas "touchaktivierendes"(Bsp.: dein Finger) den Kontakt berührt hat. So kann bspw. ein Kabel vom Pin an eine leitfähige Münze angeschlossen werden und durch berühren der Münze kann etwas ausgelöst werden, wenn der pin im Programm verwendet wurde.
Sonst, top!
Das weiss ich schon und ich habe ja ein Excel Sheet dafür erstellt.
Hi Andreas,
Thanks for this very interesting video. I was wondering whether to use an Arduino or an ESP32 for an ULP project. With the Arduino, I found that I'd have to build a very basic one myself for ULP applications while the ESP32 seems to be ready to use as is, which is great. Maybe a comparison of Arduino vs. ESP32 in ULP applications would be an idea for a future video? ;-)
Cheers,
Christian
I would not compare the ULP with an Arduino. The concepts are too different. Maybe I will cover the ULP with a ecample in the future...
Also where do I have to submit for the competition?
To me. Facebook messenger or Twitter
Super interesting and usefull video, thanks Andreas
You are welcome!
Very good work!!!
Thank you!
Hi Andreas, could you list a few reason on why to still use the Arduino IDE and board on our projects when we can code on the ESPs directly in micropython? Many thanks
Because my channel would be dead if I would go away from Arduino IDE
I can see the problem there...
@@AndreasSpiess Well spoken
Beautiful. I like your Funny words :)
Thank you!
Useful video 👍
Thank you!
NIce review, thanks for sharing as always :-)
You are welcome!
Hi Andreas, great video and initiative! I am also interested about applications related to the MPU6050!
Thank you!
Was watching your new video with great interest, Andreas, following your informative, relaxed and interesting walkthrough when at 6:14 you made me laugh out loud ... so I stopped and had to give you a Like. Excellent video as always!
Thank you for the like!
hey can you use the ulp core when the main processors are on? i would to have a third core for things that don't take much processing power. But is something i need to run independently of the main two processors.
Do you still recommend using Otii for the purpose of low-power designing? Or is there any better solution?
If you do not need more than around 4 volts it is good. I use it for my tests. The software is also good.
Hi Andreas and all other, i was wondering if there is any way to use 2 wake ups source that won't interfere each other -
i have situation that i deep sleep the esp32 for 24 hours and would like to count pulse from sensor using ext0 External Wakeup Source during that 24 hours - after 24 hours i would like to report the number of pulse to the cloud - my problem is that the ext0 wakeup resets the 23 timer sleep - i would love to get some suggestions - thank you andreas for your amazing work over the years - you are the best!
Top notch video, in the tough competition of yourself! Will help in my endeavours to have solar powered sensors. together with LoRa, one can probably have very small batteries that last forever with small solar panel. even indoors? Update on competition, or did noone dare?
Unfortunately, I only got 1.5 entries. Was quite disappointed :-(
Hi Andreas
Did you measure the accuracy of the wakeup period :
/* Set ULP wake up period to 100ms */
ulp_set_wakeup_period(0, 100 * 1000);
If you would set it to 60 seconds, how much would it drift after 1 or 2 hours (and maybe more)?
I would not trust this clock for exact timing. Maybe you can calibrate it. But I am sure it will be influenced by temperature.
Hi Andreas, I enjoy your videos, I am trying to compile your ulp_adc.ino sketch but gets the following error
exec: "python": executable file not found in %PATH%
Error compiling for board WEMOS LOLIN32.
I am on esp32 version 1.0.4 with a lolin32 Wemos board
Any idea what I missed or must do?
I went through all the small print on DUFF2013 as well and some of the examples, same error.
must be something I did not install?
Regards Johann
fixed, had to put python path in windows %path%
IDEA FOR THE COMPETITION:
Wake the ESP32 (and transmit new value) when the change in a load cell is over 10 grams.
Go to deep sleep when the signal is stable for 2 secs (SD below 0,5 grams).
Components: load cell, HX711 and ESP32 Dev.Board.
Interesting idea. I think this already could be done based on my example. Because it already can read ADC values.
I learned Z80 Assembler when I did my Bachelor , I was damn good in this lime now I can't hardly remember.
Not very different to the ULP assembler...
I learned Z80 assembly too just to write a little gameboy game which was based on Z80
@ATS3788 I do not know your skills in electronics or programming languages but, from your icon, I'm sure you're a great music expert ! WOW !!!
I have only just seen this video and it is very cool... What happened to the challenge? Was there a follow-up video?
There were not many entries and I did no follow-up because I was disappointed.
@@AndreasSpiess Raise to to $10k and give me a couple of months and then I'm in! I would like use with an external 32kHz Crystal for good timekeeping in sleep might be interesting... I also need to drive a 5V ultrasonic sensor so I need a bit of hardware design too.
Sorry for my maybe stupid question. Is it possible to use the ulp and keep BLE connected? Maybe sending the esp to deepsleep only for a few milliseconds in a loop?
BLE needs the main processor.
Great Stuff !!
Thank you!
Hi sir, where did you find your simple esp32 board ? Did you make it yourself ?
I adapted the link. or you search for "esp32 adapter"
Hallo Andreas, für mich wird das Energiesparthema auch interessant. Ich will eine LoRa-Wetterstation (erst einmal) mit einem BME280 am Sender und einem Stemedu ATmega328P LoRa board mit 3,7V Akku (Halterung auf dem Board) als LoRa-Sender aufbauen. Dort wird nach dem Messvorgang und dem Senden des Datenpakets an den LoRa-Receiver der Sender in den Sleep-Mode versetzt: LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //Goto sleep 8 sec
Durch mehrfaches Aufrufen der Zeile will ich eine Messung alle 60 sec. Ich denke, dass ich da schon gut Akku-Leistung beim Sender sparen kann. Der Receiver steht neben dem PC und hat Stromnetz-Zugang. Gibt es da noch andere Möglichkeiten, Energie des Akkus des Senders zu sparen?
Viele Grüße Ulli
Ich hab mal ein video zu diesem Thema gemacht (Für den ESP8266, aber das Prinzip der Strommessung ist dasselbe. Da gibt es einiges zu beachten. Allerdings würde ich für eine Wetterstation ein kleines Solarpanel vorsehen. Dann bist du die Sorgen los...
Back to heathkit's 6809 trainer of 1981!
Much Sadness...
Hi Andreas, I love your videos and am very impressed by your knowledge. Your ESP-WOOM-32 breakout board looks like just what I have been seeking for over a month. Would you please tell me the model number and manufacturer/seller? Thanks in advance.
You always find the needed links in the comments of my videos.
Hi Anreas, I want to play with this ultra low power stuff, but I also want to deploy this with battery power where the power lasts a very long time. Any suggestions what board to use? I do not have the design knowledge to build one from scratch using a plain esp32 chip. The available development boards I am aware of use to much power to last very long.
I have my proposal in the video description. And a few videos about low power and the ESP8266. The same applies to the ESP32
I'm having difficulty with compiling the example code on the GitHub README file of the arduino_ulp repository. I'm trying to use the ULP co-processor of my ESP32 but I'm using Arduino on Windows. When I compile the code I get the following error:
exec: "python": executable file not found in %PATH%
Error compiling for board ESP32 Dev Module.
Any ideas on how I can fix this? I'm worried that I might have messed up step 8 of the setup instructions as I'm not entirely sure what "the folder of the pre-compiled binutils-esp32ulp toolchain" is.
Any help will be greatly appreciated!
Maybe you go to Github and raise an issue. I am not the "inventor" of this code.