Ok, let's jump in:
Challenge/problem #1 - I wanted to use just an ESP8266 module instead of an Arduino + ESP8266 with piezos
I learned that the ESP8266 has only 1 analog (ADC) pin, and if you have the ESP-01, it's 'hard to access'. I needed 2 analog pins because I needed to interface with 2 piezos (1 for the washing machine, 1 for the dryer). I did come across this cool little device, but it seemed like it would be a lot of trouble though. This whole challenge was going to be too much for me, so I abandoned the idea of just using a single ESP-01 module. I decided to go with an Arduino + ESP8266 (for Internet/network connectivity)
Challenge/problem #2 - Another problem with working with the piezos
If you read my main post, you'll know that I had a couple issues with the piezos. There was another problem that I didn't mention in that post. During the beginning of my developing this project, I would test things with my Arduino plugged into the USB port of my computer. However, when I would move everything to my washer/dryer to test without a computer (so when the Arduino ran 'standalone'), the piezos would behave strangely. They basically seemed like they weren't sensing any vibrations. If you want to know more, I posted about this problem on the Arduino forum:
In a nutshell, I tried several things - such as changing voltages, power supplies, using the AREF pin on the Arduino, etc with the help of the good people at the Arduino forum. Additionally, I was having problems also because of a loose resistor from moving things around too much. Eventually I just decided not to use piezos.
Challenge/problem #3 - 2 I2C devices with the same address?
Ok, this wasn't really a challenge or a problem so much, but I wanted to mention it briefly. When you're using I2C devices (like the accelerometers I used), you can't have 2 devices with the same address. With the particular accelerometers I was using (the Adafruit LIS3DH Triple-Axis accelerometers), you can change the address of it in hardware by connecting 'SDO' to 3.3V. This changes the address from 0x18 to 0x19.
Challenge/problem #4 - Button debouncing
There is some button debouncing of course because this project has buttons. However, when I had a delay(250); at the end of the sketch, the buttons didn't really seem to need debouncing strangely enough. In fact, when I did have debouncing code with that delay, the buttons became very unreliable. But, when I took out the delay completely, the accelerometers seemed to have been hyper-sensitive. So, I played with the delay some more, and found that 50 seems like a good number - good for the debouncing/button code, and for the accelerometer sensitivity.
Challenge/problem #5 - Text alerts
This one was a really annoying problem I had, and one I did not see coming. It should have been simple - having ATT for my cell provider, it should have just been a matter of sending an email to email@example.com for example. Not!
Sending an email to an address such as the above works just fine if you're actually in the Gmail interface, but never goes through when using the Huzzah/SMTP2Go combo. I'm not good enough to write my own code to send an email, so I was at the mercy of someone else's code which requires the free SMTP2Go service. It actually works great, but just has that issue of not being able to send through to addresses like I mentioned above for email-to-text. I looked into, and tried many different alternatives such as:
- Sending from a 'real' email address such as firstname.lastname@example.org. The problem with this is the same as with the Gmail - it doesn't actually go through (no error message, the text message just never comes through)
- Using a distribution list such as Google Groups. I didn't fully try this - it was going to be too much of a hassle such as setting up a new account, the group, etc.
- Using a distribution list such as MailChimp. The problem with this is they don't accept recipients with texting domains (such as @txt.att.net).
- Set up an email forwarding address with my hosting company. Same problem - never went through.
- GMail filter/forward - this was the winner. It wasn't exactly simple/quick - you have to set up rules to forward, and create a new forwarding address, but it works. So when my GMail email account receives an email with certain words in the subject line, it forwards to my texting address. Again, not exactly ideal, but it wasn't complicated and it works.
I'd like to find a better/easier solution, but at least for now, it's working. Oh, by the way, I'm not sure why the texts never come through in the circumstances described above, but when I did some searching, it sounds like that it's a combination of the way that the code sends an email and the fact that I'm not really sending through a real domain - there's no proper reverse DNS, so the mail servers are rejecting it.
Challenge/problem #6 - Static IP
I had problems with the Huzzah not letting me assign a static IP, even though I had the code in there to set the IP (at least I thought I did). It would just keep using DHCP for assigning itself an IP. The fix was a bit strange - the line WiFi.config(ip, gateway, subnet); needs to be AFTER the line WiFi.begin(ssd, password).
I didn't even have the WiFi.config(ip, gateway, subnet); line in the code at all. Additionally, I had the one line in the function that sends the email so I wasn't getting the static IP until it would send an email. Priorly it just uses DHCP. I moved both of the aforementioned lines into the setup() loop and it started working - it gets the specified IP right off the bat.
Challenge/problem #7 - No 'CC' in the email function
This one wasn't a big deal really, but I thought I'd mention it. I thought that in order to send the email to a 2nd recipient, you just add a 'CC' line of code. Wrong. Just add another one of these lines:
client.print("RCPT To: email@example.com");
Challenge/problem #8 - Bug!
For some reason, sometimes after sending the email notification, the LED would turn itself off. This is not supposed to happen - it's supposed to only turn off with the user pressing the 'reset' button. I tried changing all kinds of code all over the place but it wasn't helping.
It took a long time for me to figure it out. I posted the problem on the Arduino forums, and a very smart person said to add serial.print(); lines in EVERY location where the LED is turned off and/or on. So after more testing, I finally found the problem - there was a 'blinkLEDWhileMachineIsRunning' immediately after the 'notifyRepeatWasherOrDryerIsDone' line. Well, I never intended this line to run after sending the email, so I added a 'return' to jump out of the current 'if/else' block of code!
Moral of the story? Don't use serial.println(); sparingly - use them everywhere! And don't underestimate the power of those lines when writing/debugging code.
Challenge/problem #9 - Accelerometer orientation
Sometimes when in my 'lab' and also in the garage (where my washer/dryer is located), one or both accelerometers would go crazy sometimes and act like it's picking up very fast constant vibrations. I eventually figured out that it seemed to be dependent on their orientation. If it was leaning too much to 1 or more sides, it would go nuts. If it was orientated correctly (the top of it was actually the top, and not leaning too much to 1 side), it would be ok.
Challenge/problem #10 - Accelerometer sensitivty woes
This is the worst one I think because it took so long to figure out. During all my testing, I had problems with the sensitivity of the accelerometers. When adjusting the sensitivity on 1 or both, It was like I didn't adjust one of them. For example, if I adjusted the threshhold for the dryer, it seemed to have made no difference. I banged my head against the wall for a couple of months on this one, but you know what?! It turned out to be me - I was the problem! I had the accelerometers mixed up in code like a doofus. Once I had corrected it, the 'calibration' of sensitivity for both accelerometers went wonderfully!
Challenge/problem #11 - Cramped space
I wish I had a larger project box because trying to stuff all the circuitry and wires into the box was not working too well. I ended up shortening several of the wires, and swapping out some of the wires with stranded (more flexible) wire. I originally used all solid core wire. In the future, I will probably use stranded wires for projects that need to fit in a box.
Well, that's about it. I hope this set of challenges/problems helps you for either duplicating this project or some other project you may have.