Hi,
So I had quite some trouble getting my board to work as most things are not straightforward. Therefore, I am writing this short tutorial with everything I learned so people do not have to rediscover everything on their own. This guide is specifically for the UNO R3 + ATmeg328p + ESP8266 WIFI (4Mb) USB - TTL. This thing still feels like a black box to me, so if you have any more insight please let me know in the comments.
Board Layout
The board has two chips, an ATmega328p chip, and an ESP8266 WIFI module. Both chips can communicate with each other and you as a user can communicate/read/write to one over USB depending on how you set the dip switches.
My board has a CH340G thing to communicate over USB. It can be that your device is not recognized when plugging it into the USB port of your computer. Maybe you have to install the appropriate driver. At first, I thought this was the problem for me, turned it out was NOT.
Dip Switches
Communication mode is set using the dip switches as follows:
ATmega <-> ESP8266 1100000
USB <-> ATmega 0011000
USB <-> ESP8266 0000111 (Update firmware or sketch)
USB <-> ESP8266 0000110
All independent 0000000
As you can see, the first two switches enable communications between both chips. And for USB communication you have to choose either ESP8266 or ATmega.
I read somewhere that when changing dipswitches you have to press ESP reboot. However, I cannot verify this, I believe it worked for me without doing this but honestly, the thing is still a black box to me.
Programming ATmega
When programming the ATmega you have to set dip-switches (3,4) ON and (5,6,7) OFF. Now in the Arduine IDE I select the Arduino UNO as the board. Make sure you select the right COM port, you can check by unplugging the USB from your computer and putting it back in again to see what COM port shows up (you have to exit the menu in between).
When uploading a sketch it gets a bit tricky. Here it helps if you go to Arduino->Preferences and set Show verbose output during: upload. Now, when you hit the upload button you wait for the first few (red) lines (overriding baudrate for me) of the upload to show up in the console. If these show up you press the red reset button. Now it should start uploading. If it shows an error just try again and play a bit with the timing of pressing the reset button.
Programming ESP8266
When programming the ESP8266 you have to set dip-switches (5,6,7) ON and (4,5) OFF. I downloaded the ESP8266 community here board manager and selected Generic ESP8266 module.
Now, before uploading anything you have to reset the board with the red reset button before pressing upload in the IDE. After you upload your code I believe you have to put dip-switch 7 to OFF so that your sketch remains after rebooting the board.
If it looks like it is not working, just wait for it to throw an error and try again. Again pressing the reset before uploading. Maybe throw in an upload without pressing reset before. Setting reset method to no dtr, no_sync also did something for me.
When dip switch 7 is ON I believe the ESP8266 does some kind of factory reset when you reset the board. This will then enable a new sketch to be uploaded.
I am still having problems sometimes uploading to the ESP8266, sometimes it feels like just trying over and over until it works... I think by default the LED is turned on (this LED is on PIN 14 in case you want to play with it).
ERROR MESSAGES
I solved this with above protocol:
esptool.FatalError: Failed to connect to ESP8266: Timed out waiting for packet header
Notes
Using mac
I hope this turns out useful for someone. If I got anything wrong or anyone has other useful insights please let me know in the comments.