Finding a low cost CO2 sensor has been a challenge.
Looking on digikey or element14, all of the commercial sensors start at $130 and go up from there...
Unlike all of the cheap MQ-series sensors, which cost <$10 each, the MG-811 CO2 sensor is around $40-50, requires a high impedence op-amp, and generally requires calibration. The MG-811 is a solid electrolyte sensor, so the base voltage can vary over time (however the change in voltage with CO2 concentration remains quite stable).
The better CO2 sensors are the NDIR type - Non-Dispersive Infrared Sensor.
These are generally quite stable over long periods without requiring re-calibration.
Searching for NDIR sensors, I found the MH-Z14 from Winsen Sensor. It operates from 5V, has PWM and Analog outputs, as well as a serial UART interface.
5V isn't suitable for the ESP8266 UART but level shifters could be used.
However, looking at the Winsen website, I also found the MH-Z19. Similar to the MH-Z14, it operates from 5V power, but has 3.3V signal levels. Perfect. Best of all, it's only $35!
The UART interface looks pretty simple. There are three commands: get reading, calibrate zero point and calibrate span. I have no idea what the span calibration does yet.
Data packet sent to get reading is 9 bytes in length. Fixed 0xFF start byte, sensor address (0x01 default), followed by command byte, then zero padded until the last byte which is a checksum value.
Returned data is: fixed 0xff start byte, command byte echo'd, Reading high byte, Reading low byte, 0x47 (fixed? not sure what this is), zero padding, checksum.
I've got one ordered, so will post more details once I get it up and running.