Supongo que para cualquiera que haya leído algunos de los artículos de esta serie debería de tener claro que no pretenden ser unas instrucciones sobre como hacer un nodo de bajo consumo en Lora, tampoco un sitio del que coger un código para pegarlo en tu IDE y tener un dispositivo funcionando. Lo que pretendo es ir documentando los puntos en los que me he atascado y las soluciones. Cualquiera que haya intentado algo parecido lo apreciará, porque el desarrollo es bastante sencillo y una parte importante del tiempo te la pasas resolviendo problemas que te atascan.
Y este es uno que posiblemente merezca la pena resaltar, porque de un problema «tonto» de concepto tenemos unos síntomas esotéricos.
Tal como comentaba en artículos anteriores es absurdo que tengamos un micro en deep sleep con un consumo de 20uA pero que los sensores estén consumiendo energía la mayor parte del tiempo. La solución es alimentar los sensores solo cuando sea necesario para realizar una lectura y mantenerlos sin alimentación el resto del tiempo. Podríamos alimentarlos conectando el pin de alimentación a uno de los GPIO, poner el GPIO en nivel alto solo cuando necesitemos leer y en nivel bajo el resto del tiempo. Lamentablemente los GPIO del ESP8266 no son capaces de proporcionar la corriente necesaria.
A la búsqueda de soluciones lo primero que pensé es en utilizar un transistor, Lamentablemente cuando el transistor estuviera en saturación habría una caída de tensión entre el colector y el emisor. Como norma general no es un problema una caída de 600 a 900 mV, pero trabajando a 3,3V y alimentando un sensor, 2,4V sería insuficiente. (Más info sobre el transistor trabajando en saturación).
La segunda opción fué utilizar mosfets, pero antes de que me pusiera a mirar la forma de hacerlo pensé ¿Porqué no utilzar una puerta lógica (buffer) que si que soportara la corriente necesaria?
Buscando buscando vi varias, pero todas tenían unos valores de consumo en reposo bastante altos (de 5 a 10 uA, es muy poco, pero alto comparado con nuestros objetivos), encontré el NC7SV34P5X un buffer de ultra bajo consumo que tiene una corriente de reposo de solo 0,9uA. Lamentablemente su encapsulado más grande es SC70 no se ve ni con lupa. Independientemente de esto lo he pedido y he conseguido conectarlo a la placa de prototipos, he conectado al alimentación, el GND, la entrada al GPIO10 y la salida a los pines de alimentación de los sensores (Ultrasonidos y temperatura).
Una vez conectado todo ha dejado de funcionar!!, en la consola de depuración solo aparecía una cadena con basura. He puesto el terminal a 74880 baudios que es lo que utiliza mi ESP en el arranque y he visto que el boot mode era 1 (el que se utiliza para subir los programas) . Normalmente para poner el boot mode en 1 lo que se hace es poner el GPIO0 a nivel bajo, por lo que he hecho una investigación en esa línea.
Si recordáis, el GPIO0 lo habíamos usado para el termómetro, pruebo, lo desconecto y arranca. La situación es bastante inexplicable, pero al final caigo. Intuitivamente pensaba en alimentar cuando necesitara, pero un buffer tiene dos niveles Alto y bajo, es decir, no solo alimenta cuando está a nivel alto, también conecta con GND cuando está a nivel bajo, El GPIO0 lleva una resistencia de pullup de 10K para mantenerlo a nivel alto, el DS18B20 (el termómetro) lleva una resistencia de pullup para el bus de 4,8K (entre el positivo y la línea que usa para comunicar). Al poner la alimentación del DS18B20 a nivel bajo y ser la resistencia de pullup del bus onewire menor que la de pullol del GPIO0 el GPIO0 acaba puesto a nivel bajo. Con el GPIO0 a nivel bajo lo que espera el micro es que le suban un programa.
Intuitivamente he asumido que es lo mismo tener la alimentación de los sensores a nivel bajo que tenerla sin alimentar, pero no es lo mismo. Lo que necesito es una puerta triestado con la que tenga la posibilidad de poner la salida en modo de alta impedancia, que sería lo mismo que no tener conectada la corriente.
En la misma serie que la que he utilizado, la que necesito es la NC7SV34P5X (aqui el datasheet)