   
   // 1. each cell cools down a bit
   for( i=0; i != NUM_LEDS; ++i){
+    // copy heatmap to old heatmap for interpolation
+    heat_old[i] = heat[i];
     heat[i] = qsub8(heat[i], random8(0, COOLING));
   }
   
   // 2. now heat drifts up (a lot) and sideways (a bit)
-  for( uint8_t y=COLS-1; y != 2; --y){
+  for( uint8_t y=COLS-1; y != 0; --y){
     for( uint8_t x=0; x != ROWS; ++x){
       i = xy2i(x,y);
-      heat_sum = 2*(uint16_t)heat[xy2i(x,y-1)] + 4*(uint16_t)heat[xy2i(x,y-2)];
+      heat_sum = 4*(uint16_t)heat[xy2i(x,y-1)];
+      if(y != 1){
+        heat_sum += 2*(uint16_t)heat[xy2i(x,y-2)];
+      }
       if(x != 0){
         heat_sum += heat[xy2i(x-1,y-1)];
       }

  }
}

void ColourLeds(){
  // Calculate the proper LED colours
  for(uint8_t i=0; i!=NUM_LEDS; ++i){
    // apparently palette works best if max is 240
    leds[i] = ColorFromPalette( gPal, scale8(heat[i],240));
  }
}


  // (0,0) is bottom-left corner; x is right; y is up
  // LED string snake starts at (0,0) and goes up first
  //so x always increases, but y alternates between + and -
  if(x%2 == 0){
    // In the 'even' rows (first row is x=0), y increases
    return ROWS*x + y;
