====== Talleres en UPAYAKUWASI - Cayambe, Ecuadro ====== ===== Contenido ===== - Introducción de los espacios (upayakuwasi-un/loquer) - Presentación de participantes y expectativas - Uso y adaptación a recursos naturales (Caminata por UPAYAKUWASI) - Introducción a electrónica, sensores y actuadores - Control de Entradas y Salidas - ESP8266 - Arduino - Sensor humedad - Sensor temperatura y humedad - Sensor luz - Actuador relevo - Práctica ===== Taller Mujeres ===== http://piratepad.net/unloquerupayakuwasi - Taller en 4 capas - Riego, Automatización Válvulas, Sensores, Plataforma - Primera capa: (Analógico) Ellas dibujan sus huertos, ¿de donde sacan el agua?, ¿cuáles válvulas prenden?, ¿A qué horas?, presentan al resto - Segunda capa: (Automatización abrir cerrar válvulas) Se programan tiempos para abrir válvulas - Tercer capa: (¿qué pasa si llueve?, necesito saber que ya no tengo que regar) Cuáles son los sensores, ¿cómo se programan? - Cuarta capa: (Afinación y plataforma de control) ¿Qué es lo que se llevan? -> Relevo con ESP8266 Cada etapa tiene que tener su presupuesto. ===== Conexión de wifi para raspberrypi vía esp8266 ===== **Por medio del puerto serie** http://pwiatrowski.com/technology/raspberry-pi-zero-esp8266-internet/\\ https://github.com/jeelabs/esp-link\\ **Por medio de SPI** https://oshlab.com/esp8266-raspberry-pi-gpio-wifi/ Proyecto original https://hackaday.io/project/8678/instructions\\ {{https://i0.wp.com/oshlab.com/wp-content/uploads/2016/05/ESP-Pi-WiFi-wiring.jpg?600}} {{http://www.raspberry-pi-geek.com/var/rpi/storage/images/media/images/raspib-gpio/12356-1-eng-US/RasPiB-GPIO_reference.png?600}} {{:proyectos:talleres_esp:20180320_181149.jpg?400}} {{:proyectos:talleres_esp:20180320_181158.jpg?400}} Para instalar el driver en archlinux-arm nos basamos en el paquete https://aur.archlinux.org/packages/esp8089-git/ pero se modifica el PKGBUILD como se muestra a continuación: # Maintainer: Swift Geek # TODO: DKMS _gitname=esp8089 pkgname=$_gitname-git pkgver=2016.08.07 pkgrel=1 pkgdesc="Linux kernel module driver for the ESP8089 WiFi chip" arch=('i686' 'x86_64' 'armv7h' 'armv6h') url="https://github.com/al177/$_gitname" license=('GPL') install=$_gitname.install depends=('linux') makedepends=('git' 'linux-headers') options=(!strip) source=("git+${url}.git") md5sums=('SKIP') pkgver() { cd "$srcdir/$_gitname" git log -1 --format="%cd" --date=short | sed 's|-|.|g' } prepare() { sed -i s/RX_FLAG_HT/RX_ENC_HT/ esp8089/esp_sip.c sed -i s/RX_FLAG_SHORT_GI/RX_ENC_FLAG_SHORT_GI/ esp8089/esp_sip.c } build() { cd "$srcdir/$_gitname/" make modules M=../$_gitname CONFIG_ESP8089=m gzip -f esp8089.ko } package() { cd "$srcdir/$_gitname/" install -Dm644 esp8089.ko.gz "$pkgdir/usr/lib/modules/$(uname -r)/kernel/drivers/net/wireless/esp8089.ko.gz" #depmod -a $(uname -r) } una vez instalado el paquete se instala el módulo con ''sudo modprobe esp8089'' Para configurar la red inalámbrica se usa ''netctl'' como dice acá https://raspberrypi.stackexchange.com/questions/7987/wifi-configuration-on-arch-linux-arm#7992 /etc/netctl# install -m640 examples/wireless-wpa wireless-home /etc/netctl# cat wireless-home Description='A simple WPA encrypted wireless connection' Interface=wlan0 Connection=wireless Security=wpa IP=dhcp ESSID='MyNetwork' # Prepend hexadecimal keys with \" # If your key starts with ", write it as '"""' # See also: the section on special quoting rules in netctl.profile(5) Key='WirelessKey' # Uncomment this if your ssid is hidden #Hidden=yes Luego arranque el servicio ''# netctl start wireless-home'' FIXME Tenemos problemas con la asignación de dirección ip por dhcpd, relacionado con timeouts\\ https://wiki.archlinux.org/index.php/Netctl#Troubleshooting\\ https://bbs.archlinux.org/viewtopic.php?pid=1399842#p1399842\\ https://archlinuxarm.org/forum/viewtopic.php?f=31&t=5424\\ FIXME ===== RTC digital por medio de la libreria Time para ESP8266 ===== Básicamente la libreria funciona por alarmas y temporizadores. Una **Alarma** es una tarea que ocurre a determinada hora del día. Mientras que un **temporizador** es una tarea programada que ocurré **después** de que haya pasado algún intervalo de tiempo. [[https://github.com/PaulStoffregen/TimeAlarms|repositorio]] Muy importante recordar que en vez de usar el delay(algunvalor) de Arduino, se debe usar el de la libreria alarm. De esta manera: Alarm.delay(algunvalor) #include #include int pin = D1; int hora, minutos; int alarma; void setup() { Serial.begin(9600); hora = 8; minutos = 1; //fijamos el tiempo el Domingo 25 de marzo del 2018 a las 1:40 pm setTime(hora,0,0,3,25,18); //Creamos las alarmas Alarm.alarmRepeat(hora,minutos,0,prenderSensorRiegoManana); // 8:30am cada día Alarm.alarmRepeat(hora,minutos + 3,0,apagarSensorRiegoManana); // 8:30am cada día //Alarm.alarmRepeat(17,45,0,EveningAlarm); // 5:45pm cada día //Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm); // 8:30:30 cada sabado //alarma = 15; //Alarm.timerRepeat(alarma, Repeats); // Timer cada 15 segundos //Alarm.timerOnce(10, OnceOnly); // Llamado una vez despues de 10 segundos pinMode(pin, OUTPUT); digitalWrite(pin, LOW); } void loop() { digitalClockDisplay(); Alarm.delay(1000); } // funciones para llamar cuando se dispara una alarma void prenderSensorRiegoManana(){ Serial.println("Alarm: - turn lights on"); digitalWrite(pin, HIGH); } void apagarSensorRiegoManana(){ Serial.println("Alarm: - turn lights off"); digitalWrite(pin, LOW); } void EveningAlarm(){ Serial.println("Alarm: - turn lights on"); } void WeeklyAlarm(){ Serial.println("Alarm: - its Monday Morning"); } void ExplicitAlarm(){ Serial.println("Alarm: - this triggers only at the given date and time"); } void Repeats(){ Serial.println("Activo la Alarma"); digitalWrite(pin, HIGH); Alarm.delay(5000); digitalWrite(pin, LOW); Alarm.delay(1000); } void OnceOnly(){ Serial.println("This timer only triggers once"); } void digitalClockDisplay() { // digital clock display of the time Serial.print(hour()); printDigits(minute()); printDigits(second()); Serial.println(); } void printDigits(int digits) { Serial.print(":"); if(digits < 10) Serial.print('0'); Serial.print(digits); } void prendaSensor(){ pinMode(pin, HIGH); } void apagueSensor(){ pinMode(pin, LOW); } ===== Código para activar algo desde una página web con ESP8266 ===== Este código genera una página web para controlar el encendido o apagado de algún dispositivo. #include const char* ssid = "UPAYAKUWASI"; const char* password = "nosotrxs"; int ledPin = D1; // GPIO13 WiFiServer server(80); void setup() { Serial.begin(115200); delay(10); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Start the server server.begin(); Serial.println("Server started"); // Print the IP address Serial.print("Use this URL to connect: "); Serial.print("http://"); Serial.print(WiFi.localIP()); Serial.println("/"); } void loop() { // Check if a client has connected WiFiClient client = server.available(); if (!client) { return; } // Wait until the client sends some data Serial.println("new client"); while(!client.available()){ delay(1); } // Read the first line of the request String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); // Match the request int value = LOW; if (request.indexOf("/LED=ON") != -1) { digitalWrite(ledPin, HIGH); value = HIGH; } if (request.indexOf("/LED=OFF") != -1) { digitalWrite(ledPin, LOW); value = LOW; } // Set ledPin according to the request //digitalWrite(ledPin, value); // Return the response client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); // do not forget this one client.println("");https://processing.org/download/ client.println(""); client.print("

Su dispositivo ahora esta:

"); if(value == HIGH) { client.print("On"); } else { client.print("Off"); } client.println("

"); client.println(""); client.println("
"); client.println(""); delay(1); Serial.println("Client disonnected"); Serial.println(""); }