Using HY28B / Texy 2.8 TFT with Raspbian Jessie 2017-04-10

I have been lazy… I admit…I havent updated my Pis in over a year!

So, with great eager I started yesterday, by downloading the latest Rasbian 2017-04-10 image thinking, well, this will be quick (:
How wrong was I!  I only just finished up with the first one!

 

Why this long? Well, the underpants-devs (aka linux developers = pimply guys sitting in their underpants in their mom’s basement) again went and changed a tonne of stuff without updating the docs and tutorials we all rely on. Fuck you linux devs… fuck you

 

Anyway, figured I’ll document what worked for me – maybe it helps someone else with the HY28B, Texy 2.8, or other ILI9325 based TFTs

 

  1. Write a fresh SD with the latest Rasbian Jessie (This worked with 2017-04-10… if the underpants-devs have their way, please consider this already broken, again) (fuck you underpants-devs)
  2. Put a blank file called ‘ssh’ in the boot partition before you eject the SD.   Yip those underpants-kids figured they’ll vent some of their anger about all the teasing at school, on you, by disabling SSH until you do! Urrrg.  “security” “iot” fuck… Anyway, if Rasbian sees /boot/ssh it enables SSH…
  3. Once finally booted up, SSH into the Pi
  4.  sudo nano /boot/config.txt
  5. add a new overlay:
     dtoverlay=hy28b,rotate=90,resetgpio=25,ledgpio=18
  6. Edit the kernel command line
    sudo nano /boot/cmdline.txt
  7. at the end of the line, add:
     fbcon=map:10 fbcon=font:VGA8X8
  8. Change the font:
    sudo dpkg-reconfigure console-setup
  9. Go through the following menu choices:
    Encoding to use on the console: <UTF-8>
    Character set to support: <Guess optimal character set>
    Font for the console: Terminus (default is VGA)
    Font size: 6×12 (framebuffer only)
  10. Install packages needed for touch
    sudo apt-get update
    sudo apt-get install libts-bin evtest xinput
  11. Install the ‘evdev’ touch drivers
     sudo apt-get install xserver-xorg-input-evdev
  12. To calibrate the touch panel for non-X based use
    sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event0 ts_calibrate
  13. Edit
    sudo nano /usr/share/X11/xorg.conf.d/99-fbturbo.conf

    and change the line

    Option "fbdev" "/dev/fb0"

    to

    Option "fbdev" "/dev/fb1"
  14. Enable X Windows
    sudo raspi-config
  15. Enable boot to GUI
  16. Reboot
  17. At this point the Desktop should launch in the TFT but touch calibration will be way messed up
  18. Install calibration tool:
    sudo apt-get install -y xinput-calibrator
  19. Change the input driver to evdev
    sudo nano /usr/share/X11/xorg.conf.d/40-libinput.conf
  20. At the bottom, look for the section dealing with “touchscreen” (ie ignore touchpad, pointer and keyboard)
  21. In the touchpad section, change the driver to evdev
  22. Section "InputClass"
     Identifier "libinput touchscreen catchall"
     MatchIsTouchscreen "on"
     MatchDevicePath "/dev/input/event*"
     #commented out# Driver "libinput"
     Driver "evdev"
    EndSection
  23. Reboot
  24. When the UI comes up, use a mouse to open a terminal and run
    'sudo xinput_calibrator'
  25. Copy the
    Section....EndSection

    output from the terminal and paste in a new file:

    /usr/share/X11/xorg.conf.d/99-calibration.conf

    For Example:

    Section "InputClass"
      Identifier "calibration"
      MatchProduct "ADS7846 Touchscreen"
      Option "Calibration" "338 3879 198 3667"
      Option "SwapAxes" "1"
    EndSection
  26. Reboot one last time.
  27. When it comes up, touchscreen should at last be working!
  28. Install packages needed for Kiosk
     sudo apt-get install -y x11-xserver-utils unclutter
  29. Create/edit the file located here:
    nano /home/pi/.config/lxsession/LXDE-pi/autostart

    So that the file has this in it:

    @lxpanel --profile LXDE-pi
    @pcmanfm --desktop --profile LXDE-pi
    #@xscreensaver -no-splash
    #@point-rpi
    @xset s off
    @xset -dpms
    @xset s noblank
    @sed -i 's/"exited_cleanly": false/"exited_cleanly": true/' ~/.config/chromium/Default/Preferences
    @chromium-browser --incognito --noerrdialogs --kiosk bloggerbrothers.com
    @unclutter -idle 0.1 -root
Advertisements

Raspbian Jessie as OpenHAB + MQTT Server: Part 3: Add Websockets

Nowhere near completely usable, BUT, what IS working so far:

  • Websocket javascript with Paho library subscribes succesfully to the Websocket listener on Mosquitto
  • I can subscribe, and recieve all the published messages on the HAB
  • I am using the data received, to dynamically, and automatically, build up a device tree – it looks at the topic path (remember how a year a ago I wrote a post about why the topic name is important (;  – here you see why – from the topic names i can deduce the entire hierarchy automatically)
  • Clicking any item in the tree brings ip a CONTROL interface – to be extended with sensorvalues, etc
  • The basic concept here is working great – by setting my devices to announce themselves, or response to a broadcast requesting them to announce themselves, I can cut a LOT of configuration out – theoretically I can have a new device connect to MQTT, send the page its name, location, connected devices, what those devices are (switch, dimmer, sensor, or actuator) and the javascript can automagically make a UI for it.  This means you can mostly get away without a server, without a database.

Source being shared here: https://github.com/openhardwarecoza/ESP8266-Sketches/tree/master/htt-websocket-esp8266

mqtt

Raspbian Jessie as OpenHAB + MQTT Server: Part 2: Add OpenHAB

I’ll be very brief on Part 2:  Since I already wrote extensively on the install and configuration:

sudo apt-get update
 sudo apt-get install oracle-java8-jdk
sudo update-java-alternatives -s jdk-8-oracle-arm-vfp-hflt
wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' | sudo apt-key add -
echo "deb http://dl.bintray.com/openhab/apt-repo stable main" | sudo tee /etc/apt/sources.list.d/openhab.list
sudo apt-get update
sudo apt-get install openhab-runtime
sudo service openhab status
sudo service openhab start

See https://openhardwarecoza.wordpress.com/2015/03/29/openhab-mqtt-arduino-and-esp8266-part-1-setting-up-your-environment/ for more details on configuring OpenHAB

 

Raspbian Jessie as OpenHAB + MQTT Server: Part 1: Add Websockets!

My home automation system has been running stable for well over a year, but the versions of the software in use have started to show age.   For that matter, the hardware too.   I have been using an old Cubieboard A10 board to run OpenHAB +Mosquitto on, and lately, its been needing a reboot every now and then to keep on working

The friendly folks at FabCreator.com donated a new Raspberry Pi 3 to the LaserWeb project, so with that upgrade, I now have a spare Raspberry Pi B+ available (no longer in use for LaserWeb development) so I decided to repurpose this old B+ into a new OpenHAB+Mosquitto server.  Also, in the year or so since my last install, Mosquitto now comes with WebSocket support.  This is something I REALLY want to play with – would help a lot for adding quick dashboards onto the HAB (Not HAB – as in Home Automation Bus…  not OpenHAB – with WebSockets I can choose to listen in on the MQTT layer, and either just display updates, or also send MQTT messages to the broker, and in turn to the devices or the OpenHAB server. )

So, here we go:

1.  I downloaded Rasbian Jessie from Raspberrypi.org

2.  I burned it to an SD card with Win32DiskImager and booted up the Raspberry Pi B+

3.  Next, I configured a static IP, and did some standard setup (expand filesystem, allocate memory for headless use, overclock to medium, etc)

Install Mosquitto with WebSocket Support

The version of Mosquitto in the RPi repos doesnt support Websockets, so first we need to add a Repo from mosquitto.org, then install Mosquitto

wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients

Note: At the time of writing this gave me  Mosquitto version 1.4.9 (build date Fri, 03 Jun 2016 09:02:12 +0100)

Enable Websocket Support

Open the Mosquitto config in your favourite editor

sudo nano /etc/mosquitto/mosquitto.conf

By default, mosquitto comes without any listeners.  We want to add two listeners:  one standard MQTT protocol listener on port 1883,    and a second listener on port 1884 (for the Websocket protocol)

Your config file should look something like this:  Once done, save and exit.

mqttconf

 

 

 

 

 

 

 

 

 

 

 

 

Restart mosquitto:

sudo service mosquitto restart

If you want to confirm that worked, run:

sudo netstat -nlp | grep mosquitto

ports

 

 

 

 

As you can see in the screenshot above, both :1883 and :1884 are listening (:

Now, if you are anything like me, you’re probably anxious to test that newfound feature first right? Lets test that Websocket Connection!
But i’m also lazy, so lets test it without a single line of code (;

Head over to http://mitsuruog.github.io/what-mqtt/

Enter your local Websocket IP and connect. Subscribe and publish – see if it works (: – mine did! First try, this went easier than I expected

mqtttest

SMW3D OpenCNC

Check out my collection on Google Plus: https://plus.google.com/collection/ERlkgB for more details!

 

16 - 1 (1)

New Design: Open Source Pick and Place Machine

My newest machine design!

Sticking to my usual folded sheetmetal methodology:

See https://github.com/openhardwarecoza/PickAndPlaceMachine

 

pickandplace.png

 

ESP8266 With PIR and DHT11

/*
 Basic ESP8266 MQTT example

 This sketch demonstrates the capabilities of the pubsub library in combination
 with the ESP8266 board/library.
m
 It connects to an MQTT server then:
  - publishes "hello world" to the topic "outTopic" every two seconds
  - subscribes to the topic "inTopic", printing out any messages
    it receives. NB - it assumes the received payloads are strings not binary
  - If the first character of the topic "inTopic" is an 1, switch ON the ESP Led,
    else switch it off

 It will reconnect to the server if the connection is lost using a blocking
 reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to
 achieve the same result without blocking the main loop.

 To install the ESP8266 board, (using Arduino 1.6.4+):
  - Add the following 3rd party board manager under "File -> Preferences -> Additional Boards Manager URLs":
       http://arduino.esp8266.com/stable/package_esp8266com_index.json
  - Open the "Tools -> Board -> Board Manager" and click install for the ESP8266"
  - Select your ESP8266 in "Tools -> Board"

*/

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"

#define DHTPIN 13     // what digital pin we're connected to
// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

// Update these with values suitable for your network.

const char* ssid = "openhardwarecoza";
const char* password = "novell1234";
const char* mqtt_server = "192.168.1.13";
int counter = 0;
int previousReading = LOW;



WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network18
  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");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is acive low on the ESP-01)
  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  pinMode(12, INPUT);
  dht.begin();
}

void loop() {

    if (!client.connected()) {
      reconnect();
    }
    client.loop();

    long now = millis();
    if (now - lastMsg > 5000) {
      lastMsg = now;
      float h = dht.readHumidity();
      // Read temperature as Celsius (the default)
      float t = dht.readTemperature();
         
      // Check if any reads failed and exit early (to try again).
      if (isnan(h) || isnan(t)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
      }
    
      // Compute heat index in Celsius (isFahreheit = false)
      //float hic = dht.computeHeatIndex(t, h, false);
      char t2[50];
      char h2[50];
      dtostrf(t, 5, 2, t2);
      dtostrf(h, 5, 2, h2);
      
      client.publish("/sensor/temp", t2 );  
      client.publish("/sensor/humidity", h2 );
    }

    int reading = digitalRead(12);

    Serial.println(reading);
    if (previousReading == LOW && reading == HIGH) {
    counter++;
    client.publish("/sensor/movement", "Motion!");  
    delay(1000);

    }
    previousReading = reading;

  
}