http://piratepad.net/unloquerupayakuwasi
¿Qué es lo que se llevan? → Relevo con ESP8266
Cada etapa tiene que tener su presupuesto.
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
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 '""<key>"' # 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
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
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.
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 <Time.h>
#include <TimeAlarms.h>
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);
}
Este código genera una página web para controlar el encendido o apagado de algún dispositivo.
#include <ESP8266WiFi.h>
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("<!DOCTYPE HTML>");https://processing.org/download/
client.println("<html>");
client.print("<h1>Su dispositivo ahora esta: </h1>");
if(value == HIGH) {
client.print("On");
} else {
client.print("Off");
}
client.println("<br><br>");
client.println("<a href=\"/LED=ON\"\"><button>Prender </button></a>");
client.println("<a href=\"/LED=OFF\"\"><button>Apagar </button></a><br />");
client.println("</html>");
delay(1);
Serial.println("Client disonnected");
Serial.println("");
}