O problema: o ESP-01 tem apenas dois GPIO disponíveis: GPIO0 e GPIO2 e ambos são usados no processo de boot do chip.
Por que é tão limitado ?
O meu melhor palpite é que ele não foi mesmo feito para isso. Quando o ESP-01 surgiu não existia essa facilidade que temos hoje para programá-lo diretamente. O fabricante do módulo, AI Thinker, criou um firmware que respondia a comandos AT e esse módulo foi criado para basicamente dar Wi-Fi a um projeto usando outro microcontrolador, como um Arduino. O módulo não precisava de GPIO para isso e o microcontrolador podia se comunicar por TX e RX e controlar seu status e até resetá-lo através dos pinos RST e CH_PD.
Para usar como saídas
Qualquer que seja o caso é recomendável que você tenha resistores de pull-up em ambos e assim o sinal ativo seja “LOW”.
Você pode usar ambos GPIO0 e GPIO2 como saídas, mas eu só recomendo no momento para LEDs e para i2C. GPIO2 especificamente é o TX da “hardware UART” na inicialização e por isso “pisca”. Acionar um relê com ele pode não ser uma boa ideia. GPIO0 parece ser seguro para relês mas ainda não estou certo disso.
Eu costumo usar assim e até agora não notei nenhum problema. Alguns recomendam colocar um pull-up de 4k7 ou 3k3 em paralelo com cada conjunto, mas ainda não vi real necessidade para isso:
Para usar como entrada
Se qualquer um dos dois pinos estiver em nível baixo o ESP8266 poderá não inicializar. Você pode contornar o problema usando um dos GPIO como saída para ativar o uso do outro como entrada conforme mostra o último exemplo desta página, que é muito confuso por isso refiz assim:
Durante o boot não importa se a chave S1 está aberta ou fechada, os resistores manterão GPIO0 e GPIO2 em nível alto. Quando rodar o programa você coloca GPIO2 como saída e em nível baixo, assim:
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
Agora GPIO0 pode ser HIGH ou LOW dependendo da posição da chave. E assim você ganha uma entrada.
Mas o modo mais simples e “seguro” de ter uma entrada no ESP-01 é usar o pino RX da serial. Ele pode ser “liberado” no sketch com uma linha assim:
Serial.begin(115200,SERIAL_8N1,SERIAL_TX_ONLY);
É claro que você não vai poder transmitir nada para esse sketch, mas vai poder receber normalmente pela serial.
Outro modo, mais complicado, de expandir a capacidade de I/O do ESP-01 é usando i2C. Basta um chip como o PCF8574 para transformar GPIO0 e GPIO2 em até oito entradas/saídas perfeitamente usáveis.